51微控制器應用行列反轉法操縱矩陣鍵盤
阿新 • • 發佈:2019-02-17
應用行列反轉法操縱矩陣鍵盤
行列反轉法的簡單實用,我自己整理了一下,分享給大家。根據開發板原理圖可知,P3口接為矩陣鍵盤,其中P3.0~P3.3接行線,P3.4~P3.7接列線,P0口接共陰極6段數碼管。
圖 1
反轉法的原理:反轉法就是通過給微控制器的埠兩次賦值,最後得出所按鍵的值的一種演算法。具體操作如下:
1.我們給P3口賦值0x0f,即00001111,假設S6鍵(TX開發板中,S6鍵相當於第一個按鍵)按下了,則這時P3口的實際值為00001110;
2.我們給P3口再賦值0xf0,即11110000,如果S6鍵按下了,則這時P3口的實際值為11100000;
3.我們把兩次P3口的實際值相加 得11101110,即0xee。 由此我們便得到了按下S6鍵時所對應的數值0xee,以此類推可得出其他15個按鍵對應的數值,有了這種對應關係,對應關係見圖2.
圖2
以下為程式: 反轉法矩陣鍵盤的應用,通過按下矩陣按鍵,使數碼管第一位(0xFE)顯示數值,是我自己敲的可執行的程式,拿來與大家共享
#include<reg52.h> #define ucharunsigned char #define uintunsigned int uchar n,key; sbit dula=P2^6; sbit wela=P2^7; void delayms(uint xms); //延時函式 void keyscan() ; //按鍵掃描函式 void display(); //數碼管顯示函式 uchar code table[]={ //數碼管的顯示程式 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code jian[]={ //矩陣按鍵顯程式 0xee,0xDe,0xbe,0X7e, 0Xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77}; void main() //主函式 { while(1) { keyscan(); //執行按鍵掃描函式 display(); //執行數碼管顯示函式 } } void delayms(uint xms) //延時函式 { uint i,j; for(i=xms;i>0;i--) i=xms,也就是xms毫秒 for(j=110;j>0;j--); } void keyscan() //按鍵掃描函式 { uchar l,h,i; //l為第四位,h為高四位 P3=0x0f; 令P3=0x00001111 l=P3&0X0f; //l為低四位,即行 if(l!=0x0f) //如果按鍵被按下,此時執行if迴圈 { delayms(10); // 延時10毫秒,目的是消抖 if(l!=0x0f) //再次檢測是否按下 { l=P3&0x0f; //此時低四位確定,即某一行有按鍵被按下了 } } P3=0xf0; //P3=0X11110000 h=P3&0Xf0; //h為高四位,即列 if(h!=0xf0) //如果按鍵有被按下 { delayms(10); //延時 if(h!=0xf0) { h=P3&0xf0; //此時得出高四位,即列 } } key=l+h; //相加確定出某一個按鍵被按下 for(i=0;i<16;i++) //查詢i,確定i的值。目的是接下來對應到數碼管的哪一位 { if(key==jian[i]) //算出i n=i; } } void display() //顯示函式 { dula=1; P0=table[n]; dula=0; P0=0xff; //目的是消影 wela=1; P0=0xfe; wela=0; delayms(5); }
實驗現象如下: