11.3.3Key_Scan按键扫描函数
按键程序设计思路可以非常简单:想要知道某个按键是否被按下,只需检测连接到改按键的IO引脚是高电平还是低电平,若是低电平,说明按键正处于被按下的状态。
通过使用R_IOPORT_PinRead函数,我们可以获取某个IO引脚的电平状态。R_IOPORT_PinRead函数原型如下:
左右滑动查看完整内容
fsp_err_tR_IOPORT_PinRead(ioport_ctrl_t*constp_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 表示按键没有按下
*/
#defineKEY_ON 1
#defineKEY_OFF 0
/* 按键扫描函数(阻塞式)
* key: KEY1_SW2_PIN 用户按键 1(丝印 SW2)的引脚
* KEY2_SW3_PIN 用户按键 2(丝印 SW3)的引脚
*/
uint32_tKey_Scan(bsp_io_port_pin_tkey)
{
bsp_io_level_tstate;
// 读取按键引脚电平
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
if(BSP_IO_LEVEL_HIGH == state)
{
returnKEY_OFF;//按键没有被按下
}
else
{
do//等待按键释放
{
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
}while(BSP_IO_LEVEL_LOW == state);
}
returnKEY_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 开发板,两个按键引脚定义 */ #defineKEY1_SW2_PIN BSP_IO_PORT_00_PIN_04 #defineKEY2_SW3_PIN BSP_IO_PORT_00_PIN_05 /* 启明 4M2 开发板,两个按键引脚定义 */ #defineKEY1_SW2_PIN BSP_IO_PORT_04_PIN_03 #defineKEY2_SW3_PIN BSP_IO_PORT_04_PIN_04 /* 启明 2L1 开发板,两个按键引脚定义 */ #defineKEY1_SW2_PIN BSP_IO_PORT_00_PIN_01 #defineKEY2_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 状态
}
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
11.4下载验证
将程序编译并下载到开发板之后,按下复位按键来复位开发板。
然后按下用户按键1可以控制LED1灯的亮灭;按下用户按键2则可以控制LED2灯的亮灭。
-
引脚
+关注
关注
16文章
2098浏览量
55180 -
程序
+关注
关注
117文章
3836浏览量
84772 -
函数
+关注
关注
3文章
4406浏览量
66874
发布评论请先 登录
按键扫描Key_Scan中为什么设2个变量
为什么自有key_scan()==1有用,而key_scan()==2没有起作用?求解释?
3*4按键扫描这样行不行
请问if中的按键扫描占用时间吗?
Stm32按键输入的程序步骤有哪些
.单片机开发过程中按键处理函数的实现
单片机按键扫描的一般思路?
STM32按键输入实验的按键优先级和上下拉电阻的配置

Key_Scan按键扫描函数详解
评论