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

下載本文檔

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

文檔簡介

實驗四動態顯示與矩陣式鍵盤實驗一、實驗內容1、動態顯示。 未按鍵不顯示,按K1鍵,動態顯示“19491001”;按K2鍵,動態顯示“20141210”。2、動態顯示與按鍵識別。 矩陣式鍵盤鍵值分別是0-F,未按鍵不顯示。每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。3、可控動態顯示與按鍵識別。 矩陣式鍵盤鍵值分別是0-9,最下面一排鍵位功能鍵,左右兩個鍵分別為“清0鍵”“C”,和”“回車鍵”“”,其它鍵無效。未按鍵不顯示,每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。按8個鍵后,再按鍵無效。按清0鍵全顯示“0”。按“”后全部熄滅,再按鍵重新開始。二、實驗方案1、總體方案設計 所用硬件:AT89C52、BUTTON、AND_4、74HC573、RESPACK-8、7SEG-MPX8-CC-BLUE、電源。 外部中斷有4個按鍵K1、K2、K3、K4,分別連接到單片機P2.0、P2.1、P2.2、P2.3引腳,按鍵后對應引腳為低電平,通過4與門連接到P3.2(外部中斷0)。動態顯示共8個共陰極數碼管,采用兩片74LS573進行驅動,74LS573與74LS373都是8D鎖存器,只是573引腳排列更易于布線。其引腳功能為:D1-D8為數據輸入端;Q1-Q8為數據輸出端;LE為數據輸入鎖存端,LE=1數據輸入D鎖存器,LE=0數據不能輸入D鎖存器,即LE下降沿鎖存當前輸入數據;地址輸出允許端,=0輸出鎖存數據,=1輸出高阻。電路中,U1輸出段碼abcdefgdb,控制顯示的字形與小數點,U2輸出位選碼,控制第幾個數碼管顯示。單片機P14、P15分別連接到U1、U2的LE,連接U1、U2的。軟件設計:本實驗采用外部中斷和矩陣鍵盤合為同一個程序的方式,但不能同時使用。 1、動態顯示 采用中斷處理按鍵,利用全局變量strKey控制要顯示的數字串,數字串保存在二維數組str[][]中,按下K1置strKey為0利用數碼管顯示第0行的數字串,按下K2置strKey為1利用數碼管顯示第1行的數字串。 數碼管的顯示:T0每500us中斷1次,在T0中斷中點亮一個數碼管。在T0中斷函數中,①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同時輸出段碼和位選碼,進行顯示。 2、矩陣式鍵盤按鍵識別 采取行列掃描方式判斷按鍵,利用數組N[]儲存矩陣鍵盤的十六個按鍵值。以備方便使用。 在判斷為相應的鍵值后,要利用while(P2==鍵值)來等待鍵抬起(消抖),否則可能會出現一次按鍵發生多次事件的情況(本次按鍵在按鍵掃描循環里再次執行到了該按鍵判斷語句,造成錯誤)。主要算法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};//共陰極數碼段碼ucharmark[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共陰極位選碼ucharint_mark; //定義位選中斷次數計數變量ucharkey_mark=16; //定義按鍵標志ucharstr[2][8]={{2,0,1,9,1,2,0,2},{1,9,4,9,1,0,0,1}};//定義顯示的兩串數字ucharstrKey=2; //定義顯示數字串標志ucharcount=0; //定義已顯示的數字個數ucharnumStr[9]={16,16,16,16,16,16,16,16,16};//記錄矩陣鍵盤按下的數字count用來記錄當前輸入了幾個數字,當為8時禁止鍵盤輸入數字,numStr用來記錄已輸入的數字。int_mark用來控制位選。2、定時器T0中斷函數://定時器T0中斷,刷新數碼管voidrefresh()interrupt1{ if(int_mark==9){ //位選計數溢出清零 int_mark=1; } //外部中斷0模式:動態顯示 if(EX0&&strKey!=2){ display(str[strKey][int_mark-1],int_mark); } //矩陣鍵盤模式:可控動態顯示與按鍵識別 elseif(!EX0){ display(numStr[int_mark],int_mark); } int_mark++; TH0=TH(500); //給定時器T1高8位賦值 TL0=TL(500); //給定時器T1低8位賦值}3、顯示單個數碼管函數:voiddisplay(ucharn,ucharm){ OE=1; LE1=1; out=numCode[n]; LE1=0; LE2=1; out=mark[m]; LE2=0; OE=0;}4、主函數初始化及矩陣鍵盤行列掃描函數局部:voidmain(){ uchartemp; uchari; TMOD=0x01; //設置定時器T0為方式1定時 IE=0x83; //總中斷開,允許定時器T0、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發方式 TH0=TH(500); //給定時器T0高8位賦值 TL0=TL(500); //給定時器T0低8位賦值 int_mark=0; //位選中斷次數清零 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]){//數字7 N1 inputNum(7); while(P2==N[1]); } if(P2==N[2]){//數字8 N2 inputNum(8); while(P2==N[2]); } if(P2==N[3]){//數字9 N3 inputNum(9); while(P2==N[3]); } if(P2==N[4]){//無效鍵 N4 //inputNum(key_mark); while(P2==N[4]); } }5、數字串數組的操作://設置全部數字voidsetAllNum(ucharnum){ uinti; for(i=0;i<9;i++){numStr[i]=num;} count=8;}//清零已有數字voidsetNumZero(){ uinti; for(i=0;i<9;i++){numStr[i]=numStr[i]==16?16:0;}}//鍵盤輸入數字voidinputNum(ucharnum){ uinti; //數字數組左移 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位的時間常數#defineTL(a)(65536-a)%256 //定義裝入定時器低8位的時間常數#defineoutP0//鎖存器開關sbitOE=P1^3;sbitLE1=P1^4;sbitLE2=P1^5;//外部中斷按鍵sbitK1=P2^0;sbitK2=P2^1;sbitK3=P2^2;sbitK4=P2^3;//行掃描標志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};//共陰極數碼段碼ucharmark[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共陰極位選碼ucharint_mark; //定義位選中斷次數計數變量ucharkey_mark=16; //定義按鍵標志ucharstr[2][8]={{2,0,1,9,1,2,0,2},{1,9,4,9,1,0,0,1}};//定義顯示的兩串數字ucharstrKey=2; //定義顯示數字串標志ucharcount=0; //定義已顯示的數字個數ucharnumStr[9]={16,16,16,16,16,16,16,16,16};//記錄矩陣鍵盤按下的數字//延時函數voiddelay(time){ uintj; for(j=0;j<time;j++){}}//設置全部數字voidsetAllNum(ucharnum){ uinti; for(i=0;i<9;i++){ numStr[i]=num; } count=8;}//清零已有數字voidsetNumZero(){ uinti; for(i=0;i<9;i++){ numStr[i]=numStr[i]==16?16:0; }}//鍵盤輸入數字voidinputNum(ucharnum){ uinti; //數字數組左移 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; //設置定時器T0為方式1定時 IE=0x83; //總中斷開,允許定時器T0、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發方式 TH0=TH(500); //給定時器T0高8位賦值 TL0=TL(500); //給定時器T0低8位賦值 int_mark=0; //位選中斷次數清零 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]){//數字7 N1 inputNum(7); while(P2==N[1]); } if(P2==N[2]){//數字8 N2 inputNum(8); while(P2==N[2]); } if(P2==N[3]){//數字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]){//數字4 N5 inputNum(4); while(P2==N[5]); } if(P2==N[6]){//數字5 N6 inputNum(5); while(P2==N[6]); } if(P2==N[7]){//數字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]){//數字1 N9 inputNum(1); while(P2==N[9]); } if(P2==N[10]){//數字2 N10 inputNum(2); while(P2==N[10]); } if(P2==N[11]){//數字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]){//數字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; } } }}//顯示單個數碼管voiddisplay(ucharn,ucharm){ OE=1; LE1=1; out=numCode[n]; LE1=0; LE2=1; out=mark[m]; LE2=0; OE=0;}//定時器T0中斷,刷新數碼管voidrefresh()interrupt1{ if(int_mark==9){ //位選計數溢出清零 int_mark=1; } //外部中斷0模式:動態顯示 if(EX0&&strKey!=2){ display(str[strKey][int_mark-1],int_mark); } //矩陣鍵盤模式:可控動態顯示與按鍵識別 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鍵按下,動態顯示"20191202" if(K1==0){ strKey=0; } //K2鍵按下,動態顯示"19491001" if(K2==0){ strKey=1; } //K3鍵按下,關閉外部中斷0 if(K3==0){ while(!K3); EX0=0; } //K4鍵按下, if(K4==0){ } }}四、實驗結果動態顯示:1、開機即等待外部中斷鍵盤按下,K1鍵按下動態顯示"20191202"(如圖4-1)圖4SEQ圖\*ARABIC\s11K1鍵按下動態

溫馨提示

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

評論

0/150

提交評論