/*
按键扫描函数
1、判断有没有按键按下
2、判断按下的是哪一个按键 --- 返回按键键值
3、判断按键是否松开 -- 按键松开 + key_flag = 1
形参:u8 mode SINGLE:按键单次触发 COUNTINUE:按键长按
返回值:u8 返回的按键键值
函数说明:单次触发就是只能触发一次,比如现在灯是灭的,你按下去松手后,灯一定是亮的,
而按键长按就是会一直触发,等你松手时灯不一定是亮还是灭的
就是用flag这个标志位实现的,单次触发,标志位置1,如果不松手对标志位清零就不能出现进入这个判断
而按键长按会一直进入判断
*/
u8 key_scan(u8 mode)
{
static u8 key_flag = 0;
if(mode == SINGLE)//单次触发
{
if((KEY1 || !KEY2 || !KEY3 || !KEY4) && key_flag == 0)//判断按键是否按下
{
//按键消抖,延时不能给太长
delay_ms(20);
key_flag = 1;//证明按键按下
//判断按下的是哪一个按键
if(KEY1)
{
return 1;
}
if(!KEY2)
{
return 2;
}
if(!KEY3)
{
return 3;
}
if(!KEY4)
{
return 4;
}
}
else if((!KEY1 && KEY2 && KEY3 && KEY4) && key_flag == 1)//判断按键是否松开
{
key_flag = 0;
}
}
else if(mode == COUNTINUE)//长按触发
{
if((KEY1 || !KEY2 || !KEY3 || !KEY4))//判断按键是否按下
{
//按键消抖,延时不能给太长
delay_ms(20);
//判断按下的是哪一个按键
if(KEY1)
{
return 1;
}
if(!KEY2)
{
return 2;
}
if(!KEY3)
{
return 3;
}
if(!KEY4)
{
return 4;
}
}
}
//按键没有按下返回0
return 0;
}