下面是独立按键驱动程序,特点是利用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; } } }