版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章單片機(jī)鍵盤/顯示的C51編程6.1
七段數(shù)碼顯示器接口6.2鍵盤接口6.3點(diǎn)陣LED顯示器接口6.4液晶顯示器的C51編程6.1七段數(shù)碼顯示器的C51編程6.1.1基礎(chǔ)知識(shí)6.1.2靜態(tài)顯示的C51編程6.1.3動(dòng)態(tài)顯示的C51編程6.1.4串行口控制的LED顯示的C51編程6.1.1基礎(chǔ)知識(shí)1、結(jié)構(gòu)與原理:2.顯示器的驅(qū)動(dòng)問(wèn)題顯示器中的每個(gè)段是一個(gè)發(fā)光二極管,要其正常發(fā)光必須提供足夠的電流。不同的LED顯示器具有不同的正常發(fā)光電流范圍,因此在設(shè)計(jì)硬件電路時(shí)要為顯示器提供驅(qū)動(dòng)電路,以保證其正常工作。3.顯示函數(shù)的編寫問(wèn)題(3步)(1)根據(jù)硬件電路的結(jié)構(gòu)建立一個(gè)顯示的代碼表P68表6-1
按照一定的順序在code區(qū)域中,將所有要顯示的內(nèi)容的顯示代碼按照一定的順序建立一個(gè)表格,這個(gè)表格稱為顯示的代碼表,如:unsignedcharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//顯示的代碼表(2)開(kāi)辟顯示緩沖區(qū)在片內(nèi)RAM中開(kāi)辟出一塊特殊區(qū)域—顯示緩沖器。顯示緩沖區(qū)中存放要顯示的內(nèi)容所對(duì)應(yīng)的代碼在代碼表中的相對(duì)位置。顯示緩沖區(qū)的位數(shù)和硬件電路中顯示器的位數(shù)相同,每個(gè)顯示緩沖器對(duì)應(yīng)著一位顯示器。如6位顯示器,顯示緩沖區(qū)可如下:unsignedchardatadis_buf[6]; //顯示緩沖區(qū)(3)查表并操作相應(yīng)的顯示器
根據(jù)顯示緩沖區(qū)中的內(nèi)容(相應(yīng)的顯示器要顯示的內(nèi)容所對(duì)應(yīng)的顯示代碼在代碼表中的相對(duì)位置),在代碼表中得到相應(yīng)的顯示代碼,送到相應(yīng)的顯示器上進(jìn)行顯示。6.1.2七段數(shù)碼靜態(tài)顯示的C51編程所謂靜態(tài)顯示,就是當(dāng)顯示器顯示某一個(gè)字符時(shí),相應(yīng)的發(fā)光二極管恒定地導(dǎo)通或截止。例如七段顯示器的f、e、d、c、b、a導(dǎo)通,dp、g截止,則顯示0。這種顯示方式中,每一位顯示器都需要一個(gè)8位輸出口控制,所以占用硬件多,一般用于顯示器位數(shù)較少的場(chǎng)合?!纠?-1】利用單片機(jī)的并行口作為靜態(tài)顯示的輸出口的示例
靜態(tài)輪流顯示“12”、“--”和“AB”的C51源程序如下:#include<reg51.h>#defineucharunsignedcharuchardatadis_buf[2];//顯示緩沖區(qū)ucharcodeable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; //顯示的代碼表voiddl(){ unsignedinti;
for(i=0;i<40000;i++);}voiddisplay(void) //顯示函數(shù){uchar
segcode;
segcode=dis_buf[0];//P0口顯示
segcode=table[segcode];P0=segcode;
segcode=dis_buf[1]; //P3口顯示
segcode=table[segcode];P3=segcode;}voidmain(void) //主函數(shù){while(1){dis_buf[0]=1;dis_buf[1]=2; //顯示12display();dl();dis_buf[0]=16;dis_buf[1]=16;//顯示--display();
dl();dis_buf[0]=10;dis_buf[1]=11;//顯示ABdisplay();
dl();}}示例中的顯示函數(shù)display()可以再簡(jiǎn)單一些,如下面程序段:voiddisplay(void){P0=table[dis_buf[0]]; //P0口顯示P3=table[dis_buf[1]]; //P3口顯示}【例6-2】利用Intel8255A作為靜態(tài)顯示的輸出口的示例由上圖可見(jiàn),8255的的PA口、PB口、PC口及控制口的口地址分別為:0BCFFH、0BDFFH、0BEFFH、0BFFFH。靜態(tài)輪流顯示“123”、和“ABC”的C51源程序如下:#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8255XBYTE[0xbfff]#definePA8255XBYTE[0xbcff]#definePB8255XBYTE[0xbdff]#definePC8255XBYTE[0xbeff]uchardatadis_buf[3]; //顯示緩沖區(qū)ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//顯示的代碼表voiddl_ms(){unsignedintd;
for(d=0;d<60000;d++);}voiddisplay(void){ PA8255=table[dis_buf[0]]; PB8255=table[dis_buf[1]]; PC8255=table[dis_buf[2]];}voidmain(void){COM8255=0x80; //8255A初始化while(1){ dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3; display();dl_ms(); dis_buf[0]=10;dis_buf[1]=11;dis_buf[2]=12; display();dl_ms();} }6.1.3七段數(shù)碼動(dòng)態(tài)顯示的C51編程當(dāng)位數(shù)較多時(shí),用靜態(tài)顯示所需要的I/O口太多,通常采用動(dòng)態(tài)顯示方式。8段LED動(dòng)態(tài)顯示是將所有的顯示器的a~dp段連接在一起,構(gòu)成段口;將所有顯示器的位com接在一個(gè)口上,構(gòu)成位口,位的段選線并接在一個(gè)I/O口上,共陰極端或共陽(yáng)極端分別有相應(yīng)的I/O口線控制,分別稱為段口和位口?!纠?-3】利用MCS-51單片機(jī)的并行口作為動(dòng)態(tài)顯示的段口與位口的示例6位數(shù)碼管動(dòng)態(tài)顯示“123456”的C51源程序如下(1)隨機(jī)調(diào)用 #include<reg51.h>#defineucharunsignedcharuchardatadis_buf[6];//顯示緩沖區(qū)ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//代碼表voiddl_ms() //延時(shí)1ms函數(shù){unsignedintj;
for(j=0;j<200;j++) ;}voiddisplay(void)//顯示函數(shù){uchar
segcode,bitcode,i;
bitcode=0xfe; //位碼賦初值
for(i=0;i<6;i++){segcode=dis_buf[i];//顯示緩沖器內(nèi)容查表
P0=table[segcode];P3=bitcode;dl_ms();P3=0xff; //關(guān)閉顯示
bitcode=bitcode<<1; //調(diào)整位碼
bitcode=bitcode|0x01;}}voidmain(void){dis_buf[0]=1;dis_buf[1]=2;
dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6;while(1){ display();}}(2)定時(shí)調(diào)用
定時(shí)調(diào)用是通過(guò)定時(shí)器/計(jì)數(shù)器的定時(shí)功能來(lái)定時(shí)一定的時(shí)間(如20ms),定時(shí)時(shí)間到來(lái)調(diào)用顯示函數(shù)。voidmain(void)//定時(shí)調(diào)用{TMOD=0x01;TH0=-20000/256;TL0=-2000%256;EA=1;ET0=1;TR0=1;dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6;while(1);}voidtime0_int()interrupt1{ TH0=-20000/256; TL0=-2000%256; display();}【例6-4】利用Intel8255A作為動(dòng)態(tài)顯示的輸出口的示例
6位數(shù)碼管動(dòng)態(tài)輪流顯示“123456”、“ABCDEF”的C51源程序如下:(1)隨機(jī)調(diào)用#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8255XBYTE[0xbfff]#definePA8255XBYTE[0xbcff]#definePB8255XBYTE[0xbdff]#definePC8255XBYTE[0xbeff]uchardatadis_buf[6];//顯示緩沖區(qū)ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};voiddl_1ms();voiddisplay() //顯示函數(shù){datauchar
segcode,bitcode,i;
bitcode=0xfe; //位碼初值
for(i=0;i<6;i++){segcode=dis_buf[i]; //查表PA8255=table[segcode];PC8255=bitcode;dl_1ms();PC8255=0xff;
bitcode=bitcode<<1; //位碼調(diào)整
bitcode=bitcode|0x01;}}voidmain(void){unsignedinti1;COM8255=0x80;//8255初始化while(1){dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6;display(); //調(diào)用顯示for(i1=0;i1<300;i1++) //延時(shí){display();}dis_buf[0]=10;dis_buf[1]=11;dis_buf[2]=12;dis_buf[3]=13;dis_buf[4]=14;dis_buf[5]=15;display(); //調(diào)用顯示for(i1=0;i1<300;i1++) {display();}}}voiddl_1ms()//延時(shí)1ms{ dataunsignedintd;
for(d=0;d<200;d++);}(2)定時(shí)調(diào)用voidmain(void)//定時(shí)調(diào)用{unsignedinti1; COM8255=0x80;TMOD=0x01;TH0=-20000/256;TL0=-20000%256;EA=1;ET0=1;TR0=1;while(1) {dis_buf[0]=16;dis_buf[1]=9; dis_buf[2]=0;dis_buf[3]=0; dis_buf[4]=13;dis_buf[5]=16; for(i1=0;i1<500;i1++) {dl_1ms();}
dis_buf[0]=10;dis_buf[1]=11; dis_buf[2]=12;dis_buf[3]=13; dis_buf[4]=14;dis_buf[5]=15; for(i1=0;i1<500;i1++) {dl_1ms();}}}voidtime0_int()interrupt1{TH0=-20000/256; TL0=-20000%256;display();}6.1.4串行口控制的LED顯示的C51編程串行口工作在方式0(同步移位寄存器方式)時(shí),數(shù)據(jù)傳送的波特率是固定的,為fosc/12。若MCS-51單片機(jī)晶振頻率為6MHz,則波特率為500kb/s,即每傳送一個(gè)二進(jìn)制位需2μs時(shí)間。這種顯示電路屬于靜態(tài)顯示方式,比動(dòng)態(tài)顯示亮度更大些?!纠?-5】串行口控制的LED顯示示例4位顯示器顯示“1234”的C51源程序如下:#include<reg51.h>unsignedchardis_buf[4];//顯示緩沖區(qū)unsignedcharcodetable[10]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90};voiddisplay() //顯示函數(shù){unsignedchari;TI=0;
for(i=0;i<4;i++){ SBUF=table[dis_buf[i]];
while(TI==0); TI=0;}}voidmain(){SCON=0x00; //串口方式0工作
dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3;dis_buf[3]=4;display(); //調(diào)用顯示while(1);} 6.2鍵盤接口的C51編程6.2.1鍵盤的基礎(chǔ)知識(shí)6.2.2獨(dú)立式鍵盤接口的C51編程6.2.3矩陣鍵盤的C51編程6.2.1鍵盤的基礎(chǔ)知識(shí)1.鍵輸入原理:0、1電平2.鍵輸入接口與軟件應(yīng)解決的問(wèn)題(1)鍵開(kāi)關(guān)狀態(tài)的可靠輸入(2)對(duì)按鍵進(jìn)行編碼以給出鍵值或直接給出鍵號(hào)①檢測(cè)有無(wú)鍵按下;②有鍵按下后,在無(wú)硬件去抖動(dòng)電路時(shí),應(yīng)用軟件延時(shí)方法除去抖動(dòng)影響;③有可靠的邏輯處理方法,如n鍵按下,即只處理一個(gè)鍵,其間任何按下又松開(kāi)的鍵不產(chǎn)生影響,不管一次按鍵持續(xù)有多長(zhǎng)時(shí)間,僅執(zhí)行一次按鍵功能程序;④輸出確定的鍵號(hào)以滿足散轉(zhuǎn)指令的要求。6.2.2獨(dú)立式鍵盤接口的C51編程【例6-6】獨(dú)立式按鍵示例P1口作為并行接口按鍵的輸入口,用P3口接一LED顯示器,編程顯示按鍵的號(hào)碼0~7。【例B6-1】
按鍵發(fā)音修改:在例題6-4圖的基礎(chǔ)上,在P10、P11、P12上增加3個(gè)按鍵K0、K1、K2,試設(shè)計(jì)一個(gè)秒表:K0:?jiǎn)?dòng)/停止鍵K1:暫停鍵K2:清零鍵6.2.3矩陣鍵盤的C51編程1.行列式鍵盤的硬件結(jié)構(gòu)2.行列式鍵盤的軟件管理對(duì)行列式鍵盤的軟件管理分三步:
(1)判斷整個(gè)鍵盤是否有鍵按下采用粗掃描的辦法。讓所有的行為0,讀列的數(shù)值。如果讀得的列值為全1,說(shuō)明無(wú)鍵按下,否則說(shuō)明有鍵按下。
(2)判斷被按鍵的具體位置采用細(xì)掃描的辦法。逐行輸出0,讀列的數(shù)值。如果讀得的列值為全1,說(shuō)明被按鍵不在該行上,再讓下一行為0;否則說(shuō)明被按鍵在該行上。
(3)計(jì)算被按鍵的鍵值,以確定要完成的功能。采用某種算法,將行和列的信息合并為一個(gè)信息,該信息稱為該鍵的鍵值,并按一定的順序形成一個(gè)鍵值表。在計(jì)算鍵值時(shí)應(yīng)注意所有按鍵的鍵值應(yīng)采用同一種算法并且計(jì)算出來(lái)的鍵值應(yīng)該各不相同?!纠?-7】4×4矩陣鍵盤示例
【例6-8】8×2矩陣鍵盤示例6.3點(diǎn)陣LED顯示器的C51編程6.3.1點(diǎn)陣LED顯示器基礎(chǔ)知識(shí)6.3.2一個(gè)5×7點(diǎn)陣字符顯示的C51編程6.3.3一個(gè)8×8點(diǎn)陣字符串顯示的C51編程6.3.4兩個(gè)8×8點(diǎn)陣字符串顯示的C51編程
6.3.1點(diǎn)陣LED顯示器基礎(chǔ)知識(shí)LED點(diǎn)陣顯示字母“A”和“B”
6.3.2一個(gè)5×7點(diǎn)陣字符顯示的C51編程【例6-9】使用一個(gè)5×7共陽(yáng)極LED點(diǎn)陣顯示字符“B”顯示5×7共陽(yáng)極LED點(diǎn)陣的段碼a~g是低電平有效,位選高電平有效,因此顯示字符“B”的段碼修改:在例6-9的基礎(chǔ)上,在顯示器上顯示一個(gè)你想顯示的一個(gè)圖案或一個(gè)中文字。6.3.3一個(gè)8×8點(diǎn)陣字符串顯示的C51編程【例6-10】一個(gè)8×8共陰極LED點(diǎn)陣顯示“ILOVEYOU”一個(gè)8×8在某一個(gè)時(shí)刻只能顯示一個(gè)字符,要想顯示字符串,必須在顯示完一個(gè)字符后接著顯示下一個(gè)字符,因此需要建立一個(gè)字符串庫(kù)。由于每個(gè)字符有8個(gè)段碼值,該字符串有8個(gè)字符,所以該字符串庫(kù)中有8×8共64個(gè)段碼值。字符串ILOVEYOU的字模段碼值
I00H,00H,42H,7EH,42H,42H,00H,00HL00H,42H,7EH,42H,02H,02H,02H,00HO00H,3CH,22H,42H,42H,22H,3CH,00HV00H,40H,70H,0CH,0CH,70H,40H,00HE00H,42H,7EH,4AH,4AH,5AH,22H,00HY00H,40H,62H,1EH,12H,60H,40H,00HO00H,3CH,22H,42H,42H,22H,3CH,00HU00H,7CH,46H,02H,02H,7CH,40H,00H補(bǔ)充:水平左移Proteus原理圖為例6-10,顯示字符μ水平左移。補(bǔ)充:垂直移動(dòng)--上卷上卷的關(guān)鍵是字型的編碼的變化。規(guī)律:相應(yīng)的字型碼循環(huán)右移一位。修改:1、箭頭上卷2、箭頭下卷6.3.4兩個(gè)8×8點(diǎn)陣字符串顯
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海與三明市合作協(xié)議書范文
- 初中幾何輔助線大全(很詳細(xì)哦)
- C語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)書【范本模板】
- 2021-2022學(xué)年-有答案-陜西省某校八年級(jí)(上)期中政治試卷
- 語(yǔ)言翻山越嶺:孩子的表達(dá)之路-如何養(yǎng)成孩子出色的表達(dá)能力
- 迎新生的廣播稿(24篇)
- 防火防災(zāi)的倡議書范文(30篇)
- 中學(xué)語(yǔ)文教學(xué)工作總結(jié)范文(35篇)
- 幼兒園美術(shù)活動(dòng)總結(jié)
- 證婚人簡(jiǎn)短致辭稿
- 酒精戒斷綜合癥的護(hù)理
- (高清版)TDT 1037-2013 土地整治重大項(xiàng)目可行性研究報(bào)告編制規(guī)程
- 山東省青島市市南區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期中數(shù)學(xué)試題
- 愛(ài)國(guó)衛(wèi)生工作培訓(xùn)課件
- 與某地政府醫(yī)療領(lǐng)域合作框架協(xié)議
- 外賣騎手勞動(dòng)權(quán)益保障機(jī)制
- 卵巢癌腹腔化療方案
- 雙層罐改造施工方案
- 腫瘤放射規(guī)培出科小結(jié)
- 光通信芯片十大品牌簡(jiǎn)介
- 小學(xué)勞動(dòng)教育一年級(jí)第一單元2《洗漱》教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論