本次介绍按键模板,由原理图可知,当按键按下时对应引脚为低电平。
将上一次的工程打开,将PB0,PB1,PB2,PA0设置为GPIO_INPUT模式,然后生成打开工程。
四个按键的读取采用宏定义形式,采用这种形式KEY1-4就等于这个函数本身的返回值。最后定义KEY时一定要在后面加括号将后面部分全部括起来,如果不加可能由于优先级而出现问题。另外注意按键对应的引脚。
#define KEY1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define KEY2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define KEY4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define KEY (KEY1|(KEY2<<1)|(KEY3<<2)|(KEY4<<3)|0xf0)
然后是变量定义
u8 Trg;//长按时为0
u8 Cont;//长按时为1
u32 KeyTick;
然后是代码部分
void Key_Scan(void)
{
u8 ReadData=Key^0xff;
Trg=ReadData&(ReadData^Cont);
Cont=ReadData;
}
void Key_Pro(void)
{
if(uwTick-KeyTick<10)return;
KeyTick=uwTick;
Key_Scan();
if(Trg&0x01)//按键1按下
{
}
if(Trg&0x02)//按键2按下
{
}
if(Trg&0x04)//按键3
{
}
if(Trg&0x08)//按键4
{
}
}
其中uwTick是一个变量,不需要你定义,每一ms加1;用这个变量可以实现很多功能,代替定时器计时。if(uwTick-KeyTick<10)return;KeyTick=uwTick;这两句代码可以实现每10ms运行一次按键代码,实现消抖。
然后我们仿真看看效果
只将Key_Pro函数放进while里,编译仿真
右击Trg,Cont这两个变量,点击add 这一选项可以添加这个变量到一个窗口查看他的值。
当我们长按按键1时,Cont=0x01,长按按键2Cont = 0x02,以此类推。
但是Trg为0x00,因为长按时Trg只会变化一次,然后变回0x00;
利用这两个变量可以实现短按,长按检测。
void Key_Pro(void)
{
if(uwTick - KeyTick < 10)return;
KeyTick = uwTick;
Key_Scan();
if(Trg&0x01)
{
LED |= 0x02;
}
if(Trg&0x02)
{
}
if(Trg&0x04)
{
}
if(Trg&0x08)
{
}
}
将代码修改如上。按下按键1时LED2点亮,实验成功。