51单片机应用行列反转法操纵矩阵键盘
生活随笔
收集整理的這篇文章主要介紹了
51单片机应用行列反转法操纵矩阵键盘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
應用行列反轉法操縱矩陣鍵盤
??行列反轉法的簡單實用,我自己整理了一下,分享給大家。根據開發板原理圖可知,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 intuchar 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=0x00001111l=P3&0X0f; //l為低四位,即行if(l!=0x0f) //如果按鍵被按下,此時執行if循環{delayms(10); // 延時10毫秒,目的是消抖if(l!=0x0f) //再次檢測是否按下{l=P3&0x0f; //此時低四位確定,即某一行有按鍵被按下了}}P3=0xf0; //P3=0X11110000h=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]) //算出in=i;}}void display() //顯示函數{dula=1;P0=table[n];dula=0;P0=0xff; //目的是消影wela=1;P0=0xfe;wela=0;delayms(5);}?
?實驗現象如下:
?
????????
總結
以上是生活随笔為你收集整理的51单片机应用行列反转法操纵矩阵键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java map的理解_java中的ha
- 下一篇: JAVA 成员访问权限修饰符