单片机
返回首页

单片机按键扫描程序状态机方法

2021-07-09 来源:eefocus

简介:设定一个定时器中断,每隔10MS 扫描一次按键。,读取值。。如果多个按键,又有多余的定时器,可以试试这个方法,效率高了。搞STM32 刚好。 cool.


#define key_input PIND.7 // 按键输入口

#define key_state_0 0

#define key_state_1 1

#define key_state_2 2


char read_key(void)

{

static char key_state = 0;

char key_press, key_return = 0;


key_press = key_input; // 读按键I/O电平

switch (key_state)

{

case key_state_0: // 按键初始态

if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态

break;

case key_state_1: // 按键确认态

if (!key_press)

{

key_return = 1; // 按键仍按下,按键确认输出为“1”

key_state = key_state_2; // 状态转换到键释放态

}

else

key_state = key_state_0; // 按键已抬起,转换到按键初始态

break;

case key_state_2:

if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态

break;

}

return key_return;

}


另外一个原则就是设计的中断服务函数执行时间应该尽量的短。这样假如系统中使用多个中断的话,就是不采用中断嵌套的方式,也能够保证系统能够及时响应各个中断的请求。


所以我喜欢在定时中断中只使用一个标志变量,这样中断服务函数执行时间是最快的,就不会阻塞其它中断的及时响应,而在主程序中判断标志变量,然后再去扫描按键。尽管此时扫描的间隔已经不是严格意义上的10ms,或多或少都有一些延误,而且延误也是不确定的,但都不会影响按键扫描的正确性(一个按键的过程至少在300ms以上)。


设定一个定时器中断,每隔10MS 扫描一次按键。,读取值。。如果多个按键,又有多余的定时器,可以试试这个方法,效率高了。搞STM32 刚好。 cool.


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章