第5章顯示和鍵盤接口技術(shù)_第1頁
第5章顯示和鍵盤接口技術(shù)_第2頁
第5章顯示和鍵盤接口技術(shù)_第3頁
第5章顯示和鍵盤接口技術(shù)_第4頁
第5章顯示和鍵盤接口技術(shù)_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

本章內(nèi)容單片機(jī)與LED數(shù)碼管接口LED大屏幕顯示器和接口字符LCD液晶顯示和接口單片機(jī)與鍵盤接口第5章顯示和鍵盤接口技術(shù)單片機(jī)與LED數(shù)碼管接口LED數(shù)碼管結(jié)構(gòu)及原理

共陰極數(shù)碼管僅當(dāng)段位接高電平,陰極接低電平時,相應(yīng)位的LED才導(dǎo)通發(fā)光abcdefgbp共陽極數(shù)碼管僅當(dāng)段位接低電平,陽極接高電平時,相應(yīng)位的LED才導(dǎo)通發(fā)光abcdefgbpVcc七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

00111111

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

00000110

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01011011

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

00111111

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01100110

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01101101

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01111101

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

00000111

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01111111

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01100111

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01110111

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01111100

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

00111001

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01011110

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01111001

七段數(shù)碼管的段位控制agdbcefdpdpgfedcba

01110001

七段數(shù)碼管與段位控制代碼03FH106H25BH34FH466H56DH67DH707H87FH96FHA77Hb7CHC39Hd5EHE79HF71Habcdefg單片機(jī)與LED數(shù)碼管接口LED數(shù)碼管字型編碼若將數(shù)值0送至單片機(jī)的P1口,數(shù)碼管上不會顯示數(shù)字“0”。顯然,要使數(shù)碼管顯示出數(shù)字或字符,直接將相應(yīng)的數(shù)字或字符送至數(shù)碼管的段控制端是不行的,必須使段控制端輸出相應(yīng)的字形編碼。將單片機(jī)P1口的P1.0、P1.1…P1.7八個引腳依次與數(shù)碼管的a、b…f、dp八個段控制引腳相連接。如果使用的是共陽極數(shù)碼管,COM端接+5V,要顯示數(shù)字“0”,則數(shù)碼管的a、b、c、d、e、f六個段應(yīng)點(diǎn)亮,其它段熄滅,需向P1口傳送數(shù)據(jù)11000000B(C0H),該數(shù)據(jù)就是與字符“0”相對應(yīng)的共陽極字型編碼。若共陰極的數(shù)碼管COM端接地,要顯示數(shù)字“1”,則數(shù)碼管的b、c兩段點(diǎn)亮,其他段熄滅,需向P1口傳送數(shù)據(jù)00000110(06H),這就是字符“1”的共陰極字型碼了。單片機(jī)與LED數(shù)碼管接口LED靜態(tài)顯示靜態(tài)顯示是指數(shù)碼管顯示某一字符時,相應(yīng)的發(fā)光二極管恒定導(dǎo)通或恒定截止。這種顯示方式的各位數(shù)碼管的公共端恒定接地(共陰極)或+5V(共陽極)。每個數(shù)碼管的八個段控制引腳分別與一個八位I/O端口相連。只要I/O端口有顯示字型碼輸出,數(shù)碼管就顯示給定字符,并保持不變,直到I/O口輸出新的段碼。

單片機(jī)與LED數(shù)碼管接口LED靜態(tài)顯示單片機(jī)與LED數(shù)碼管接口LED動態(tài)顯示單片機(jī)與LED數(shù)碼管接口LED動態(tài)顯示動態(tài)顯示是一種按位輪流點(diǎn)亮各位數(shù)碼管的顯示方式,即在某一時段,只讓其中一位數(shù)碼管“位選端”有效,并送出相應(yīng)的字型顯示編碼。此時,其它位的數(shù)碼管因“位選端”無效而都處于熄滅狀態(tài);下一時段按順序選通另外一位數(shù)碼管,并送出相應(yīng)的字型顯示編碼,依此規(guī)律循環(huán)下去,即可使各位數(shù)碼管分別間斷地顯示出相應(yīng)的字符。這一過程稱為動態(tài)掃描顯示。

