日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...

發(fā)布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

按鍵可以說是51單片機項目開發(fā)的一個重要組件了,它是作為51單片機IO口輸入的一種重要方式。我們可以通過按鍵控制單片機執(zhí)行相應(yīng)的程序,得到我們想要得效果。51單片機的按鍵輸入主要有兩種,一種是獨立按鍵,每個按鍵對應(yīng)一個IO口,通過循環(huán)或者中斷去檢測,這種方法常用于按鍵個數(shù)較少得時候。如果按鍵的個數(shù)較多,每個按鍵都分配一個IO口,會占用大量的資源,所以就有了矩陣鍵盤。矩陣鍵盤是通過單片機掃描鍵盤的每行每列,通過行和列唯一確定按鍵的編號,下面對這兩種方法進(jìn)行介紹。

1 獨立按鍵

Proteus仿真電路圖

圖中按鍵通過P1.0~P1.3輸入,四個LED燈連接P.0~P2.3,不同按鍵按下,對應(yīng)不同的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產(chǎn)生一次中斷,num加一,再while循環(huán)中判斷num=20時候,也就是計時20ms,讀取P1的狀態(tài),通過判斷P1的值判斷是那個按鍵按下,點亮對應(yīng)的LED燈。效果圖如下:

獨立按鍵很簡單,想必大家有比我這更好的例子(比如加上消抖),今天的重點時矩陣鍵盤。

2 矩陣鍵盤檢測

Proteus仿真電路圖

這里將16個按鍵按照4*4排列,矩陣鍵盤的每一行分別連接P3.0~P3.3;矩陣鍵盤的每一列連接P3.4~P3.7。掃描的原理大致是這樣的:先將P30置零,其余都為1(P3-0xfe),然后讀取P3口的狀態(tài),如果P3!=0xfe了(這里主要是高四位會變化,第四位不變),說明有按鍵按下了,而且一定是第一行中的某個按鍵。然后就去判斷P3口的狀態(tài),如果第一個按鍵按下(左上角),那應(yīng)該是P3.4=0,剛才P3.0=0,那么P3口的狀態(tài)就是P3=0xee,以此類推,第一行第二個,第三個,第四個按鍵按下,對應(yīng)P3=0xde, P3=0xbe, P3=0x7e。這樣就可以判斷是哪個按鍵按下了,如果P3=0xfe,就說明第一行沒有按鍵按下,那么同樣的方法,令P3=0xfd,判斷第二行是否有按鍵按下,依次給每一行置零(P3=0xfb,P3=0xf7),讀取列的狀態(tài),判斷是哪個按鍵按下,如果都沒有,說明沒有按鍵按下。

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()是鍵盤掃描函數(shù),主要分為四大部分,每個部分核心都是一樣的,就是實現(xiàn)上述矩陣鍵盤掃描原理,下面拿出第一段介紹:

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出現(xiàn),那么temp一定不等于0xf0,但是這樣還不能直接判斷就是有按鍵按下了,可能是一些干擾,而且按鍵按下時候初期時不穩(wěn)定的,不是一個理想的下降沿,所以需要消抖,其實就是延時10ms再次讀取P3口狀態(tài),如果現(xiàn)在tmep依然不等于0xf0,那么可以判斷有按鍵按下了,然后就可以吧p3幅值給temp,進(jìn)而判斷temp的狀態(tài)了。

然后下面這段程序就是判斷按鍵是否抬起,否則的話會一直在這個循環(huán),無法執(zhí)行其他程序:

while(temp!=0xf0) {temp=P3;temp&=0xf0;}

上述代碼時通過while循環(huán)實現(xiàn)的,也可以中斷實現(xiàn):

#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++; }

核心的內(nèi)容都一樣,就不多解釋了。

總結(jié)

以上是生活随笔為你收集整理的vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。