下面是独立按键驱动程序,特点是利用TIMER0中断,CPU在不停的扫描程序,60ms到,执行按键驱动,函数在48ms执行一次,60ms再次执行,避免了CPU资源的浪费
bit ltkey = 0; //防止按键被长按
bit am_led = 0;
uchar unitTemp = 0xff;
bit amkey;
bit remsg = 0;
bit send = 0;
bit delay100 = 0;
bit mtoa = 0;
void KeyScn(void) //按键扫描模块
{
uchar NowKeyValue;
bit NowAMKeyValue;
//检测按键
if(pic == 10) //首次按键检测
{
amkey = AMKEY;
unitTemp = P2;
}
if(pic == 13) //12ms后,再次执行检测
{
NowKeyValue = P2;
NowAMKeyValue = AMKEY;
if(NowKeyValue != unitTemp) //如果两次检测到的结果不同,则认为是抖动,不做处理
{
unitTemp = 0xff;
}
if((NowAMKeyValue == amkey) && (amkey == 0)) //如果状态键按键有效
{
if(ltkey == 0)
{ //AM状态LED位,0为自动,1为手动
am_led = !am_led;
if(am_led == 0) //如果是从手动切回自动,切回到CH1
{
unitTemp = 0xf7;
mtoa = 1; //由手动切到自动后的标志位
}
AMLED = am_led; //状态灯,变化时写入
ltkey = 1;
}
}
else
{
ltkey = 0;
}
}
}