任務(wù)12LED點(diǎn)陣式電子廣告牌控制

任務(wù)目的:

利用單片機(jī)控制一塊最簡單的8×8LED點(diǎn)陣式電子廣告牌,循環(huán)顯示數(shù)字0~9。小經(jīng)驗(yàn):在實(shí)際應(yīng)用中,在每條列線上需串接一個300Ω左右的限流電阻。為提高端口帶負(fù)載能力,需增加一個緩沖驅(qū)動器。開始Y設(shè)置顯示字符設(shè)置循環(huán)掃描次數(shù)設(shè)置行、列初值行值和列值分別送相應(yīng)窗口延時1ms行值左移1位更新列號加1更新8行顯示完成?循環(huán)掃描完?10個字符掃描完?YYNNN//功能:在8×8LED點(diǎn)陣上循環(huán)顯示數(shù)字0~9#include"REG51.H"voiddelay1ms(); //延時約1ms函數(shù)聲明voidmain(){unsignedcharcodeled[]={0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18, //00x00,0x18,0x1c,0x18,0x18,0x18,0x18,0x18, //10x00,0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e, //20x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e, //30x00,0x30,0x38,0x34,0x32,0x3e,0x30,0x30, //40x00,0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e, //50x00,0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c, //60x00,0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c, //70x00,0x1c,0x36,0x36,0x1c,0x36,0x36,0x1c, //80x00,0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c}; //9unsignedcharw;unsignedinti,j,k,m;while(1){for(k=0;k<10;k++) //字符個數(shù)控制變量{for(m=0;m<400;m++) //每個字符掃描顯示400次,控制每個字符顯示時間{w=0x01; //行變量w指向第一行

j=k*8; //指向數(shù)組led的第k個字符第一個顯示碼下標(biāo)for(i=0;i<8;i++){P1=w; //行數(shù)據(jù)送P1口P0=led[j]; //列數(shù)據(jù)送P0口delay1ms();w<<=1; //行變量左移指向下一行j++; //指向數(shù)組中下一個顯示碼}}}}}//函數(shù)名:delay1ms//函數(shù)功能:采用軟件實(shí)現(xiàn)延時約1ms//形式參數(shù):無//返回值:無voiddelay1ms(){unsignedchari;for(i=0;i<0x10;i++);}LED大屏幕顯示器和接口

LED大屏幕顯示器結(jié)構(gòu)及原理LED點(diǎn)陣顯示器是把很多LED發(fā)光二極管按矩陣方式排列在一起,通過對每個LED進(jìn)行發(fā)光控制,完成各種字符或圖形的顯示。最常見的LED點(diǎn)陣顯示模塊有5×7(5列7行),7×9(7列9行),8×8(8列8行)結(jié)構(gòu)。LED點(diǎn)陣由一個一個的點(diǎn)(LED發(fā)光二極管)組成,總點(diǎn)數(shù)為行數(shù)與列數(shù)之積,引腳數(shù)為行數(shù)與列數(shù)之和。LED大屏幕顯示器和接口

LED大屏幕顯示器結(jié)構(gòu)及原理LED大屏幕顯示器和接口

LED大屏幕顯示器結(jié)構(gòu)及原理“大”字顯示字型碼示意圖0x00,0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c, //6的顯示碼0x000x1c0x060x1e0x360x360x360x1c0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6的顯示碼0x000x3e0x490x490x490x260x000x000x000x3e0x490x490x490x260x000x00LED大屏幕顯示器和接口

LED大屏幕顯示器結(jié)構(gòu)及原理顯示字符“大”的過程如下:先給第一行送高電平(行高電平有效),同時給8列送11110111(列低電平有效);然后給第二行送高電平,同時給8列送11110111,……最后給第八行送高電平,同時給8列送11111111。每行點(diǎn)亮延時時間為1ms,第八行結(jié)束后再從第一行開始循環(huán)顯示。利用視覺駐留現(xiàn)象,人們看到的就是一個穩(wěn)定的圖形。LED大屏幕顯示器和接口

