单片机
返回首页

STM32开发板上实现按键驱动(定时扫描去抖方式)

2023-11-16 来源:elecfans

在万利STM32学习板的USB摇杆例程中,摇杆的按键处理并没有消抖处理,因此重新修改了摇杆的驱动,顺便还增加了两个按键以及摇杆中键下压的驱动,以方便直接使用。只要定时调用(几ms)KyeScan函数,就会将当前按键的改变情况和按住情况保存在对应的变量中。


当某个键按下时,在KeyDown中对应的位被设置为1;某个键被释放时,KeyUp中对应的位为1;KeyPress中保存的是当前按键的按住情况,某位为1时表示对应的键被按住。

KeyDown和KeyUp中的值使用后要手动清除,表示已经处理了这个事件,而KeyPress不用手动清除,它一直反映按键的按住情况。


万利的板子上有两个按键KEY_2和KEY_3,另外还有一个摇杆:KEY_SEL,KEY_LEFT,KEY_RIGHT,KEY_UP,KEY_DOWN,以及摇杆的中键KEY_SEL。为了统一名称,都叫成了KEY。要获取某个按键的信息,只要跟对应的宏进行与操作即可,实际使用方法参考如下:

if(KeyDown & KEY_UP)   //摇杆往上移动键按下

if(KeyDown & KEY_RIGHT) //摇杆往右移动键按下

if(KeyPress & KEY_DOWN) //摇杆往下移动被按住了

if(KeyUp & KEY_LEFT) //摇杆往左移动由原来的按住变成了松开

if(KeyUp || KEY_DOWN) //有按键状态变动

KeyUp &=~(KEY_2); //清除KEY2释放事件

KeyDown&=~(KEY_SEL); //清除摇杆中键按下事件

 

键盘驱动的实际代码如下:

unsigned char KeyCurrent,KeyOld,KeyNoChangedTime;

unsigned char KeyPress;

unsigned char KeyDown,KeyUp,KeyLast;

#define KEY_SEL    0x01

#define KEY_RIGHT 0x02

#define KEY_LEFT   0x04

#define KEY_DOWN   0x10

#define KEY_UP     0x08

#define KEY_2      0x20

#define KEY_3      0x40

#define KeyIO ((((GPIOD->IDR)>>11)&0x1F)|((((GPIOD->IDR)>>3)&0x03)<<5))

void KeyScan(void);

/********************************************************************

函数功能:键盘扫描。每5ms调用一次

入口参数:无。

返    回:无。

备    注:无。

********************************************************************/

void KeyScan(void)

{

//开始键盘扫描

//保存按键状态到当前按键情况

//KeyCurrent总共有8个bit

//当某个开关按下时,对应的bit为1

     

KeyCurrent=~KeyIO;   

 

if(KeyCurrent!=KeyOld) //说明按键情况发生了改变

 {

   KeyNoChangedTime='0';       //键盘按下时间为0

   KeyOld='KeyCurrent';        //保存当前按键情况

   return;

 }

else

 {

   KeyNoChangedTime++;         //按下时间累计

   if(KeyNoChangedTime>=1)     //如果按下时间足够

   {

    KeyNoChangedTime='1';

    KeyPress='KeyOld';      //保存按键

    KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键

    KeyUp|=KeyLast&(~KeyPress);     //求出新释放的键

    KeyLast='KeyPress';            //保存当前按键情况

   }

 }

}


在调用键盘扫描函数之前,记得先对相应的I/O口初始化为高阻输入模式,摇杆连接在PD11~15上,KEY2、KEY3连接在PD3、PD4上。


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

  • SOC系统级芯片设计实验

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

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

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

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

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

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

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

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

    相关电子头条文章