實驗四 動態(tài)顯示與矩陣式鍵盤實驗 計科17-3BJ 李浩葳_第1頁
實驗四 動態(tài)顯示與矩陣式鍵盤實驗 計科17-3BJ 李浩葳_第2頁
實驗四 動態(tài)顯示與矩陣式鍵盤實驗 計科17-3BJ 李浩葳_第3頁
實驗四 動態(tài)顯示與矩陣式鍵盤實驗 計科17-3BJ 李浩葳_第4頁
實驗四 動態(tài)顯示與矩陣式鍵盤實驗 計科17-3BJ 李浩葳_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實驗四動態(tài)顯示與矩陣式鍵盤實驗一、實驗內(nèi)容1、動態(tài)顯示。 未按鍵不顯示,按K1鍵,動態(tài)顯示“19491001”;按K2鍵,動態(tài)顯示“20141210”。2、動態(tài)顯示與按鍵識別。 矩陣式鍵盤鍵值分別是0-F,未按鍵不顯示。每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。3、可控動態(tài)顯示與按鍵識別。 矩陣式鍵盤鍵值分別是0-9,最下面一排鍵位功能鍵,左右兩個鍵分別為“清0鍵”“C”,和”“回車鍵”“”,其它鍵無效。未按鍵不顯示,每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。按8個鍵后,再按鍵無效。按清0鍵全顯示“0”。按“”后全部熄滅,再按鍵重新開始。二、實驗方案1、總體方案設(shè)計 所用硬件:AT89C52、BUTTON、AND_4、74HC573、RESPACK-8、7SEG-MPX8-CC-BLUE、電源。 外部中斷有4個按鍵K1、K2、K3、K4,分別連接到單片機(jī)P2.0、P2.1、P2.2、P2.3引腳,按鍵后對應(yīng)引腳為低電平,通過4與門連接到P3.2(外部中斷0)。動態(tài)顯示共8個共陰極數(shù)碼管,采用兩片74LS573進(jìn)行驅(qū)動,74LS573與74LS373都是8D鎖存器,只是573引腳排列更易于布線。其引腳功能為:D1-D8為數(shù)據(jù)輸入端;Q1-Q8為數(shù)據(jù)輸出端;LE為數(shù)據(jù)輸入鎖存端,LE=1數(shù)據(jù)輸入D鎖存器,LE=0數(shù)據(jù)不能輸入D鎖存器,即LE下降沿鎖存當(dāng)前輸入數(shù)據(jù);地址輸出允許端,=0輸出鎖存數(shù)據(jù),=1輸出高阻。電路中,U1輸出段碼abcdefgdb,控制顯示的字形與小數(shù)點,U2輸出位選碼,控制第幾個數(shù)碼管顯示。單片機(jī)P14、P15分別連接到U1、U2的LE,連接U1、U2的。軟件設(shè)計:本實驗采用外部中斷和矩陣鍵盤合為同一個程序的方式,但不能同時使用。 1、動態(tài)顯示 采用中斷處理按鍵,利用全局變量strKey控制要顯示的數(shù)字串,數(shù)字串保存在二維數(shù)組str[][]中,按下K1置strKey為0利用數(shù)碼管顯示第0行的數(shù)字串,按下K2置strKey為1利用數(shù)碼管顯示第1行的數(shù)字串。 數(shù)碼管的顯示:T0每500us中斷1次,在T0中斷中點亮一個數(shù)碼管。在T0中斷函數(shù)中,①P1.3(OE)=1,U3、U4輸出高阻;②P1.4(LE1)=1,P0口輸出段碼,P1.4=0,U3鎖存輸入的段碼;③P1.5(LE2)=1,P0口輸出位選碼,P1.5=0,U4鎖存輸入的位選碼;④P1.3=0,U3、U4同時輸出段碼和位選碼,進(jìn)行顯示。 2、矩陣式鍵盤按鍵識別 采取行列掃描方式判斷按鍵,利用數(shù)組N[]儲存矩陣鍵盤的十六個按鍵值。以備方便使用。 在判斷為相應(yīng)的鍵值后,要利用while(P2==鍵值)來等待鍵抬起(消抖),否則可能會出現(xiàn)一次按鍵發(fā)生多次事件的情況(本次按鍵在按鍵掃描循環(huán)里再次執(zhí)行到了該按鍵判斷語句,造成錯誤)。主要算法1:1、全局變量的定義:ucharN[17]={0x00,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//矩陣鍵盤ucharnumCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//共陰極數(shù)碼段碼ucharmark[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共陰極位選碼ucharint_mark; //定義位選中斷次數(shù)計數(shù)變量ucharkey_mark=16; //定義按鍵標(biāo)志ucharstr[2][8]={{2,0,1,9,1,2,0,2},{1,9,4,9,1,0,0,1}};//定義顯示的兩串?dāng)?shù)字ucharstrKey=2; //定義顯示數(shù)字串標(biāo)志ucharcount=0; //定義已顯示的數(shù)字個數(shù)ucharnumStr[9]={16,16,16,16,16,16,16,16,16};//記錄矩陣鍵盤按下的數(shù)字count用來記錄當(dāng)前輸入了幾個數(shù)字,當(dāng)為8時禁止鍵盤輸入數(shù)字,numStr用來記錄已輸入的數(shù)字。int_mark用來控制位選。2、定時器T0中斷函數(shù)://定時器T0中斷,刷新數(shù)碼管voidrefresh()interrupt1{ if(int_mark==9){ //位選計數(shù)溢出清零 int_mark=1; } //外部中斷0模式:動態(tài)顯示 if(EX0&&strKey!=2){ display(str[strKey][int_mark-1],int_mark); } //矩陣鍵盤模式:可控動態(tài)顯示與按鍵識別 elseif(!EX0){ display(numStr[int_mark],int_mark); } int_mark++; TH0=TH(500); //給定時器T1高8位賦值 TL0=TL(500); //給定時器T1低8位賦值}3、顯示單個數(shù)碼管函數(shù):voiddisplay(ucharn,ucharm){ OE=1; LE1=1; out=numCode[n]; LE1=0; LE2=1; out=mark[m]; LE2=0; OE=0;}4、主函數(shù)初始化及矩陣鍵盤行列掃描函數(shù)局部:voidmain(){ uchartemp; uchari; TMOD=0x01; //設(shè)置定時器T0為方式1定時 IE=0x83; //總中斷開,允許定時器T0、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 TH0=TH(500); //給定時器T0高8位賦值 TL0=TL(500); //給定時器T0低8位賦值 int_mark=0; //位選中斷次數(shù)清零 TR0=1; //啟動定時器T0 while(1){ if(count<9&&!EX0){ P2=0xef; for(i=0;i<=3;i++){ if(L1==0&&count<8){//第一行 key_mark=i+0; if(P2==N[1]){//數(shù)字7 N1 inputNum(7); while(P2==N[1]); } if(P2==N[2]){//數(shù)字8 N2 inputNum(8); while(P2==N[2]); } if(P2==N[3]){//數(shù)字9 N3 inputNum(9); while(P2==N[3]); } if(P2==N[4]){//無效鍵 N4 //inputNum(key_mark); while(P2==N[4]); } }5、數(shù)字串?dāng)?shù)組的操作://設(shè)置全部數(shù)字voidsetAllNum(ucharnum){ uinti; for(i=0;i<9;i++){numStr[i]=num;} count=8;}//清零已有數(shù)字voidsetNumZero(){ uinti; for(i=0;i<9;i++){numStr[i]=numStr[i]==16?16:0;}}//鍵盤輸入數(shù)字voidinputNum(ucharnum){ uinti; //數(shù)字?jǐn)?shù)組左移 for(i=0;i<8;i++){numStr[i]=numStr[i+1];} numStr[8]=num; count++;}2、實驗原理圖圖2-1實驗原理圖3、程序流程圖圖2-2程序流程圖三、源程序#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineTH(a)(65536-a)/256 //定義裝入定時器高8位的時間常數(shù)#defineTL(a)(65536-a)%256 //定義裝入定時器低8位的時間常數(shù)#defineoutP0//鎖存器開關(guān)sbitOE=P1^3;sbitLE1=P1^4;sbitLE2=P1^5;//外部中斷按鍵sbitK1=P2^0;sbitK2=P2^1;sbitK3=P2^2;sbitK4=P2^3;//行掃描標(biāo)志sbitL1=P2^0;sbitL2=P2^1;sbitL3=P2^2;sbitL4=P2^3;ucharN[17]={0x00,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//矩陣鍵盤ucharnumCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//共陰極數(shù)碼段碼ucharmark[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共陰極位選碼ucharint_mark; //定義位選中斷次數(shù)計數(shù)變量ucharkey_mark=16; //定義按鍵標(biāo)志ucharstr[2][8]={{2,0,1,9,1,2,0,2},{1,9,4,9,1,0,0,1}};//定義顯示的兩串?dāng)?shù)字ucharstrKey=2; //定義顯示數(shù)字串標(biāo)志ucharcount=0; //定義已顯示的數(shù)字個數(shù)ucharnumStr[9]={16,16,16,16,16,16,16,16,16};//記錄矩陣鍵盤按下的數(shù)字//延時函數(shù)voiddelay(time){ uintj; for(j=0;j<time;j++){}}//設(shè)置全部數(shù)字voidsetAllNum(ucharnum){ uinti; for(i=0;i<9;i++){ numStr[i]=num; } count=8;}//清零已有數(shù)字voidsetNumZero(){ uinti; for(i=0;i<9;i++){ numStr[i]=numStr[i]==16?16:0; }}//鍵盤輸入數(shù)字voidinputNum(ucharnum){ uinti; //數(shù)字?jǐn)?shù)組左移 for(i=0;i<8;i++){ numStr[i]=numStr[i+1]; } numStr[8]=num; count++;}//判斷是否是正常按鍵uintisNormalKey(ucharkey){ if(key==0xee||key==0xde||key==0xbe||key==0x7e|| key==0xed||key==0xdd||key==0xbd||key==0x7d|| key==0xeb||key==0xdb||key==0xbb||key==0x7b|| key==0xe7||key==0xd7||key==0xb7||key==0x77){ return1; }else{ return0; }}voidmain(){ uchartemp; uchari; TMOD=0x01; //設(shè)置定時器T0為方式1定時 IE=0x83; //總中斷開,允許定時器T0、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 TH0=TH(500); //給定時器T0高8位賦值 TL0=TL(500); //給定時器T0低8位賦值 int_mark=0; //位選中斷次數(shù)清零 TR0=1; //啟動定時器T0 while(1){ if(count<9&&!EX0){ P2=0xef; for(i=0;i<=3;i++){ if(L1==0&&count<8){//第一行 key_mark=i+0; if(P2==N[1]){//數(shù)字7 N1 inputNum(7); while(P2==N[1]); } if(P2==N[2]){//數(shù)字8 N2 inputNum(8); while(P2==N[2]); } if(P2==N[3]){//數(shù)字9 N3 inputNum(9); while(P2==N[3]); } if(P2==N[4]){//無效鍵 N4 //inputNum(key_mark); while(P2==N[4]); } } if(L2==0&&count<8){//第二行 key_mark=i+4; if(P2==N[5]){//數(shù)字4 N5 inputNum(4); while(P2==N[5]); } if(P2==N[6]){//數(shù)字5 N6 inputNum(5); while(P2==N[6]); } if(P2==N[7]){//數(shù)字6 N7 inputNum(6); while(P2==N[7]); } if(P2==N[8]){//無效鍵 N8 //inputNum(key_mark); while(P2==N[8]); } } if(L3==0&&count<8){//第三行 key_mark=i+8; if(P2==N[9]){//數(shù)字1 N9 inputNum(1); while(P2==N[9]); } if(P2==N[10]){//數(shù)字2 N10 inputNum(2); while(P2==N[10]); } if(P2==N[11]){//數(shù)字3 N11 inputNum(3); while(P2==N[11]); } if(P2==N[12]){//切換到外部中斷 N12 while(P2==N[12]); strKey=2; EX0=1; //打開外部中斷0 } } if(L4==0){//第四行 key_mark=i+12; if(P2==N[13]){//全部清零N13 setAllNum(0); while(P2==N[13]); } if(P2==N[14]){//數(shù)字0 N14 inputNum(0); while(P2==N[14]); } if(P2==N[15]){//局部清零N15 setNumZero(); while(P2==N[15]); } if(P2==N[16]){//回車鍵 N16 setAllNum(16); count=0; while(P2==N[16]); } } delay(500); temp=P2; temp=temp|0x0f; temp=temp<<1; temp=temp|0x0f; P2=temp; } } }}//顯示單個數(shù)碼管voiddisplay(ucharn,ucharm){ OE=1; LE1=1; out=numCode[n]; LE1=0; LE2=1; out=mark[m]; LE2=0; OE=0;}//定時器T0中斷,刷新數(shù)碼管voidrefresh()interrupt1{ if(int_mark==9){ //位選計數(shù)溢出清零 int_mark=1; } //外部中斷0模式:動態(tài)顯示 if(EX0&&strKey!=2){ display(str[strKey][int_mark-1],int_mark); } //矩陣鍵盤模式:可控動態(tài)顯示與按鍵識別 elseif(!EX0){ display(numStr[int_mark],int_mark); } int_mark++; TH0=TH(500); //給定時器T1高8位賦值 TL0=TL(500); //給定時器T1低8位賦值}//外部中斷0,按鍵控制voidkeyControl()interrupt0{ if(INT0==0){ //K1鍵按下,動態(tài)顯示"20191202" if(K1==0){ strKey=0; } //K2鍵按下,動態(tài)顯示"19491001" if(K2==0){ strKey=1; } //K3鍵按下,關(guān)閉外部中斷0 if(K3==0){ while(!K3); EX0=0; } //K4鍵按下, if(K4==0){ } }}四、實驗結(jié)果動態(tài)顯示:1、開機(jī)即等待外部中斷鍵盤按下,K1鍵按下動態(tài)顯示"20191202"(如圖4-1)圖4SEQ圖\*ARABIC\s11K1鍵按下動態(tài)

溫馨提示

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

評論

0/150

提交評論