LED大屏幕顯示器接口LED大屏幕顯示器和接口

LED大屏幕顯示器擴(kuò)展接口任務(wù)13字符型LCD液晶顯示廣告牌控制

任務(wù)要求:用單片機(jī)控制LCD162液晶模塊,在第1行正中間顯示“SHENZHEN”字符。//功能:LCD液晶顯示程序,采用8位數(shù)據(jù)接口#include<REG51.H>#include<INTRINS.H> //庫函數(shù)頭文件,代碼中引用了_nop_()函數(shù)//定義控制信號端口sbitRS=0xb0; //P3.0sbitRW=0xb1; //P3.1sbitE=0xb2; //P3.2//聲明調(diào)用函數(shù)voidlcd_w_cmd(unsignedcharcom); //寫命令字函數(shù)voidlcd_w_dat(unsignedchardat); //寫數(shù)據(jù)函數(shù)unsignedcharlcd_r_start(); //讀狀態(tài)函數(shù)voidint1(); //LCD初始化函數(shù)voiddelay(unsignedchart); //可控延時函數(shù)voiddelay1(); //軟件實(shí)現(xiàn)延時函數(shù),5個機(jī)器周期voidmain() //主函數(shù){unsignedcharlcd[]="SHENZHEN";unsignedchari;P1=0xff; //送全1到P1口int1(); //初始化LCDdelay(255);lcd_w_cmd(0x83); //設(shè)置顯示位置delay(255);for(i=0;i<9;i++) //顯示字符串{lcd_w_dat(lcd[i]);delay(200);}while(1); //原地踏步}//函數(shù)名:delay//函數(shù)功能:采用軟件實(shí)現(xiàn)可控延時//形式參數(shù):延時時間控制參數(shù)存入變量t中//返回值:無voiddelay(unsignedchart){unsignedcharj,i;for(i=0;i<t;i++)for(j=0;j<50;j++);}//函數(shù)名:delay1//函數(shù)功能:采用軟件實(shí)現(xiàn)延時,5個機(jī)器周期//形式參數(shù):無//返回值:無voiddelay1(){_nop_();_nop_();_nop_();}//函數(shù)名:int1//函數(shù)功能:lcd初始化//形式參數(shù):無//返回值:無voidint1(){lcd_w_cmd(0x3c); //設(shè)置工作方式lcd_w_cmd(0x0e); //設(shè)置光標(biāo)lcd_w_cmd(0x01); //清屏lcd_w_cmd(0x06); //設(shè)置輸入方式lcd_w_cmd(0x80); //設(shè)置初始顯示位置}//函數(shù)名:lcd_r_start//函數(shù)功能:讀狀態(tài)字//形式參數(shù):無//返回值:返回狀態(tài)字,最高位D7=0,LCD控制器空閑;D7=1,LCD控制器忙unsignedcharlcd_r_start(){unsignedchars;RW=1; //RW=1,RS=0,讀LCD狀態(tài)delay1();RS=0;delay1();E=1; //E端時序delay1();

s=P1;

//從LCD的數(shù)據(jù)口讀狀態(tài)delay1();E=0;delay1();RW=0;delay1();return(s); //返回讀取的LCD狀態(tài)字}//函數(shù)名:lcd_w_cmd//函數(shù)功能:寫命令字//形式參數(shù):命令字已存入com單元中//返回值:無voidlcd_w_cmd(unsignedcharcom){unsignedchari;do{i=lcd_r_start(); //查LCD忙操作,調(diào)用讀狀態(tài)字函數(shù)i=i&0x80; //與操作屏蔽掉低7位

delay(2);}while(i!=0); //LCD忙,繼續(xù)查詢,否則退出循環(huán)RW=0;delay1();RS=0; //RW=1,RS=0,寫LCD命令字delay1();E=1; //E端時序delay1();

P1=com;

