目录
测试平台:STM32G431RBT6
按键处理
按键:机械按键(需消除抖动影响)或触摸按键
按键按下为低电平,按键弹起为高电平
开发板上四个按键分别对应
B1------PB0
B2------PB1
B3------PB2
B4------PA0
按键消抖
思路:
在while(1)中循环
1:读取P33的状态。
2:如果是0,则等待10ms,再读取P33的状态;
如果不是0,返回第一步。
3:如果第二步满足,还是0,确定有按键按下,则执行number++程序,让数码管+1;
如果不是0,则说明是抖动,则不执行任何程序,返回第一步。
4:等待按键弹起后,再等待10ms,那么则可以返回第一步重复执行循环;
(如果不等待的话,则会在循环1—3会一直执行,让数字疯狂+1)(手一直按在按键上不松开))。
代码:
key.c
#define HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define KEYPORT KB1 | (KB2<<1) | (KB3<<2) | (KB4<<3) | 0xf0
unsigned char Trg;
unsigned char Cont;
void Key_Read(void)
{
unsigned char ReadData = (KEYPORT)^0xff; //1
Trg = ReadData & (ReadData ^ Cont); //2
Cont = ReadData; //3
}
//该按键函数使用了定时器,10ms执行一次
//Trg为单次触发,cont为长按判断
//异或^,不同即为1 0x00&任何值均为0
HAL_GPIO_ReadPin io读取函数
Trg: 单次触发 Cont:长按判断
KEYPORT 设置为八位的变量, | 0xf0 将前四位置为1,后四位设置为依次设置为KB4-1
这样做是为了当B1按下时变量变为0xfe,即可知道按键1按下,以此类推
每10ms执行一次,假如无按键按下
进入函数中ReadData的值为0x00,在第一步中异或0xff后仍为0x00
第二步赋值Trg为ReadData 按位与 ()后仍是0x00
第三步cont赋值ReadData
假如第一个按键按下
进入函数中ReadData的值0xfe,在第一步中异或0xff后为0x01
第二步赋值Trg为ReadData按位与(0x01异或0x00(没有按下按键时赋值为0x00)=(0x01按位与0x01)=0x01
第三步再将ReadData的值0x01复制给cont
main.c
__IO uint32_t keyTick;
void KEY_Process(void)
{
if(uwTick - keyTick <10) return ;
keyTick = uwTick ;
Key_Read ();
if(Trg & 0x01)
{
LED_Control (0x01);
}
if(Trg & 0x02)
{
LED_Control (0x02);
}
if(Trg & 0x04)
{
LED_Control (0x04);
}
if(Trg & 0x08)
{
LED_Control (0x08);
}
}
结合系统定时器进行延时