單片機矩陣鍵盤的C語言程序與分析_第1頁
單片機矩陣鍵盤的C語言程序與分析_第2頁
單片機矩陣鍵盤的C語言程序與分析_第3頁
單片機矩陣鍵盤的C語言程序與分析_第4頁
單片機矩陣鍵盤的C語言程序與分析_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 #include <reg52.h>#define uchar unsigned char #define uint unsigned int #define key_io P2/ 0 1 2 34 5 6 7 8 9uchar code smg_du=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar code smg_we=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;uchar dis_smg8;uchar key_can ;uchar num;void delay_1ms(uin

2、t q)uint i,j;for(i=0;i<q;i+)for(j=0;j<120;j+);void dis()uchar i;for(i=0;i<3;i+)P0 = 0xff;P1 = smg_wei;P0 = dis_smgi;delay_1ms(1); void key_4()key_io = 0x0f;key_can = 10;if(key_io != 0x0f)delay_1ms(1);if(key_io != 0x0f)switch(key_io & 0x0f)case 0x0e: key_can = 1; break;case 0x0d: key_can

3、 = 2; break;case 0x0b: key_can = 3; break;case 0x07: key_can = 4; break;while(key_io != 0x0f)key_io = key_io | 0x0f;dis();void smg_dis()if(key_can = 1)num+;/if(num >= 20)/num = 20;dis_smg0= smg_dunum % 10;dis_smg1= smg_dunum / 10 % 10;dis_smg2= smg_dunum / 100 % 10;if(key_can = 2)/if(num != 0)num

4、-;dis_smg0= smg_dunum % 10;dis_smg1= smg_dunum / 10 % 10;dis_smg2= smg_dunum / 100 % 10;void main()while(1)key_4();dis();if(key_can < 5)smg_dis();51單片機矩陣鍵盤的C語言程序與分析學習51單片機矩陣鍵盤時,我有點迷亂了,不知道是怎樣處理的,經(jīng)過仔細分析電路,然后終于明白其中的原理,這樣的話,再看程序,就是那樣的簡單了。首先看一下電路圖是怎樣連接的,我買的開發(fā)板上是AT89S52單片機,矩陣鍵盤在P3口。接法如下圖:當然上面的圖的意思是P3.1

5、P3.3 跟P3.4P3.7不一樣的,他們是相互連接(當按下鍵時),組成4*4=16個鍵的。如果給P3一個掃描初值的話:如0x0F ,則沒有鍵按下時為:P3.1P3.3為1,P3.4P3.7為0。如果有鍵按下,則情況發(fā)生變化:高電平接入低電平:如P3.3與P3.7連接的鍵按下,則P3.3與P3.7為0,即接地了。則P3此時為:0000 0111,這時如果用P3&0x0F,則高四位為0,低四位保留,可以得到低四位的內(nèi)容了。通過去抖操作,即一個delay,可以得到低四位內(nèi)容。這里設為:h=P3&0x0F;如果再得到高四位內(nèi)容,則可以組成一個數(shù),來定位哪個鍵了。用P3=h|0xF0;

6、這會出現(xiàn)什么情況呢?1|0=1   1| 1 =1,這里難道高四位全置1 嗎?不是的,當賦值后,如果有鍵按下的話,P3高四位不會全為1111,被拉到0了。如P3.3與P3.7連接的鍵按下,則P3.3與P3.7為0,即接地了。 即:0111 0111,&F0之后,得到0111 0000,這樣的話,我們得到高四位的值了,用高四位+低四位,就可以得到一個數(shù)值,確定一個鍵。下面看看人家編寫的程序,相信不是太難了吧。/keyboard.c   這里的行與列的掃描,也就是把字節(jié)的8位,高四位與低四位分開來,從而確定坐標。/行列掃描程序,可以自己定義端口和掃描

7、方式,這里做簡單介紹#include <reg52.h>/包含頭文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,                    0x77,0x7c,0x39,0x

8、5e,0x79,0x71;/0-F,數(shù)碼管來顯示按下鍵的值。uchar keyscan(void);            /主要的矩陣鍵盤掃描函數(shù)。void delay(uint i);void main()uchar key;P2=0x00;/1數(shù)碼管亮 按相應的按鍵,會顯示按鍵上的字符while(1)key=keyscan();/調用鍵盤掃描,switch(key)case 0x7e:P0=dofly0;break;/0 按下相應的鍵顯示相對應的碼值 原理就是高四位一列低四位一列

9、的組/合。0111    1110 7e    0表示按鍵后為0,1表示沒有按鍵按下的。即P3.7與P3.1連接為低電平,為S1鍵/其他類推。case 0x7d:P0=dofly1;break;/1case 0x7b:P0=dofly2;break;/2case 0x77:P0=dofly3;break;/3case 0xbe:P0=dofly4;break;/4case 0xbd:P0=dofly5;break;/5case 0xbb:P0=dofly6;break;/6case 0xb7:P0=dofly7;break;/7cas

10、e 0xde:P0=dofly8;break;/8case 0xdd:P0=dofly9;break;/9case 0xdb:P0=dofly10;break;/acase 0xd7:P0=dofly11;break;/bcase 0xee:P0=dofly12;break;/ccase 0xed:P0=dofly13;break;/dcase 0xeb:P0=dofly14;break;/ecase 0xe7:P0=dofly15;break;/fuchar keyscan(void)/鍵盤掃描函數(shù),使用行列反轉掃描法 比如:行為低電位,列為高四位uchar cord_h,cord_l;/行

11、列值P3=0x0f;            /行線輸出全為0cord_h=P3&0x0f;     /讀入列線值if(cord_h!=0x0f)    /先檢測有無按鍵按下delay(100);        /去抖if(cord_h!=0x0f)    cord_h=P3&0x0f; /讀入列線值    P3=cord_h|0xf0; /輸出當前列線值    cord_l=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論