//將com中的命令字寫入LCD數(shù)據(jù)口delay1();E=0;delay1();RW=1;delay(255);}//函數(shù)名:lcd_w_dat//函數(shù)功能:寫數(shù)據(jù)//形式參數(shù):數(shù)據(jù)已存入dat單元中//返回值:無voidlcd_w_dat(unsignedchardat){unsignedchari;do{ //查忙操作i=lcd_r_start(); //調(diào)用讀狀態(tài)字函數(shù)i=i&0x80; //與操作屏蔽掉低7位

delay(2);}while(i!=0); //LCD忙,繼續(xù)查詢,否則退出循環(huán)RW=0;delay1();RS=1; //RW=1,RS=0,寫LCD命令字delay1();E=1; //E端時序delay1();

P1=dat;

//將dat中的顯示數(shù)據(jù)寫入LCD數(shù)據(jù)口delay1();E=0;delay1();RW=1;delay(255);}字符LCD液晶顯示和接口

12345678910111213141516VSSVDDVORSR/WEDB0DB1ADB3DB2DB5DB4DB7DB6KLCD模塊Vss:+5V電源管腳(Vcc)VDD:地管腳(GND)Vo:液晶顯示驅(qū)動電源(0V~5V)字符LCD液晶顯示和接口

12345678910111213141516VSSVDDVORSR/WEDB0DB1ADB3DB2DB5DB4DB7DB6KLCD模塊DB0~DB7:數(shù)據(jù)線,可以用8位連接,也可以只用高4位連接,節(jié)約單片機(jī)資源,本實(shí)驗(yàn)中采用的是八位連接方法。字符LCD液晶顯示和接口

12345678910111213141516VSSVDDVORSR/WEDB0DB1ADB3DB2DB5DB4DB7DB6KLCD模塊A:背光控制正電源K:背光控制地字符LCD液晶顯示和接口

12345678910111213141516VSSVDDVORSR/WEDB0DB1ADB3DB2DB5DB4DB7DB6KLCD模塊單片機(jī)與LCD模塊之間有四種基本操作:

寫命令 讀狀態(tài) 寫顯示數(shù)據(jù) 讀顯示數(shù)據(jù)字符LCD液晶顯示和接口

12345678910111213141516VSSVDDVORSR/WEDB0DB1ADB3DB2DB5DB4DB7DB6KLCD模塊ERSR/W操作00寫命令操作(初始化、光標(biāo)定位等)01讀狀態(tài)操作(讀忙標(biāo)志)10寫數(shù)據(jù)操作(要顯示的內(nèi)容)11讀數(shù)據(jù)操作(可以把顯示存儲區(qū)中的數(shù)據(jù)反讀出來)字符LCD液晶顯示和接口

12345678910111213141516VSSVDDVORSR/WEDB0DB1ADB3DB2DB5DB4DB7DB6KLCD模塊RS:數(shù)據(jù)和指令選擇控制端,RS=0:命令/狀態(tài);RS=1:數(shù)據(jù)R/W:讀寫控制線,R/W=0:寫操作;R/W=1:讀操作E:數(shù)據(jù)讀寫操作控制位,E線向LCD模塊發(fā)送一個脈沖,LCD模塊與單片機(jī)之間將進(jìn)行一次數(shù)據(jù)交換字符LCD液晶顯示和接口

讀狀態(tài)操作狀態(tài)字的最高位的BF為忙標(biāo)志位,1表示LCD正在忙,0表示不忙。通過判斷最高位BF的0、1狀態(tài),就可以知道LCD當(dāng)前是否處于忙狀態(tài),如果LCD一直處于忙狀態(tài),則繼續(xù)查詢等待,否則進(jìn)行下面的操作。查詢忙狀態(tài)程序段如下:do{i=lcd_r_start();//調(diào)用讀狀態(tài)函數(shù),讀取LCD狀態(tài)字i&=0x80;//采用與操作屏蔽掉低7位delay(2); //延時}while(i!=0); //LCD忙,繼續(xù)查詢,否則退出循環(huán)字符LCD液晶顯示和接口

寫命令操作LCD上電時,都必須按照一定的時序?qū)CD進(jìn)行初始化操作,主要任務(wù)是設(shè)置LCD的工作方式、顯示狀態(tài)、清屏、輸入方式、光標(biāo)位置等。

