




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)四動(dòng)態(tài)顯示與矩陣式鍵盤實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1、動(dòng)態(tài)顯示。 未按鍵不顯示,按K1鍵,動(dòng)態(tài)顯示“19491001”;按K2鍵,動(dòng)態(tài)顯示“20141210”。2、動(dòng)態(tài)顯示與按鍵識(shí)別。 矩陣式鍵盤鍵值分別是0-F,未按鍵不顯示。每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。3、可控動(dòng)態(tài)顯示與按鍵識(shí)別。 矩陣式鍵盤鍵值分別是0-9,最下面一排鍵位功能鍵,左右兩個(gè)鍵分別為“清0鍵”“C”,和”“回車鍵”“”,其它鍵無效。未按鍵不顯示,每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。按8個(gè)鍵后,再按鍵無效。按清0鍵全顯示“0”。按“”后全部熄滅,再按鍵重新開始。二、實(shí)驗(yàn)方案1、總體方案設(shè)計(jì) 所用硬件:AT89C52、BUTTON、AND_4、74HC573、RESPACK-8、7SEG-MPX8-CC-BLUE、電源。 外部中斷有4個(gè)按鍵K1、K2、K3、K4,分別連接到單片機(jī)P2.0、P2.1、P2.2、P2.3引腳,按鍵后對(duì)應(yīng)引腳為低電平,通過4與門連接到P3.2(外部中斷0)。動(dòng)態(tài)顯示共8個(gè)共陰極數(shù)碼管,采用兩片74LS573進(jìn)行驅(qū)動(dòng),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ù)點(diǎn),U2輸出位選碼,控制第幾個(gè)數(shù)碼管顯示。單片機(jī)P14、P15分別連接到U1、U2的LE,連接U1、U2的。軟件設(shè)計(jì):本實(shí)驗(yàn)采用外部中斷和矩陣鍵盤合為同一個(gè)程序的方式,但不能同時(shí)使用。 1、動(dòng)態(tài)顯示 采用中斷處理按鍵,利用全局變量strKey控制要顯示的數(shù)字串,數(shù)字串保存在二維數(shù)組str[][]中,按下K1置strKey為0利用數(shù)碼管顯示第0行的數(shù)字串,按下K2置strKey為1利用數(shù)碼管顯示第1行的數(shù)字串。 數(shù)碼管的顯示:T0每500us中斷1次,在T0中斷中點(diǎn)亮一個(gè)數(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同時(shí)輸出段碼和位選碼,進(jìn)行顯示。 2、矩陣式鍵盤按鍵識(shí)別 采取行列掃描方式判斷按鍵,利用數(shù)組N[]儲(chǔ)存矩陣鍵盤的十六個(gè)按鍵值。以備方便使用。 在判斷為相應(yīng)的鍵值后,要利用while(P2==鍵值)來等待鍵抬起(消抖),否則可能會(huì)出現(xiàn)一次按鍵發(fā)生多次事件的情況(本次按鍵在按鍵掃描循環(huán)里再次執(zhí)行到了該按鍵判斷語(yǔ)句,造成錯(cuò)誤)。主要算法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ù)計(jì)數(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ù)字個(gè)數(shù)ucharnumStr[9]={16,16,16,16,16,16,16,16,16};//記錄矩陣鍵盤按下的數(shù)字count用來記錄當(dāng)前輸入了幾個(gè)數(shù)字,當(dāng)為8時(shí)禁止鍵盤輸入數(shù)字,numStr用來記錄已輸入的數(shù)字。int_mark用來控制位選。2、定時(shí)器T0中斷函數(shù)://定時(shí)器T0中斷,刷新數(shù)碼管voidrefresh()interrupt1{ if(int_mark==9){ //位選計(jì)數(shù)溢出清零 int_mark=1; } //外部中斷0模式:動(dòng)態(tài)顯示 if(EX0&&strKey!=2){ display(str[strKey][int_mark-1],int_mark); } //矩陣鍵盤模式:可控動(dòng)態(tài)顯示與按鍵識(shí)別 elseif(!EX0){ display(numStr[int_mark],int_mark); } int_mark++; TH0=TH(500); //給定時(shí)器T1高8位賦值 TL0=TL(500); //給定時(shí)器T1低8位賦值}3、顯示單個(gè)數(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è)置定時(shí)器T0為方式1定時(shí) IE=0x83; //總中斷開,允許定時(shí)器T0、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 TH0=TH(500); //給定時(shí)器T0高8位賦值 TL0=TL(500); //給定時(shí)器T0低8位賦值 int_mark=0; //位選中斷次數(shù)清零 TR0=1; //啟動(dòng)定時(shí)器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、實(shí)驗(yàn)原理圖圖2-1實(shí)驗(yàn)原理圖3、程序流程圖圖2-2程序流程圖三、源程序#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineTH(a)(65536-a)/256 //定義裝入定時(shí)器高8位的時(shí)間常數(shù)#defineTL(a)(65536-a)%256 //定義裝入定時(shí)器低8位的時(shí)間常數(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ù)計(jì)數(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ù)字個(gè)數(shù)ucharnumStr[9]={16,16,16,16,16,16,16,16,16};//記錄矩陣鍵盤按下的數(shù)字//延時(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è)置定時(shí)器T0為方式1定時(shí) IE=0x83; //總中斷開,允許定時(shí)器T0、外部中斷0中斷 IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式 TH0=TH(500); //給定時(shí)器T0高8位賦值 TL0=TL(500); //給定時(shí)器T0低8位賦值 int_mark=0; //位選中斷次數(shù)清零 TR0=1; //啟動(dòng)定時(shí)器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; } } }}//顯示單個(gè)數(shù)碼管voiddisplay(ucharn,ucharm){ OE=1; LE1=1; out=numCode[n]; LE1=0; LE2=1; out=mark[m]; LE2=0; OE=0;}//定時(shí)器T0中斷,刷新數(shù)碼管voidrefresh()interrupt1{ if(int_mark==9){ //位選計(jì)數(shù)溢出清零 int_mark=1; } //外部中斷0模式:動(dòng)態(tài)顯示 if(EX0&&strKey!=2){ display(str[strKey][int_mark-1],int_mark); } //矩陣鍵盤模式:可控動(dòng)態(tài)顯示與按鍵識(shí)別 elseif(!EX0){ display(numStr[int_mark],int_mark); } int_mark++; TH0=TH(500); //給定時(shí)器T1高8位賦值 TL0=TL(500); //給定時(shí)器T1低8位賦值}//外部中斷0,按鍵控制voidkeyControl()interrupt0{ if(INT0==0){ //K1鍵按下,動(dòng)態(tài)顯示"20191202" if(K1==0){ strKey=0; } //K2鍵按下,動(dòng)態(tài)顯示"19491001" if(K2==0){ strKey=1; } //K3鍵按下,關(guān)閉外部中斷0 if(K3==0){ while(!K3); EX0=0; } //K4鍵按下, if(K4==0){ } }}四、實(shí)驗(yàn)結(jié)果動(dòng)態(tài)顯示:1、開機(jī)即等待外部中斷鍵盤按下,K1鍵按下動(dòng)態(tài)顯示"20191202"(如圖4-1)圖4SEQ圖\*ARABIC\s11K1鍵按下動(dòng)態(tài)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院科研過程管理制度
- 公司門禁密碼管理制度
- 大漢集團(tuán)薪酬管理制度
- 單位涉案財(cái)物管理制度
- 小區(qū)綠化水泵管理制度
- 員工設(shè)備工具管理制度
- 壓鑄行業(yè)安全管理制度
- 計(jì)算機(jī)三級(jí)考試新思潮試題及答案
- 嵌入式軟件測(cè)試方法試題及答案
- 2025年先進(jìn)技術(shù)并購(gòu)協(xié)議
- ISO9001:2015、ISO22000、HACCP三合一內(nèi)審檢查表2023版
- 檢驗(yàn)與臨床溝通的主要內(nèi)容
- 《律政俏佳人》課件
- 2025年度企業(yè)內(nèi)部員工保密協(xié)議(新修訂)5篇
- 毽球運(yùn)動(dòng)在校園文化中的推廣計(jì)劃
- 《我有友情要出租》
- 服裝業(yè)品牌“波司登”調(diào)查問卷
- 2025人教版道法七年級(jí)下冊(cè)《第二單元 煥發(fā)青春活力》大單元整體教學(xué)設(shè)計(jì)2022課標(biāo)
- 2025新外研社版英語(yǔ)七年級(jí)下單詞默寫表
- 大部分分校:地域文化形考任務(wù)二-國(guó)開(CQ)-國(guó)開期末復(fù)習(xí)資料
評(píng)論
0/150
提交評(píng)論