主函数中扫描该函数即可,需要注意按键按下时程序会停留在该函数中,知道松手或时间到0.8s,大于0.8秒为长按,小于为短按,可以自己根据需要修改,初始化函数因板子而异,这里就不列出来了
u8 KEY_N; //在头文件中声明一下外部变量,用于主函数中判断哪个按键按下
u8 KEY_Scan(void) //返回值temp代表按键按下的时间(=temp*10 MS)
{
static u8 flag=1;
u8 temp=0;
if(flag==1)
{
if(KEY1_IN==0) //下面四个按键相似操作
{
flag=0;
while(KEY1_IN==0&&temp<85)
{
temp++;
Delay_Ms(10);
}
KEY_N=1;
return temp;
}
if(KEY2_IN==0)
{
flag=0;
while(KEY1_IN==0&&temp<85)
{
temp++;
Delay_Ms(10);
}
KEY_N=2;
return temp;
}
if(KEY3_IN==0)
{
flag=0;
while(KEY1_IN==0&&temp<85)
{
temp++;
Delay_Ms(10);
}
KEY_N=3;
return temp;
}
if(KEY4_IN==0)
{
flag=0;
while(KEY1_IN==0&&temp<85)
{
temp++;
Delay_Ms(10);
}
KEY_N=4;
return temp;
}
}
if(KEY1_IN==1&&KEY2_IN==1&&KEY3_IN==1&&KEY4_IN==1)
{
flag=1;
KEY_N=0;
}
return 0;
}
还有就是怎么利用上面这个扫描函数实现按键长按时某个量连续增减,下面以时钟的小时位长按连加为例:
从上面扫描函数代码中可以看到当按键按下时间到0.85s程序就会返回了,也就是主程序会往下执行了,但是KEY_N还不为0,直到按键松开后才会变为0,所以在主函数中就可以通过判断这个变量来判断按键是否松开,未松开则每隔50ms自增一次,延时不能太短,不然眼睛看不出来。
while(KEY_N)
{
Time_Hour++;
if(Time_Hour==24) Time_Hour=0;
sprintf((char*)LCD_String," %d:%d:%d ",Time_Hour,Time_Min,Time_Sec);
LCD_DisplayStringLine(Line3 ,LCD_String);
Delay_Ms(50);
KEY_Scan();
}