1. 檢測按鍵是否按下,應注意什麼問題(單片機)
檢測按鍵是否按下,一要注意是」消抖「;二要注意按鍵的」抬起「和按下狀態。前者一般加幾十毫秒延時。後者看程序要求,是確定按下後,等待抬起才退出鍵盤檢測,還是直接退出。
2. 單片機鍵盤自檢程序
rans()流程
掃描碼鍵值轉換程序流程第一類按鍵的掃描碼鍵值轉換程序代碼:
if (F0_FLAG) {//接收掃描碼為斷碼
switch (mcu_revchar){//處理控制鍵
case 0x11: agcs_status&=0xF7;break;//左alt釋放
case 0x12: agcs_status&=0xFE;break;//左shift釋放
case 0x14: agcs_status&=0xFD;break;//左ctrl釋放
case 0x58: if(led_status&0x04)
led_status&=0x03;//caps lock鍵
else led_status =0x04;
ps2_ledchange();
break;
case 0x59: agcs_status&=0xEF;break;//右shift釋放
case 0x77: if(led_status&0x02)
led_status&=0x05;//num lock鍵
else led_status =0x02;
ps2_ledchange();
break;
case 0x7E: if(led_status&0x01)
led_status&=0x06;//scroll lock鍵
else led_status =0x01;
ps2_ledchange();
break;
default:break;
}
F0_FLAG = 0;
}
else {//接收掃描碼為通碼
if (led_status & 0x04) caps_flag = 1; else caps_flag = 0;
if (led_status & 0x02) num_flag = 1; else num_flag = 0;
if (scga_status & 0x11) shift_flag = 1; else shift_flag = 0;
file://掃描碼鍵值轉換
if ((caps_flag == shift_flag) (!num_flag))
KeyVal=kb_plain_map\[mcu_revchar\];
else KeyVal=kb_shift_map\[mcu_revchar\];
switch(mcu_revchar){//處理控制鍵或狀態鍵
case 0x11: agcs_status = 0x08;//左alt按下
case 0x12: agcs_status = 0x01;//左shift按下
case 0x14: agcs_status = 0x02;//左ctrl按下
case 0x59: agcs_status = 0x10;//右shift按下
default: break;
}
}第二類按鍵的掃描碼鍵值轉換程序與上相似。要注意的是在退出該程序段時對
E0_FLAG和F0_FLAG標志的清0。
PAUSE鍵的處理程序:如果接收到0xE1,置E1_FLAG=1,然後順次將後續接收到的7
個位元組數據和PAUSE的通碼後7個位元組比較,一致則返回KeyVal=KB_PAUSE。在比較
完所有7個位元組後清除E1_FLAG標志。
鍵盤初始化程序kb_init()流程:
① 上電後,接收鍵盤上電自檢通過信號0xAA,或者自檢出錯信號0xFC。單片機接
收為0xAA,進入下一步,否則,進行出錯處理。
② 關LED指示,單片機發送0xED,然後接收鍵盤回應0xFA,接著發送送0x00接收
0xFA。
③ 設置機打延時和速率。 單片機發送0xF3,接收0xFA,發送0x00
(250ms,2.0cps),接收0xFA。
④ 檢查LED,發送0xED,接收0xFA,發送0x07(開所有LED),接收0xFA。發送0xED,
接收0xFA,發送0x00(關LED),接收0xFA。
⑤ 允許鍵盤發送0xF4,接收0xFA。
鍵盤LED改變ps2_ledchange()函數流程:發送0xED→接收0xFA→發送led_status→接收0xFA。
結語
該驅動程序經Keil uVision2編譯,在AT89C51單片機上運行通過,實現了對PS/2 104鍵盤的支持,以及對字元按鍵大小寫切換,num lock切換,控制鍵及組合按鍵的支持。該程序對其他嵌入式或單片機系統中PS/2鍵盤的應用也有借鑒意義。
3. 51單片機按鍵檢測問題
三個二極體、一個電阻,確實是一個與門。
電阻的計算公式,正確。
二極體的導通電壓、電流,選擇的基本合理。
可以進行實際電路的安裝、測試。
實際上,現在的二極體,發光效率,逐年的提高,已經不用 6mA,就很醒目了。
不同顏色的二極體,導通電壓,也有差異,選用較小的,才利於觸發中斷。
得進行反復實驗,才能完成設計。
在程序中,注意不要使 P3.2 輸出低電平,否則,會有較大的灌電流出現。