字符LCD液晶顯示和接口

寫命令操作voidlcd_w_cmd(unsignedcharcom){unsignedchari;do{//查LCD忙操作i=lcd_r_start(); //調(diào)用讀狀態(tài)字函數(shù)i=i&0x80;//與操作屏蔽掉低7位

delay(2);}while(i!=0); //LCD忙,繼續(xù)查詢,否則退出循環(huán)RW=0;delay1();RS=0; //RW=1,RS=0,寫LCD命令字delay1();E=1; //E端時序delay1();

P1=com;

//將com中的命令字寫入LCD數(shù)據(jù)口delay1();E=0;delay1();RW=1;delay(255);}字符LCD液晶顯示和接口

寫命令操作編號指令名稱控制信號命令字D7D6D5D4D3D2D1D01清屏00000000012歸home位000000001×3輸入方式設(shè)置00000001I/DS4顯示狀態(tài)設(shè)置0000001DCB5光標(biāo)畫面滾動000001S/CR/L××6工作方式設(shè)置00001DLNF××7CGRAM地址設(shè)置0001A5A4A3A2A1A08DDRAM地址設(shè)置001A6A5A4A3A2A1A09讀BF和AC01BFAC6AC5AC4AC3AC2AC1AC0I/D:設(shè)置設(shè)置光標(biāo)移動的方向I/D=0:遞增右移;I/D=1:遞減左移S:設(shè)置整體顯示是否移動S=0:整體不移位,S=1:整體移位D:設(shè)置顯示屏是否打開D=0:顯示屏關(guān);D=1:顯示屏開C:設(shè)置光標(biāo)是否顯示C=0:光標(biāo)不出現(xiàn);C=1:光標(biāo)出現(xiàn)B:設(shè)置光標(biāo)是否閃爍B=0:光標(biāo)出現(xiàn)閃爍;B=1:光標(biāo)不閃爍S/C=0,R/L=0:光標(biāo)左移S/C=0,R/L=1:光標(biāo)右移S/C=1,R/L=0:字符和光標(biāo)左移S/C=1,R/L=1:字符和光標(biāo)右移DL=1:數(shù)據(jù)長度為8位;DL=0:使用D7~D4共4位,分兩次傳送N=0:單行顯示;N=1:雙行顯示F=0:5×7點(diǎn)陣字體;F=1:5×10點(diǎn)陣字體BF=0:LCD就緒;BF=1:LCD忙字符LCD液晶顯示和接口

初始化操作

LCD初始工作方式設(shè)置顯示狀態(tài)設(shè)置清屏返回輸入方式設(shè)置001DLNF**—設(shè)置單片機(jī)與LCD接口數(shù)據(jù)位數(shù)DL、顯示行數(shù)N、字型FDL=1:8位、DL=0:4位;N=1:2行、N=0:1行F=1:5×10、F=0:5×7例:00111000B(38H)設(shè)置數(shù)據(jù)位數(shù)8位,2行顯示,5×7點(diǎn)陣字符00001DCB—設(shè)整體顯示開關(guān)D、光標(biāo)開關(guān)C、光標(biāo)位的字符閃耀BD=1:開顯示;C=0:不顯示光標(biāo);B=0:光標(biāo)位字符不閃爍例:00001100B(0CH)打開LCD顯示,光標(biāo)不顯示,光標(biāo)位字符不閃爍清屏命令字01H,將光標(biāo)設(shè)置為第一行第一列000001I/DS—設(shè)光標(biāo)移動方向并確定整體顯示是否移動I/D=1:增量方式右移、I/D=0:減量方式左移S=1:移位、S=0:不移位例:00000110B(06H)設(shè)置光標(biāo)增量方式右移,顯示字符不移動字符LCD液晶顯示和接口

寫數(shù)據(jù)操作

光標(biāo)位置與相應(yīng)命令字

列行123456789101112131415161808182838485868788898A8B8C8D8E8F2C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF注:表中命令字以十六進(jìn)制形式給出,該命令字就是與LCD顯示位置相對應(yīng)的DDRAM地址。字符LCD液晶顯示和接口

voidlcd_w_dat(unsignedchardat){unsignedchari;do{ //查忙操作i=lcd_r_start(); //調(diào)用讀狀態(tài)字函數(shù)i=i&0x80; //與操作屏蔽掉低7位

delay(2);}while(i!=0); //LCD忙,繼續(xù)查詢,否則退出循環(huán)RW=0;delay1();RS=1; //RW=1,RS=0,寫LCD命令字delay1();E=1; //E端時序delay1();P1=dat; //將dat中的顯示數(shù)據(jù)寫入LCD數(shù)據(jù)口delay1();E=0;delay1();RW=1;delay(255);}任務(wù)14具有簡單控制功能的

簡易秒表設(shè)計任務(wù)要求:用單片機(jī)控制2位數(shù)碼管實(shí)現(xiàn)00~59的簡易秒表,并利用3個獨(dú)立式按鍵實(shí)現(xiàn)秒表的啟動、停止和復(fù)位功能。//功能:00~59簡易秒表程序#include<reg51.h>unsignedcharmsec,sec; //定義msec為50ms計數(shù)變量,sec為秒變量voiddelay(unsignedchari); //延時函數(shù)參見任務(wù)1程序ex1_1.c//函數(shù)名:T0_INT//函數(shù)功能:定時器0中斷函數(shù),定時50ms到,自動執(zhí)行該函數(shù),判斷是否中斷20次//形式參數(shù):無//返回值:無voidT0_INT(void)interrupt1 //定時器0中斷類型號為1{TH0=0x3c; //50ms定時初值TL0=0xb0;msec++; //中斷次數(shù)增1if(msec==20) //中斷次數(shù)到20次嗎?{msec=0; //是,1秒計時到,50ms計數(shù)單元清零sec++; //秒單元加1if(sec==60) //到60秒嗎?{ sec=0; //是,秒單元清零}}}voidmain() //主函數(shù){unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定義數(shù)字0~9字型顯示碼unsignedchartemp;TMOD=0x01; //定時器0工作方式1TH0=0x3c;TL0=0xb0;//50ms定時初值EA=1; //開總中斷ET0=1; //開定時器0中斷P3=0xff; //P3口做輸入while(1){P2=0x01; //選中P2.0控制的數(shù)碼管P1=led[sec%10]; //顯示秒個位delay(10);P2=0x02; //選中P2.1控制的數(shù)碼管P1=led[sec/10]; //顯示秒十位delay(10);temp=~P3; //讀入P3口引腳狀態(tài)并取反temp=temp&0x2c; //屏蔽掉無關(guān)位,保留三位按鍵狀態(tài)00x0xx00

if(temp==0x04) //按下停止鍵TR0=0; //停止計數(shù) if(temp==0x08) //按下啟動鍵TR0=1; //啟動計數(shù) if(temp==0x20) //按下復(fù)位鍵

{TR0=0;sec=0;msec=0;}}

}單片機(jī)與鍵盤接口a圖和b圖的按鍵為彈性按鍵,按下時,兩觸點(diǎn)閉合導(dǎo)通放開時,斷開。撥動開關(guān)撥碼開關(guān)單片機(jī)與鍵盤接口按鍵按照結(jié)構(gòu)原理可分為兩類,一類是觸點(diǎn)式開關(guān)按鍵,如機(jī)械式開關(guān)、導(dǎo)電橡膠式開關(guān)等;另一類是無觸點(diǎn)開關(guān)按鍵,如電氣式按鍵,磁感應(yīng)按鍵等。前者造價低,后者壽命長。按鍵按照接口原理可分為編碼鍵盤與非編碼鍵盤兩類。這兩類鍵盤的主要區(qū)別是識別鍵符及給出相應(yīng)鍵碼的方法。編碼鍵盤主要是用硬件來實(shí)現(xiàn)對按鍵的識別,硬件結(jié)構(gòu)復(fù)雜;非編碼鍵盤主要是由軟件來實(shí)現(xiàn)按鍵的定義與識別,硬件結(jié)構(gòu)簡單,軟件編程量大。這里將要介紹的獨(dú)立式按鍵和矩陣式鍵盤都是非編碼鍵盤。單片機(jī)與鍵盤接口按鍵的去抖機(jī)械式按鍵在按下或釋放時,由于機(jī)械彈性作用的影響,通常伴隨有一定時間的觸點(diǎn)機(jī)械抖動,然后其觸點(diǎn)才穩(wěn)定下來,抖動時間一般為510ms,在觸點(diǎn)抖動期間檢測按鍵的通與斷狀態(tài),可能導(dǎo)致判斷出錯。單片機(jī)與鍵盤接口按鍵的去抖

