單片機(jī) 矩陣鍵盤實(shí)驗(yàn) 實(shí)驗(yàn)報(bào)告_第1頁(yè)
單片機(jī) 矩陣鍵盤實(shí)驗(yàn) 實(shí)驗(yàn)報(bào)告_第2頁(yè)
單片機(jī) 矩陣鍵盤實(shí)驗(yàn) 實(shí)驗(yàn)報(bào)告_第3頁(yè)
單片機(jī) 矩陣鍵盤實(shí)驗(yàn) 實(shí)驗(yàn)報(bào)告_第4頁(yè)
單片機(jī) 矩陣鍵盤實(shí)驗(yàn) 實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)驗(yàn)五矩陣鍵盤實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1、編寫程序,做到在鍵盤上每按一個(gè)數(shù)字鍵(0-F)用發(fā)光二極管將該代碼顯示出來(lái)。按其它鍵退出。2、加法設(shè)計(jì)計(jì)算器,實(shí)驗(yàn)板上有12個(gè)按鍵,編寫程序,實(shí)現(xiàn)一位整數(shù)加法運(yùn)算功能??啥x“A”鍵為“+”鍵,“B”鍵為“=”鍵。二、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)獨(dú)立式按鍵的查詢識(shí)別方法。2、非編碼矩陣鍵盤的行反轉(zhuǎn)法識(shí)別方法。三、實(shí)驗(yàn)說(shuō)明1、MCS51系列單片機(jī)的P0~P3口作為輸入端口使用時(shí)必須先向端口寫入“1”。2、用查詢方式檢測(cè)按鍵時(shí),要加入延時(shí)(通常采用軟件延時(shí)10~20mS)以消除抖動(dòng)。3、識(shí)別鍵的閉合,通常采用行掃描法和行反轉(zhuǎn)法。行掃描法是使鍵盤上某一行線為低電平,而其余行接高電平,然后讀取列值,如讀列值中某位為低電平,表明有鍵按下,否則掃描下一行,直到掃完所有行。行反轉(zhuǎn)法識(shí)別閉合鍵時(shí),要將行線接一并行口,先讓它工作在輸出方式,將列線也接到一個(gè)并行口,先讓它工作于輸入方式,程序使CPU通過(guò)輸出端口在各行線上全部送低電平,然后讀入列線值,如此時(shí)有某鍵被按下,則必定會(huì)使某一列線值為0。然后,程序?qū)蓚€(gè)并行端口進(jìn)行方式設(shè)置,使行線工作于輸入方式,列線工作于輸出方式,并將剛才讀得的列線值從列線所接的并行端口輸出,再讀取行線上輸入值,那么,在閉合鍵所在行線上的值必定為0。這樣,當(dāng)一個(gè)鍵被接下時(shí),必定可以讀得一對(duì)唯一的行線值和列線值。由于51單片機(jī)的并口能夠動(dòng)態(tài)地改變輸入輸出方式,因此,矩陣鍵盤采用行反轉(zhuǎn)法識(shí)別最為簡(jiǎn)便。行反轉(zhuǎn)法識(shí)別按鍵的過(guò)程是:首先,將4個(gè)行線作為輸出,將其全部置0,4個(gè)列線作為輸入,將其全部置1,也就是向P1口寫入0xF0;假如此時(shí)沒(méi)有人按鍵,從P1口讀出的值應(yīng)仍為0xF0;假如此時(shí)1、4、7、0四個(gè)鍵中有一個(gè)鍵被按下,則P1.6被拉低,從P1口讀出的值為0xB0;為了確定是這四個(gè)鍵中哪一個(gè)被按下,可將剛才從P1口讀出的數(shù)的低四位置1后再寫入P1口,即將0xBF寫入P1口,使P1.6為低,其余均為高,若此時(shí)被按下的鍵是“4”,則P1.1被拉低,從P1口讀出的值為0xBE;這樣,當(dāng)只有一個(gè)鍵被按下時(shí),每一個(gè)鍵只有唯一的反轉(zhuǎn)碼,事先為12個(gè)鍵的反轉(zhuǎn)碼建一個(gè)表,通過(guò)查表就可知道是哪個(gè)鍵被按下了。四、接線方法鍵盤連接成4×4的矩陣形式,占用單片機(jī)P1口的8根線,行信號(hào)是P1.0-1.3,列信號(hào)是P1.4-1.7。五、實(shí)驗(yàn)電路參考學(xué)習(xí)板說(shuō)明書(shū)P14。六、參考程序程序一:/***************************************************************功能:4*4矩陣鍵盤,LED顯示所按的鍵作者:txl時(shí)間:2009-04版本:V1.0***************************************************************/#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitwei1=P2^0;ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共陽(yáng)數(shù)碼管碼表//全局變量ucharnum,temp,num1;//函數(shù)聲明voiddelay(uintz);ucharkeyscan();voiddisplay(ucharaa);voidmain(){ num=1;wei1=0; P0=0xC0; while(1) { display(keyscan()); }}voiddisplay(ucharaa){ P0=table[aa-1]; }ucharkeyscan(){ P1=0xfe; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xee:num=1; break; case0xde:num=2; break; case0xbe:num=3; break; case0x7e:num=4; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xed:num=5; break; case0xdd:num=6; break; case0xbd:num=7; break; case0x7d:num=8; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xeb:num=9; break; case0xdb:num=10; break; case0xbb:num=11; break; case0x7b:num=12; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xe7:num=13; break; case0xd7:num=14; break; case0xb7:num=15; break; case0x77:num=16; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } }returnnum;}voiddelay(uintz){ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}程序二:#include<REG51.H>#defineU8unsignedchar#definekey_portP1codeU8kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};//反轉(zhuǎn)碼對(duì)應(yīng)鍵值0123456789ABcodeU8disp[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff};U8buf[4]={0,0,0,0};U8cnt=0;U8scn[]={0x7f,0xbf,0xdf,0xef};//先點(diǎn)亮左邊一個(gè)數(shù)碼管voiddelay_ms(U8ms){ U8i,j; for(i=0;i<100;i++) {for(j=0;j<ms;j++);};}U8key(void){ U8a,r; delay_ms(20); //延時(shí)20毫秒,消除按鍵抖動(dòng) if(key_port==0xf0)gotorn; a=key_port; key_port=a|0x0f; delay_ms(20); a=key_port; for(r=0;r<=11;r++) {if(a==kcode[r])break;}; if(r>11)r=0xff; //0xff表示無(wú)效rn: key_port=0xf0; returnr;}voidmain(void){ U8k,i,pf; //pf為按過(guò)加號(hào)鍵的標(biāo)志 intp,p1,p2, //p1,p2為兩個(gè)加數(shù),p為和 TMOD=0x01; //設(shè)定時(shí)器0為模式1(16位) TH0=0xee; //晶振11.0592MHz,5mS TL0=0; TR0=1; //開(kāi)始計(jì)數(shù) EA=1; //允許中斷 ET0=1; //定時(shí)器0中斷允許 key_port=0xf0; pf=0; //清除加號(hào)標(biāo)志 p=0; delay_ms(20); while(1) //循環(huán) {if(key_port!=0xf0) {k=key(); if(k<10) {if((p1==0)&&(p2==0))for(i=0;i<=3;i++)buf[i]=0;//清空顯示緩沖區(qū) elsefor(i=1;i<=3;i++)buf[i-1]=buf[i];//數(shù)字左移一位 buf[3]=k;//在個(gè)位顯示剛按的數(shù)字 if(pf==0)p1=p1*10+k; elsep2=p2*10+k; } else {if(pf==1) { p=p1+p2; p1=1000; for(i=0;i<3;i++) {buf[i]=p/p1; p=p-p1*buf[i]; p1=p1/10; } buf[3]=p; p=0; p1=0; p2=0; pf=0; } else { pf=1; p2=0; for(k=0;k<=3;k++)buf[k]=0; } } while(key_port!=0xf0);//等待按鍵抬起 delay_ms(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論