0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Key_Scan按键扫描函数详解

瑞萨嵌入式小百科 来源:野火电子 2025-08-04 14:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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函数,则是用来扫描这4个IO口是否有按键按下。KEY_Scan函数,支持两
    发表于 01-25 10:14

    按键扫描Key_Scan中为什么设2个变量

    本帖最后由 playwife_花 于 2015-1-21 09:04 编辑 疑问:把变量 key_check去掉, key_check = KeyPort和 switch (key_check &= 0x0F)中的chec
    发表于 01-20 14:38

    为什么自有key_scan()==1有用,而key_scan()==2没有起作用?求解释?

    key_scan(){static uchar sta = 1;//设置一个状态,表示按键是否按下,1为抬起if(sta == 1&&(KEY18 == 0||KEY19 == 0|
    发表于 09-06 22:18

    3*4按键扫描这样行不行

    );}//*****************************************************************************************//函数名称:Key_scan()按键
    发表于 02-21 23:54

    请问if中的按键扫描占用时间吗?

    突然发现个问题,我的定时函数中有个IF(KEY_SCAN()!=0),这个按键扫描10MS,那这个IF判断需要10MS吗?我觉得应该需要,但如果需要,我的LED
    发表于 09-06 15:56

    按键处理程序问题

    刚入手stm32,试验按键 程序,但是现在有个问题:,我把代码贴上,大家帮忙看下哈,main函数调用key_scan(),上电后没有按键按下时key
    发表于 03-18 04:35

    MCU按键消抖问题

    函数有响应优先级,KEY_FR_1>KEY_FR_2>KEY_OK>KEY_3!!UINT8 KEY_
    发表于 11-04 06:37

    Stm32按键输入的程序步骤有哪些

    :RCC_APB2PeriphClockCmd();2.初始化IO模式:上拉/下拉输入。调用函数:GPIO_Init();3.扫描IO口电平(库函数/寄存器/位操作)按键
    发表于 01-06 07:43

    键盘扫描静态数码管显示的相关资料推荐

    简单键盘扫描静态数码管显示总结一、矩阵按键扫描程序采用行列翻转扫描void Key_Scan()//行列翻转式
    发表于 01-07 07:29

    3-Key_Scan 风驰STM8开发板程序源代码 例9

    关天STM8 Key_Scan使用程序源代码
    发表于 07-04 17:40 14次下载

    .单片机开发过程中按键处理函数的实现

    **.**单片机开发过程中按键处理函数的实现​ **.**方法一​ 这种方法在单片机处理中反应不够好,当按键交替按时,会表现的不够好​void Key_Scan(void
    发表于 11-13 12:36 16次下载
    .单片机开发过程中<b class='flag-5'>按键</b>处理<b class='flag-5'>函数</b>的实现

    单片机按键扫描的一般思路?

    以下给出三种思路,可以借鉴第一种://按键扫描(支持连续按)u8 KEY_Scan(void){ if(key按下) { delay(10);
    发表于 12-31 19:37 0次下载
    单片机<b class='flag-5'>按键</b><b class='flag-5'>扫描</b>的一般思路?

    跑马灯按键

    =0;i
    发表于 01-13 12:32 1次下载
    跑马灯<b class='flag-5'>按键</b>

    STM32按键输入实验的按键优先级和上下拉电阻的配置

    3,也就是说假如四个按键同时按下,那么只会执行KEY0按键的指令//注意此函数有响应优先级,KEY0>K
    发表于 01-14 14:14 6次下载
    STM32<b class='flag-5'>按键</b>输入实验的<b class='flag-5'>按键</b>优先级和上下拉电阻的配置

    KEY Process按键扫描学习记录

    按键扫描函数 void KEY_Process(void) intkey1_state key2_state
    发表于 03-10 10:25 0次下载
    <b class='flag-5'>KEY</b> Process<b class='flag-5'>按键</b><b class='flag-5'>扫描</b>学习记录