下面是獨立按鍵驅動程序,特點是利用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; } } }