/* 按下 set 鍵,L1 會亮,放開就熄掉。 按下 down 鍵,L2 會亮,放開就熄掉。 按下 mode 鍵,L3 會亮,放開就熄掉。 */ #include "..\..\lib\8000a.h" void ShowLed5(unsigned cnt) { int i; for(i=5;i>0;i--){ Show5DigitLed(i,cnt%10); cnt/=10; } } extern int WDT_Pin; extern unsigned char far *WdtFlag; #if 0 #define SKEY_SET 1 #define SKEY_DOWN 2 #define SKEY_MODE 3 #define SKEY_UP 4 extern unsigned char far * const KeyStatus; #define SKEY_SET_DOWN 0x08 #define SKEY_DOWN_DOWN 0x04 #define SKEY_UP_DOWN 0x02 #define SKEY_MODE_DOWN 0x01 #endif // #define USE_NEW_TIMER void main(int argc,char *argv[]) { int key; unsigned cnt=0; long st; unsigned char OldKeyStatus,ks; int bUseNewTimer=1; int (*_IsSystemKey_)(void); int (*_GetSystemKey_)(void); InitLib(); if(argc>1){ bUseNewTimer=0; } if(bUseNewTimer){ Print("Install New Timer ISR\r\n"); InstallNewTimer(); _IsSystemKey_=IsSystemKey; _GetSystemKey_=GetSystemKey; } else { Print("Use OS Timer ISR\r\n"); _IsSystemKey_=IsSystemKey; _GetSystemKey_=GetSystemKey; } Init5DigitLed(); ShowLed5(cnt); st=GetTimeTicks(); Print("[WDT_Pin=%d,WdtFlag=%p]",WDT_Pin,WdtFlag); EnableWDT(); _asm cli OldKeyStatus=*KeyStatus; _asm sti; while(1){ if(GetTimeTicks()-st>=100){ st+=100; ShowLed5(++cnt); } RefreshWDT(); if(_IsSystemKey_()){ key=_GetSystemKey_(); Print("[key=%X",key); if(key==SKEY_SET) Puts("(SET)]\r\n"); else if(key==SKEY_DOWN) Puts("(DOWN)]\r\n"); else if(key==SKEY_MODE) Puts("(MODE)]\r\n"); else if(key==SKEY_UP) Puts("(UP)]\r\n"); } _asm cli ks=*KeyStatus; // ks=新的狀態 _asm sti; if(ks != OldKeyStatus){ ks ^= OldKeyStatus; // ks = 有改變的按鍵 OldKeyStatus ^= ks; // OldKeyStatus=新的狀態 //ks ^= OldKeyStatus; //兩者交換完畢 if(ks & SKEY_MODE_DOWN){ // MODE 按鍵有變化 Print("[MODE key:%s]\r\n",OldKeyStatus & SKEY_MODE_DOWN ? "DOWN" : "UP"); if(OldKeyStatus & SKEY_MODE_DOWN) SetLedL3(LED_ON); else SetLedL3(LED_OFF); } if(ks & SKEY_UP_DOWN){ // UP 按鍵有變化 Print("[UP key:%s]\r\n",OldKeyStatus & SKEY_UP_DOWN ? "DOWN" : "UP"); } if(ks & SKEY_DOWN_DOWN){ // MODE 按鍵有變化 Print("[DOWN key:%s]\r\n",OldKeyStatus & SKEY_DOWN_DOWN ? "DOWN" : "UP"); if(OldKeyStatus & SKEY_DOWN_DOWN) SetLedL2(LED_ON); else SetLedL2(LED_OFF); } if(ks & SKEY_SET_DOWN){ // SET 按鍵有變化 Print("[SET key:%s]\r\n",OldKeyStatus & SKEY_SET_DOWN ? "DOWN" : "UP"); if(OldKeyStatus & SKEY_SET_DOWN) SetLedL1(LED_ON); else SetLedL1(LED_OFF); } } if(Kbhit()){ break; } } if(bUseNewTimer) RestoreNewTimer(); DisableWDT(); Getch(); }