11.3.3Key_Scan按键扫描函数
按键程序设计思路可以非常简单:想要知道某个按键是否被按下,只需检测连接到改按键的IO引脚是高电平还是低电平,若是低电平,说明按键正处于被按下的状态。
通过使用R_IOPORT_PinRead函数,我们可以获取某个IO引脚的电平状态。R_IOPORT_PinRead函数原型如下:
左右滑动查看完整内容
fsp_err_tR_IOPORT_PinRead(ioport_ctrl_t * const p_ctrl, bsp_io_port_pin_t␣ →pin, bsp_io_level_t * p_pin_value);
说明
通过bsp_io_port_pin_t枚举类型的变量pin传入要读取的IO引脚的端口号和引脚号;
通过bsp_io_level_t枚举类型的指针p_pin_value来获取该IO引脚的电平状态。
bsp_io_level_t枚举类型的定义如下:
列表2:e_bsp_io_level枚举类型定义
左右滑动查看完整内容
/* 可以为单个引脚设置电平和读取电平 */
typedefenume_bsp_io_level
{
BSP_IO_LEVEL_LOW = 0, ///< Low
BSP_IO_LEVEL_HIGH ///< High
} bsp_io_level_t;
Key_Scan按键扫描函数如下:
列表3:
代码清单11-1:Key_Scan按键扫描函数
左右滑动查看完整内容
/* 定义宏 KEY_ON 表示按键按下
定义宏 KEY_OFF 表示按键没有按下
*/
#define KEY_ON 1
#define KEY_OFF 0
/* 按键扫描函数(阻塞式)
* key: KEY1_SW2_PIN 用户按键 1(丝印 SW2)的引脚
* KEY2_SW3_PIN 用户按键 2(丝印 SW3)的引脚
*/
uint32_tKey_Scan(bsp_io_port_pin_t key)
{
bsp_io_level_t state;
// 读取按键引脚电平
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
if (BSP_IO_LEVEL_HIGH == state)
{
return KEY_OFF; //按键没有被按下
}
else
{
do//等待按键释放
{
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
} while (BSP_IO_LEVEL_LOW == state);
}
return KEY_ON; //按键被按下了
}
这是一个简单的按键扫描函数,当调用该函数并且检测到按键被按下的时候,就会在do-while语句里重复检测按键是否被松开,一直到当手松开按键的时候才能跳出循环,并返回KEY_ON数值表明按键被按下;而当按键没有被按下的时候Key_Scan函数则返回KEY_OFF的数值。
值得注意的是,若程序在do-while循环里一直检测到手没有松开按键,则程序会被一直阻塞在这里,因此这是一个阻塞式的扫描函数。
11.3.4hal_entry入口函数
在hal_entry函数里,首先初始化了LED和按键,接着进入了while主循环,在该循环下反复地调用Key_Scan函数对两个用户按键进行实时扫描。若按键1按下,则翻转LED1的状态;若按键2按下,则翻转LED2的状态。
需要注意的是,KEY1_SW2_PIN和KEY2_SW3_PIN宏定义了两个用户按键的引脚,不同的板子按键引脚是不一样的。
左右滑动查看完整内容
/* 启明 6M5 开发板,两个按键引脚定义 */ #define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_04 #define KEY2_SW3_PIN BSP_IO_PORT_00_PIN_05 /* 启明 4M2 开发板,两个按键引脚定义 */ #define KEY1_SW2_PIN BSP_IO_PORT_04_PIN_03 #define KEY2_SW3_PIN BSP_IO_PORT_04_PIN_04 /* 启明 2L1 开发板,两个按键引脚定义 */ #define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_01 #define KEY2_SW3_PIN BSP_IO_PORT_00_PIN_02
hal_entry入口函数如下:
列表4:代码清单11-2:hal_entry入口函数
左右滑动查看完整内容
/* 用户头文件包含 */
#include"led/bsp_led.h"
#include"key/bsp_key.h"
voidhal_entry(void)
{
/* TODO: add your own code here */
LED_Init(); // LED 初始化
Key_Init(); // 按键初始化
while(1)
{
if( Key_Scan(KEY1_SW2_PIN) == KEY_ON ) //扫描按键 1
{
LED1_TOGGLE; //翻转 LED1 状态
}
if( Key_Scan(KEY2_SW3_PIN) == KEY_ON ) //扫描按键 2
{
LED2_TOGGLE; //翻转 LED2 状态
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
11.4下载验证
将程序编译并下载到开发板之后,按下复位按键来复位开发板。
然后按下用户按键1可以控制LED1灯的亮灭;按下用户按键2则可以控制LED2灯的亮灭。
全部0条评论
快来发表一下你的评论吧 !