vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...
按鍵可以說是51單片機項目開發的一個重要組件了,它是作為51單片機IO口輸入的一種重要方式。我們可以通過按鍵控制單片機執行相應的程序,得到我們想要得效果。51單片機的按鍵輸入主要有兩種,一種是獨立按鍵,每個按鍵對應一個IO口,通過循環或者中斷去檢測,這種方法常用于按鍵個數較少得時候。如果按鍵的個數較多,每個按鍵都分配一個IO口,會占用大量的資源,所以就有了矩陣鍵盤。矩陣鍵盤是通過單片機掃描鍵盤的每行每列,通過行和列唯一確定按鍵的編號,下面對這兩種方法進行介紹。
1 獨立按鍵
Proteus仿真電路圖
圖中按鍵通過P1.0~P1.3輸入,四個LED燈連接P.0~P2.3,不同按鍵按下,對應不同的LED燈亮,程序如下:
#include <reg51.h> unsigned char num; void main() {TMOD=0x01;TH0 = (65536-917)/256; //1000/1.09 TL0 = (65536-917)%256;; EA=1;ET0=1;TR0=1;P1=0xff;P2=0x00;while(1){if(num==20){num=0;switch(P1){case ~0x01:P2=~0x01;break;case ~0x02:P2=~0x02;break;case ~0x04:P2=~0x04;break;case ~0x08:P2=~0x08;break;defult:break;}} }}void Timer0() interrupt 1 {TH0 = (65536-917)/256; TL0 = (65536-917)%256; num++; }采用的是定時器0中斷的形式,定時器0每1ms產生一次中斷,num加一,再while循環中判斷num=20時候,也就是計時20ms,讀取P1的狀態,通過判斷P1的值判斷是那個按鍵按下,點亮對應的LED燈。效果圖如下:
獨立按鍵很簡單,想必大家有比我這更好的例子(比如加上消抖),今天的重點時矩陣鍵盤。
2 矩陣鍵盤檢測
Proteus仿真電路圖
這里將16個按鍵按照4*4排列,矩陣鍵盤的每一行分別連接P3.0~P3.3;矩陣鍵盤的每一列連接P3.4~P3.7。掃描的原理大致是這樣的:先將P30置零,其余都為1(P3-0xfe),然后讀取P3口的狀態,如果P3!=0xfe了(這里主要是高四位會變化,第四位不變),說明有按鍵按下了,而且一定是第一行中的某個按鍵。然后就去判斷P3口的狀態,如果第一個按鍵按下(左上角),那應該是P3.4=0,剛才P3.0=0,那么P3口的狀態就是P3=0xee,以此類推,第一行第二個,第三個,第四個按鍵按下,對應P3=0xde, P3=0xbe, P3=0x7e。這樣就可以判斷是哪個按鍵按下了,如果P3=0xfe,就說明第一行沒有按鍵按下,那么同樣的方法,令P3=0xfd,判斷第二行是否有按鍵按下,依次給每一行置零(P3=0xfb,P3=0xf7),讀取列的狀態,判斷是哪個按鍵按下,如果都沒有,說明沒有按鍵按下。
C51代碼: #include <reg51.h> void Delay10ms() //@11.0592MHz {unsigned char i, j;i = 18;j = 235;do{while (--j);} while (--i); } void key_scan() {unsigned char temp;P3=0xfe;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:P2=0x00;break;case 0xde:P2=0x01;break;case 0xbe:P2=0x02;break;case 0x7e:P2=0x03;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}P3=0xfd;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:P2=0x04;break;case 0xdd:P2=0x05;break;case 0xbd:P2=0x06;break;case 0x7d:P2=0x07;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}P3=0xfb;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:P2=0x08;break;case 0xdb:P2=0x09;break;case 0xbb:P2=0x0a;break;case 0x7b:P2=0x0b;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}P3=0xf7;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:P2=0x0c;break;case 0xd7:P2=0x0d;break;case 0xb7:P2=0x0e;break;case 0x77:P2=0x0f;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}}void main() {P2=0x00;while(1){key_scan();} }key_scan()是鍵盤掃描函數,主要分為四大部分,每個部分核心都是一樣的,就是實現上述矩陣鍵盤掃描原理,下面拿出第一段介紹:
P3=0xfe;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:P2=0x00;break;case 0xde:P2=0x01;break;case 0xbe:P2=0x02;break;case 0x7e:P2=0x03;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}首先P3=0xfe,再將P3賦值給temp,temp再與0xf0與運算,如果P3的高四位有0出現,那么temp一定不等于0xf0,但是這樣還不能直接判斷就是有按鍵按下了,可能是一些干擾,而且按鍵按下時候初期時不穩定的,不是一個理想的下降沿,所以需要消抖,其實就是延時10ms再次讀取P3口狀態,如果現在tmep依然不等于0xf0,那么可以判斷有按鍵按下了,然后就可以吧p3幅值給temp,進而判斷temp的狀態了。
然后下面這段程序就是判斷按鍵是否抬起,否則的話會一直在這個循環,無法執行其他程序:
while(temp!=0xf0) {temp=P3;temp&=0xf0;}上述代碼時通過while循環實現的,也可以中斷實現:
#include <reg51.h> unsigned char num; void Delay10ms() //@11.0592MHz {unsigned char i, j;i = 18;j = 235;do{while (--j);} while (--i); } void key_scan() {unsigned char temp;P3=0xfe;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:P2=0x00;break;case 0xde:P2=0x01;break;case 0xbe:P2=0x02;break;case 0x7e:P2=0x03;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}P3=0xfd;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:P2=0x04;break;case 0xdd:P2=0x05;break;case 0xbd:P2=0x06;break;case 0x7d:P2=0x07;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}P3=0xfb;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:P2=0x08;break;case 0xdb:P2=0x09;break;case 0xbb:P2=0x0a;break;case 0x7b:P2=0x0b;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}P3=0xf7;temp=P3;temp&=0xf0;if(temp!=0xf0){delay10ms();temp=P3;temp&=0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:P2=0x0c;break;case 0xd7:P2=0x0d;break;case 0xb7:P2=0x0e;break;case 0x77:P2=0x0f;break;}while(temp!=0xf0){temp=P3;temp&=0xf0;}}}}void main() {TMOD=0x01;TH0 = (65536-917)/256; //1000/1.09 TL0 = (65536-917)%256;; EA=1;ET0=1;TR0=1;P2=0x00;while(1){if(num==2){num=0;key_scan();}} } void Timer0() interrupt 1 {TH0 = (65536-917)/256; TL0 = (65536-917)%256; num++; }核心的內容都一樣,就不多解釋了。
總結
以上是生活随笔為你收集整理的vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 慈善基金会怎么申请
- 下一篇: git 安装包_Git、Tortoise