(a)檢測按鍵(b)釋放按鍵按鍵去抖流程圖單片機(jī)與鍵盤接口獨(dú)立式按鍵

獨(dú)立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡單,但每個按鍵必須占用一根I/O口線,因此,在按鍵較多時,I/O口線浪費(fèi)較大,不宜采用。//功能:獨(dú)立式按鍵程序#include"REG51.H"http://函數(shù)名:delay10ms//函數(shù)功能:采用定時器1實(shí)現(xiàn)延時10ms//形式參數(shù):無//返回值:無voiddelay()//定時10ms,采用定時器1,工作方式1實(shí)現(xiàn){TH1=0xd8; //設(shè)置10ms定時初值TL1=0xf0; TR1=1; //啟動定時器1while(!TF1); //判斷10ms定時時間到TF1=0;} voidmain() //主函數(shù){ unsignedchari;TMOD=0x10; //設(shè)置定時器1工作方式1P1=0xff; //P1口作為輸入口,置全1i=0; while(1){do //循環(huán)判斷是否有鍵按下{i=~P1; //讀按鍵狀態(tài)并取反}while(i==0);delay(); //有鍵按下,延時10ms去抖do{ i=~P1; //再次讀按鍵狀態(tài)并取反 }while(i==0);switch(i) //根據(jù)鍵值調(diào)用不同的處理函數(shù){case0x01:key1();break; //調(diào)用按鍵1子函數(shù),該函數(shù)此處省略case0x02:key2();break; //調(diào)用按鍵2子函數(shù),該函數(shù)此處省略case0x04:key3();break; //調(diào)用按鍵3子函數(shù),該函數(shù)此處省略case0x08:key4();break; //調(diào)用按鍵4子函數(shù),該函數(shù)此處省略case0x10:key5();break; //調(diào)用按鍵5子函數(shù),該函數(shù)此處省略case0x20:key6();break; //調(diào)用按鍵6子函數(shù),該函數(shù)此處省略case0x40:key7();break; //調(diào)用按鍵7子函數(shù),該函數(shù)此處省略

case0x80:key8();break; //調(diào)用按鍵8子函數(shù),該函數(shù)此處省略default:break;}}}單片機(jī)與鍵盤接口矩陣式按鍵

通常,矩陣式鍵盤的列線由單片機(jī)輸出口控制,行線連接單片機(jī)的輸入口。單片機(jī)與鍵盤接口矩陣式按鍵

鍵盤編程掃描法識別按鍵一般應(yīng)包括以下內(nèi)容:(1)判別有無鍵按下。(2)鍵盤掃描取得閉合鍵的行、列號。(3)用計算法或查表法得到鍵值。(4)判斷閉合鍵是否釋放,如沒釋放則繼續(xù)等待。(5)將閉合鍵的鍵值保存,同時轉(zhuǎn)去執(zhí)行該閉合鍵的功能。分析是否有鍵按下先向P1口輸出0xf0(高四位列選為全1,低四位行選為全0),然后讀回由于P1口輸出有鎖存,若無鍵按下,從P1口讀回應(yīng)該仍為0xf0,低四位行選保持全0若讀回值不為0xf0,即低四位行選不為全0,說明有鍵按下111100001分析是哪個鍵按下雙重循環(huán)先選定一列,再逐行掃描,獲得鍵位置碼將鍵位置碼送到LED顯示第0次掃描,P1輸出0xef(11101111)01111111

溫馨提示

  • 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

提交評論