版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第5章 單片機(jī)的開(kāi)關(guān)檢測(cè)、鍵盤(pán)輸入 與顯示的接口設(shè)計(jì) 1 單片機(jī)系統(tǒng)顯示及開(kāi)關(guān)檢測(cè)、鍵盤(pán)輸入是其基本功能。本章介紹單片機(jī)與顯示器件、開(kāi)關(guān)及鍵盤(pán)的接口設(shè)計(jì)與軟件編程。5.1 單片機(jī)控制發(fā)光二極管顯示 發(fā)光二極管常用來(lái)指示系統(tǒng)工作狀態(tài),制作節(jié)日彩燈、廣告牌匾等。 大部分發(fā)光二極管工作電流15mA之間,其內(nèi)阻為20100。電流越大,亮度也越高。 為保證發(fā)光二極管正常工作,同時(shí)減少功耗,限流電阻選擇十分重要,若供電電壓為+5V,則限流電阻可選13k。25.1.1 單片機(jī)與發(fā)光二極管的連接 第2章已介紹,P0口作通用I/O用,由于漏極開(kāi)路,需外接上拉電阻。而P1P3口內(nèi)部有30k左右上拉電阻。 下面討
2、論P(yáng)1P3口如何與LED發(fā)光二極管驅(qū)動(dòng)連接問(wèn)題。 單片機(jī)并行端口P1P3直接驅(qū)動(dòng)發(fā)光二極管,電路見(jiàn)圖5-1。與P1、P2、P3口相比,P0口每位可驅(qū)動(dòng)8個(gè)LSTTL輸入,而P1P3口每一位驅(qū)動(dòng)能力,只有P0口一半。3圖5-1 發(fā)光二極管與單片機(jī)并行口的連接4 當(dāng)P0口某位為高電平時(shí),可提供400A的拉電流;當(dāng)P0口某位為低電平(0.45V)時(shí),可提供3.2mA的灌電流,而P1P3口內(nèi)有30k左右上拉電阻,如高電平輸出,則從P1、P2和P3口輸出的拉電流Id僅幾百A,驅(qū)動(dòng)能力較弱,亮度較差,見(jiàn)圖5-1(a)。 如端口引腳為低電平,能使灌電流Id從單片機(jī)外部流入內(nèi)部,則將大大增加流過(guò)的灌電流值,見(jiàn)
3、圖5-1(b)。AT89S51任一端口要想獲得較大的驅(qū)動(dòng)能力,要用低電平輸出。如一定要高電平驅(qū)動(dòng),可在單片機(jī)與發(fā)光二極管間加驅(qū)動(dòng)電路,如74LS04、74LS244等。565.1.2 I/O端口的編程舉例 對(duì)I/O端口編程控制時(shí),要對(duì)I/O端口特殊功能寄存器聲明,在C51的編譯器中,這項(xiàng)聲明包含在頭文件reg51.h中,編程時(shí),可通過(guò)預(yù)處理命令#include,把這個(gè)頭文件包含進(jìn)去。下面通過(guò)案例介紹如何編程對(duì)發(fā)光二極管輸出控制。7 【例5-1】 制作流水燈,原理電路見(jiàn)圖5-2,8個(gè)發(fā)光二極管LED0LED7經(jīng)限流電阻分別接至P1口的P1.0P1.7引腳上,陽(yáng)極共同接高電平。編寫(xiě)程序來(lái)控制發(fā)光二
4、極管由上至下的反復(fù)循環(huán)流水點(diǎn)亮,每次點(diǎn)亮一個(gè)發(fā)光二極管。參考程序:#include #include /包含移位函數(shù)_crol_( )的頭文件#define uchar unsigned char #define uint unsigned int void delay(uint i) /延時(shí)函數(shù)uchar t; while (i-) 89圖5-2 單片機(jī)控制的流水燈for(t=0;t120;t+);void main( )/主程序P1=0 xfe;/向P1口送出點(diǎn)亮數(shù)據(jù) while (1) delay( 500 ); /500為延時(shí)參數(shù),可根據(jù)實(shí)際需要調(diào)整P1=_crol_(P1,1) ;
5、/ 函數(shù)_crol_(P1,1)把P1中的數(shù)據(jù)循環(huán)左移1位 10程序說(shuō)明:(1)while(1) 兩種用法:“while(1);”: while(1)后有分號(hào),是使程序停留在這指令上;“while(1) ;”:反復(fù)循環(huán)執(zhí)行大括號(hào)內(nèi)程序段,本例用法,即控制流水燈反復(fù)循環(huán)顯示。 (2)C51函數(shù)庫(kù)中的循環(huán)移位函數(shù):循環(huán)移位函數(shù)包括: 循環(huán)左移函數(shù)“_crol_” 循環(huán)右移函數(shù)“_cror_”。 本例用循環(huán)左移 “_crol_(P1,1)”,函數(shù)。括號(hào)第1個(gè)參數(shù)為循環(huán)左移對(duì)象,即對(duì)P1中的內(nèi)容循環(huán)左移;第2個(gè)參數(shù)為左移位數(shù),即左移1位。編程中一定要把含有移位函數(shù)的頭文件intrins.h包含在內(nèi),例
6、如第2行“#include ”。11在【例5-1】基礎(chǔ)上,編寫(xiě)控制發(fā)光二極管反復(fù)循環(huán)點(diǎn)亮的流水燈。 【例5-2】電路見(jiàn)圖5-2,制作由上至下再由下至上反復(fù)循環(huán)點(diǎn)亮顯示的流水燈,3種方法實(shí)現(xiàn)。(1)數(shù)組的字節(jié)操作實(shí)現(xiàn) 建立1個(gè)字符型數(shù)組,將控制8個(gè)LED顯示的8位數(shù)據(jù)作為數(shù)組元素,依次送P1口。參考程序:#include #define uchar unsigned charuchar tab = 0 xfe , 0 xfd , 0 xfb , 0 xf7 , 0 xef , 0 xdf , 0 xbf , 0 x7f , 0 x7f , 0 xbf , 0 xdf , 0 xef , 0 xf
7、7 , 0 xfb , 0 xfd , 0 xfe ; /*前8個(gè)數(shù)據(jù)為左移點(diǎn)亮 數(shù)據(jù),后8個(gè)為右移點(diǎn)亮數(shù)據(jù)*/12void delay( )uchar i,j; for(i=0; i255; i+) for(j=0; j255; j+);void main( )/主函數(shù)uchar i; while (1) for(i=0;i”、“”,把送P1口顯示控制數(shù)據(jù)進(jìn)行移位,從而實(shí)現(xiàn)發(fā)光二極管依次點(diǎn)亮。參考程序:#include #define uchar unsigned char void delay( )uchar i,j; for(i=0; i255; i+) for(j=0; j255; j
8、+);void main( )/主函數(shù)uchar i,temp; while (1) 14 temp=0 x01;/左移初值賦給tempfor(i=0; i8; i+) P1=temp;/ temp中的數(shù)據(jù)取反后送P1口 delay( );/ 延時(shí) temp=temp1; / temp 中數(shù)據(jù)左移一位 temp=0 x80; / 賦右移初值給temp for(i=0; i1; / temp 中數(shù)據(jù)右移一位 15 程序說(shuō)明: 注意使用移位運(yùn)算符“”、“”與使用循環(huán)左移函數(shù)“_crol_”和循環(huán)右移函數(shù)“_cror_” 區(qū)別。左移移位運(yùn)算“”是將低位丟棄,高位補(bǔ)0。而循環(huán)左移函數(shù)“_crol_”
9、是將移出的高位再補(bǔ)到低位,即循環(huán)移位;同理循環(huán)右移函數(shù)“_cror_” 是將移出的低位再補(bǔ)到高位。(3)用循環(huán)左、右移位函數(shù)實(shí)現(xiàn) 使用C51提供的庫(kù)函數(shù),即循環(huán)左移n位函數(shù)和循環(huán)右移n位函數(shù),控制發(fā)光二極管點(diǎn)亮。參考程序:#include #include /包含循環(huán)左、右移位函數(shù)的頭文件#define uchar unsigned char16void delay( )uchar i,j; for(i=0; i255; i+)for(j=0; j255; j+);void main( )/ 主函數(shù)uchar i,temp; while (1) temp=0 xfe; / 初值為1111111
10、0 for(i=0; i7; i+) 17 P1=temp;/ temp中的點(diǎn)亮數(shù)據(jù)送P1口,控制點(diǎn)亮顯示 delay( ); / 延時(shí) temp=_crol_( temp,1) ;/ temp 數(shù)據(jù)循環(huán)左移1位 for(i=0; i7; i+) P1=temp;/ temp中的數(shù)據(jù)送P1口輸出 delay( ); / 延時(shí) temp=_cror_( temp,1) ;/temp中數(shù)據(jù)循環(huán)右移1位 18195.2 開(kāi)關(guān)狀態(tài)檢測(cè) 讀入I/O端口電平,即可檢測(cè)開(kāi)關(guān)處于閉合狀態(tài)還是打開(kāi)狀態(tài)。5.2.1 開(kāi)關(guān)檢測(cè)案例1 用I/O端口來(lái)進(jìn)行開(kāi)關(guān)狀態(tài)檢測(cè),開(kāi)關(guān)一端接到I/O端口引腳上,并通過(guò)上拉電阻接+5
11、V上,開(kāi)關(guān)另一端接地,當(dāng)開(kāi)關(guān)打開(kāi)時(shí),I/O引腳為高電平,當(dāng)開(kāi)關(guān)閉合時(shí),I/O引腳為低電平。20圖5-3 開(kāi)關(guān)、LED發(fā)光二極管與P1口的連接21 【例5-3】 如圖5-3,單片機(jī)的P1.4P1.7接4個(gè)開(kāi)關(guān)S0S3,P1.0P1.3接4個(gè)發(fā)光二極管LED0LED3。 編程將P1.4P1.7上的4個(gè)開(kāi)關(guān)狀態(tài)反映在P1.0P1.3引腳控制的4個(gè)發(fā)光二極管上,開(kāi)關(guān)閉合,對(duì)應(yīng)發(fā)光二極管點(diǎn)亮。 例如P1.4腳上開(kāi)關(guān)S0狀態(tài),由P1.0腳上LED0顯示,P1.6引腳上開(kāi)關(guān)S2狀態(tài),由P1.2腳的LED2顯示。 22參考程序如下:#include #define uchar unsigned charvoi
12、d delay( ) /延時(shí)函數(shù)uchar i,j; for(i=0; i255; i+)for(j=0; j4; /temp內(nèi)容右移4位,P1口高4位移至低4位 23P1=temp;/ temp中的數(shù)據(jù)送P1口輸出delay(); 5.2.2 開(kāi)關(guān)檢測(cè)案例2 【例5-4】 如圖5-4,P1.0和P1.1引腳接有兩只開(kāi)關(guān)S0和S1,兩引腳上的高低電平共4種組合,4種組合分別點(diǎn)亮P2.0P2.3引腳控制的4只LED,即S0、S1均閉合,LED0亮,其余滅;S1閉合、S0打開(kāi),LED1亮,其余滅;S0閉合、S1打開(kāi),LED2亮,其余滅;S0、S1均打開(kāi),LED3亮,其余滅。編程實(shí)現(xiàn)此功能。 參考程
13、序:2425圖5-4 開(kāi)關(guān)檢測(cè)指示器2接口電路與仿真 #include / 包含頭文件reg51.h void main( ) /主函數(shù)main( )char state; do P1=0 xff;/ P1口為輸入 state=P1;/ 讀入P1口的狀態(tài),送入state state=state&0 x03; / 屏蔽P1口的高6位 switch (state)/ 判P1口低2位開(kāi)關(guān)狀態(tài) case 0: P2=0 x01; break;/ P1.1、P1.0=00,點(diǎn)亮P2.0腳LED case 1: P2=0 x02; break;/ P1.1、P1.0=01,點(diǎn)亮P2.1腳LED case
14、2: P2=0 x04; break;/ P1.1、P1.0=10,點(diǎn)亮P2.2腳LED case 3: P2=0 x08; break;/ P1.1、P1.0=11,點(diǎn)亮P2.3腳LED while ( 1 );26 程序段中用到循環(huán)結(jié)構(gòu)控制語(yǔ)句do-while以及switch-case語(yǔ)句。275.3 單片機(jī)控制LED數(shù)碼管的顯示5.3.1 LED數(shù)碼管顯示原理 LED數(shù)碼管: “8”字型,7段(不包括小數(shù)點(diǎn))或8段(包括小數(shù)點(diǎn)),每段對(duì)應(yīng)一個(gè)發(fā)光二極管,共陽(yáng)極和共陰極兩種,見(jiàn)圖5-5。 共陽(yáng)極:數(shù)碼管的陽(yáng)極連接在一起,接+5V; 共陰極:數(shù)碼管陰極連在一起接地。 對(duì)于共陰極數(shù)碼管,當(dāng)某發(fā)
15、光二極管陽(yáng)極為高電平時(shí),發(fā)光二極管點(diǎn)亮,相應(yīng)段被顯示。同樣,共陽(yáng)極數(shù)碼管陽(yáng)極連在一起,公共陽(yáng)極接+5V,當(dāng)某個(gè)發(fā)光二極管陰極接低電平時(shí),該發(fā)光二極管被點(diǎn)亮,相應(yīng)段被顯示。2829圖5-5 8段LED數(shù)碼管結(jié)構(gòu)及外形 為使LED數(shù)碼管顯示不同字符,要把某些段點(diǎn)亮,就要為數(shù)碼管各段提供一字節(jié)的二進(jìn)制碼,即字型碼(也稱段碼)。習(xí)慣上以“a”段對(duì)應(yīng)字型碼字節(jié)的最低位。各字符段碼見(jiàn)表5-1。3031 如要在數(shù)碼管顯示某字符,只需將該字符字型碼加到各段上即可。 例如某存儲(chǔ)單元中的數(shù)為“02H”,想在共陽(yáng)極數(shù)碼管上顯示“2”,需要把“2”的字型碼“A4H”加到數(shù)碼管各段。 將欲顯示字符的字型碼作成一個(gè)表(數(shù)
16、組),根據(jù)顯示字符從表中查找到相應(yīng)字型碼,然后把該字型碼輸出數(shù)碼管各個(gè)段上,同時(shí)數(shù)碼管的公共端接+5V,此時(shí)在數(shù)碼管上顯示字符“2”。 下面介紹單片機(jī)如何控制LED數(shù)碼管顯示字符。 【例5-5】利用單片機(jī)控制一個(gè)8段LED數(shù)碼管先循環(huán)顯示單個(gè)偶數(shù):0、2、4、6、8,再顯示單個(gè)奇數(shù):1、3、5、7、9,如此反復(fù)循環(huán)顯示。 本例原理電路及仿真結(jié)果,見(jiàn)圖5-6。 參考程序如下:32圖5-6 控制數(shù)碼管循環(huán)顯示單個(gè)數(shù)字的電路及仿真33#include reg51.h#include intrins.h#define uchar unsigned char#define uint unsigned i
17、nt#define out P0uchar code seg=0 xc0,0 xa4,0 x99,0 x82,0 x80,0 xf9,0 xb0,0 x92,0 xf8,0 x90,0 x01; /共陽(yáng)極段碼表void delayms(uint); void main(void)uchar i;while(1)out=segi;delayms(900);i+;if(segi=0 x01)i=0; / 如段碼為0 x01,則循環(huán)顯示結(jié)束34void delayms(uint j)/ 延時(shí)函數(shù)uchar i;for(;j0;j-) i=250; while(-i); i=249; while(-i
18、); 說(shuō)明:語(yǔ)句“if(segi=0 x01)i=0; ” 含義:如果欲送出的數(shù)組元素為0 x01(數(shù)字“9”段碼0 x90的下一個(gè)元素,即結(jié)束碼),表明一個(gè)循環(huán)顯示已結(jié)束,則i=0,則重新開(kāi)始循環(huán)顯示,從段碼數(shù)組表的第一個(gè)元素seg0,即段碼0 xc0(數(shù)字0)重新開(kāi)始顯示。35365.3.2 LED數(shù)碼管的靜態(tài)顯示與動(dòng)態(tài)顯示 兩種顯示方式:靜態(tài)顯示和動(dòng)態(tài)顯示。1. 靜態(tài)顯示方式 無(wú)論多少位LED數(shù)碼管,都同時(shí)處于顯示狀態(tài)。 多位LED數(shù)碼管工作于靜態(tài)顯示方式時(shí),各位共陰極(或共陽(yáng)極)連接在一起并接地(或接+5V);每位數(shù)碼管段碼線(adp)分別與一個(gè)8位I/O口鎖存器輸出相連。如果送往各個(gè)
19、LED數(shù)碼管所顯示字符的段碼一經(jīng)確定,則相應(yīng)I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入下一個(gè)顯37示字符段碼。靜態(tài)顯示方式顯示無(wú)閃爍,亮度較高,軟件控制較易。 圖5-7為4位LED數(shù)碼管靜態(tài)顯示電路,各數(shù)碼管可獨(dú)立顯示,只要向控制各位I/O口鎖存器送相應(yīng)顯示段碼,該位就能保持相應(yīng)的顯示字符。 這樣在同一時(shí)間,每一位顯示的字符可各不相同。靜態(tài)顯示方式占用I/O口端口線較多。圖5-7電路,要占用4個(gè)8位I/O口(或鎖存器)。如數(shù)碼管數(shù)目增多,則需增加I/O口數(shù)目。38圖5-7 4位LED靜態(tài)顯示的示意圖39 【例5-6】單片機(jī)控制2只數(shù)碼管,靜態(tài)顯示2個(gè)數(shù)字“27”。 原理電路見(jiàn)圖5-8。
20、單片機(jī)用P0口與P1口,分別控制加到兩個(gè)數(shù)碼管DS0與DS1的段碼,而共陽(yáng)極數(shù)碼管DS0與DS1的公共端(公共陽(yáng)極端)直接接至+5V,因此數(shù)碼管DS0與DS1始終處于導(dǎo)通狀態(tài)。利用P0口與P1口帶有的鎖存功能,只需向單片機(jī)P0口與P1口分別寫(xiě)入相應(yīng)的顯示字符“2”和“7”的段碼即可。 由于一個(gè)數(shù)碼管就占用一個(gè)I/O端口。如果數(shù)碼管數(shù)目增多,則需增加I/O口,但軟件編程要簡(jiǎn)單的多。40圖5-8 2位數(shù)碼管靜態(tài)顯示的原理電路與仿真41參考程序如下:#include /包含8051單片機(jī)寄存器定義的頭文件void main(void) P0=0 xa4;/將數(shù)字2的段碼送P0口 P1=0 xf8;/
21、將數(shù)字7的段碼送P1口 while(1)/無(wú)限循環(huán) ; 4243 2. 動(dòng)態(tài)顯示方式 顯示位數(shù)較多時(shí),靜態(tài)顯示所占的I/O口多,這時(shí)常采用動(dòng)態(tài)顯示。為節(jié)省I/O口,通常將所有顯示器段碼線相應(yīng)段并聯(lián)在一起,由一個(gè)8位I/O口控制,各顯示位公共端分別由另一單獨(dú)I/O口線控制。4445圖5-9 4位LED數(shù)碼管動(dòng)態(tài)顯示示意圖 圖5-9:4位8段LED動(dòng)態(tài)顯示器電路示意圖。其中單片機(jī)發(fā)出的段碼占用1個(gè)8位I/O(1)端口,而位選控制使用I/O(2)端口中4位口線。 動(dòng)態(tài)顯示就是單片機(jī)向段碼線輸出欲顯示字符的段碼。每一時(shí)刻,只有1位位選線有效,即選中某一位顯示,其他各位位選線都無(wú)效。每隔一定時(shí)間逐位輪流
22、點(diǎn)亮各數(shù)碼管(掃描方式),由于數(shù)碼管余輝和人眼的“視覺(jué)暫留”作用,只要控制好每位數(shù)碼管顯示時(shí)間和間隔,則可造成“多位同時(shí)亮”的假象,達(dá)到同時(shí)顯示效果。 各位數(shù)碼管輪流點(diǎn)亮的時(shí)間間隔(掃描間隔)應(yīng)根據(jù)實(shí)際情況定。發(fā)光二極管從導(dǎo)通到發(fā)光有一定的延時(shí),如果點(diǎn)亮?xí)r間太短,發(fā)光太弱,46人眼無(wú)法看清;時(shí)間太長(zhǎng),產(chǎn)生閃爍現(xiàn)象,且此時(shí)間越長(zhǎng),占用單片機(jī)時(shí)間也越多。另外,顯示位數(shù)增多,也將占用單片機(jī)大量時(shí)間,因此動(dòng)態(tài)顯示實(shí)質(zhì)是以執(zhí)行程序時(shí)間來(lái)?yè)Q取I/O端口減少。下面是動(dòng)態(tài)顯示實(shí)例。 【例5-7】 8只數(shù)碼管,分別滾動(dòng)顯示單個(gè)數(shù)字18。程序運(yùn)行后,單片機(jī)控制左邊第1個(gè)數(shù)碼管顯示1,其他不顯示,延時(shí)之后,控制左邊
23、第2個(gè)數(shù)碼管顯示1,其他不顯示,直至第8個(gè)數(shù)碼管顯示8,其他不顯示,反復(fù)循環(huán)上述過(guò)程。47 動(dòng)態(tài)顯示電路見(jiàn)圖5-10,P0口輸出段碼,P2口輸出掃描的位控碼,通過(guò)由8個(gè)NPN晶體管的位驅(qū)動(dòng)電路對(duì)8個(gè)數(shù)碼管位控掃描。即使掃描速度加快,由于是虛擬仿真,數(shù)碼管的余輝也不能像實(shí)際電路那樣體現(xiàn)出來(lái)。 如對(duì)本例實(shí)際硬件顯示電路進(jìn)行快速掃描,由于數(shù)碼管余輝和人眼 “視覺(jué)暫留”作用,只要控制好每位數(shù)碼管顯示的時(shí)間和間隔,則可造成“多位同時(shí)亮” 假象,達(dá)到同時(shí)顯示效果。 但虛擬仿真做不到這一點(diǎn)。仿真運(yùn)行下,只能是一位一位點(diǎn)亮顯示,不能看到同時(shí)顯示效果,但本例使我們了解動(dòng)態(tài)掃描顯示實(shí)際過(guò)程。如采用實(shí)際硬件電路,用
24、軟件控制快速掃描,可看到“多位同時(shí)點(diǎn)亮” 效果。48圖5-10 8只數(shù)碼管分別滾動(dòng)顯示單個(gè)數(shù)字1849參考程序如下:#include#include#define uchar unsigned char#define uint unsigned intuchar code dis_code=0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 xc0; /共陽(yáng)數(shù)碼管段碼表void delay(uint t)/延時(shí)函數(shù)uchar i;while(t-) for(i=0;i200;i+);void main()uchar i,j
25、=0 x80; /j中為位控碼50 while(1) for(i=0;i8;i+) j=_crol_(j,1);/_crol_(j,1)為將對(duì)象j循環(huán)左移1位 P0=dis_codei;/P0口輸出段碼 P2=j;/P2口輸出位控碼 delay(180);/延時(shí),控制每位顯示的時(shí)間 51525.4 單片機(jī)控制LED點(diǎn)陣顯示器顯示 LED點(diǎn)陣顯示器應(yīng)用非常廣泛,在許多公共場(chǎng)合,如商場(chǎng)、銀行、車站、機(jī)場(chǎng)、醫(yī)院隨處可見(jiàn)。不僅能顯示文字、圖形,還能播放動(dòng)畫(huà)、圖像、視頻等信號(hào)。 LED點(diǎn)陣顯示器分為圖文顯示器和視頻顯示器,有單色顯示,還有彩色顯示。下面僅介紹單片機(jī)如何來(lái)控制單色LED點(diǎn)陣顯示器的顯示。5
26、.4.1 LED點(diǎn)陣顯示器結(jié)構(gòu)與顯示原理 由若干個(gè)發(fā)光二極管按矩陣方式排列而成。陣列點(diǎn)數(shù)可分為57、58、68、88點(diǎn)陣;按發(fā)光顏色可分為單色、雙色、三色;按極性排列可分為共陰極和共陽(yáng)極。531. LED點(diǎn)陣結(jié)構(gòu) 以88LED點(diǎn)陣顯示器為例,外形見(jiàn)圖5-11,內(nèi)部結(jié)構(gòu)見(jiàn)圖5-12,由64個(gè)發(fā)光二極管組成,且每個(gè)發(fā)光二極管是處于行線(R0R7)和列線(C0C7)之間交叉點(diǎn)上。2. LED點(diǎn)陣顯示原理 顯示的字符由一個(gè)個(gè)點(diǎn)亮的LED所構(gòu)成。 由圖5-12點(diǎn)亮點(diǎn)陣中一個(gè)發(fā)光二極管條件:對(duì)應(yīng)行為高電平,對(duì)應(yīng)列為低電平。如在很短時(shí)間內(nèi)依次點(diǎn)亮很多個(gè)發(fā)光二極管,LED點(diǎn)陣就可顯示一個(gè)穩(wěn)定字符、數(shù)字或其他圖
27、形。控制LED點(diǎn)陣顯示器顯示,實(shí)質(zhì)就是54圖5-11 88 LED點(diǎn)陣顯示器外形 55圖5-12 88LED點(diǎn)陣顯示器(共陰極)的結(jié)構(gòu)56控制加到行線和列線上編碼,控制點(diǎn)亮某些發(fā)光二極管(點(diǎn)),從而顯示出由不同發(fā)光點(diǎn)組成的各種字符。 1616 LED點(diǎn)陣顯示器的結(jié)構(gòu)與88LED點(diǎn)陣顯示模塊內(nèi)部結(jié)構(gòu)及顯示原理是類似的,只不過(guò)行和列均為16。1616是由4個(gè)88 LED點(diǎn)陣組成,且每個(gè)發(fā)光二極管也是放置在行線和列線的交叉點(diǎn)上,當(dāng)對(duì)應(yīng)某一列置0電平,某一行置1電平時(shí),該發(fā)光二極管點(diǎn)亮。 下面以顯示字符“子”為例,見(jiàn)圖5-13。57圖5-13 1616 LED點(diǎn)陣顯示器顯示字符“子”58 顯示過(guò)程如下
28、: 先給LED點(diǎn)陣的第1行送高電平(行線高電平有效),同時(shí)給所有列線送高電平(列線低電平有效),從而第1行發(fā)光二極管全滅; 延時(shí)一段時(shí)間后,再給第2行送高電平,同時(shí)給所有列線送“1100 0000 0000 1111”,列線為0的發(fā)光二極管點(diǎn)亮,從而點(diǎn)亮10個(gè)發(fā)光二極管,顯示出漢字“子”的第一橫; 延時(shí)一段時(shí)間后,再給第3行送高電平,同時(shí)加到列線的編碼為“1111 1111 1101 1111”,點(diǎn)亮1個(gè)發(fā)光二極管; ; 延時(shí)一段時(shí)間后,再給第16行送高電平,同時(shí)給列線送“1111 1101 1111 1111” ,顯示出漢字“子”的最下面的一行,點(diǎn)亮1個(gè)發(fā)光二極管。然后再重新循環(huán)上述操作,利
29、用人眼視覺(jué)暫留效應(yīng),一個(gè)穩(wěn)定字符“子” 顯示出來(lái),見(jiàn)圖5-13。59605.4.2 控制1616 LED點(diǎn)陣顯示屏的案例 單片機(jī)控制1616點(diǎn)陣顯示屏顯示字符案例。 【例5-8】如圖5-14,利用單片機(jī)及 74LS154(4-16譯碼器)、74LS07、1616 LED點(diǎn)陣顯示屏來(lái)實(shí)現(xiàn)字符顯示,編寫(xiě)程序,循環(huán)顯示字符“電子技術(shù)”。 圖中1616 LED點(diǎn)陣顯示屏16行行線R0R15電平,由P1口低4位經(jīng)4-16譯碼器74HC154的16條譯碼輸出線L0L15經(jīng)驅(qū)動(dòng)后的輸出來(lái)控制。16列列線C0C15的電平由P0口和P2口控制。剩下問(wèn)題是如何確定顯示字符的點(diǎn)陣編碼,以及控制好每一屏逐行顯示的掃描
30、速度(刷新頻率)。 61圖5-14 控制1616LED點(diǎn)陣顯示器(共陰極)顯示字符 62參考程序如下:#include#define uchar unsigned char#define uint unsigned int#define out0 P0#define out2 P2 #define out1 P1void delay(uint j)/延時(shí)函數(shù)uchar i=250; for(;j0;j-) while(-i); i=100; 63uchar code string= /漢字“電” 1616點(diǎn)陣列碼0 x7F,0 xFF,0 x7F,0 xFF,0 x7F,0 xFF,0 x03
31、,0 xE0,0 x7B,0 xEF,0 x7B,0 xEF,0 x03,0 xE0,0 x7B,0 xEF,0 x7B,0 xEF,0 x7B,0 xEF,0 x03,0 xE0,0 x7B,0 xEF,0 x7F,0 xBF,0 x7F,0 xBF,0 xFF,0 x00,0 xFF,0 xFF /漢字“子” 1616點(diǎn)陣列碼0 xFF,0 xFF,0 x03,0 xF0,0 xFF,0 xFB,0 xFF,0 xFD,0 xFF,0 xFE,0 x7F,0 xFF,0 x7F,0 xFF,0 x7F,0 xDF,0 x00,0 x80,0 x7F,0 xFF,0 x7F,0 xFF,0
32、x7F,0 xFF,0 x7F,0 xFF,0 x7F,0 xFF,0 x5F,0 xFF,0 xBF,0 xFF/漢字“技” 1616點(diǎn)陣列碼0 xF7,0 xFB,0 xF7,0 xFB,0 xF7,0 xFB,0 x40,0 x80,0 xF7,0 xFB,0 xD7,0 xFB,0 x67,0 xC0,0 x73,0 xEF,0 xF4,0 xEE,0 xF7,0 xF6,0 xF7,0 xF9,0 xF7,0 xF9,0 xF7,0 xF6,0 x77,0 x8F,0 x95,0 xDF,0 xFB,0 xFF64/漢字“術(shù)”的1616點(diǎn)陣的列碼0 x7F,0 xFF,0 x7F,0
33、 xFB,0 x7F,0 xF7,0 x7F,0 xFF,0 x00,0 x80,0 x7F,0 xFF,0 x3F,0 xFE,0 x5F,0 xFD,0 x5F,0 xFB,0 x6F,0 xF7,0 x77,0 xE7,0 x7B,0 x8F,0 x7C,0 xDF,0 x7F,0 xFF,0 x7F,0 xFF,0 xFF,0 xFF, ;void main()uchar i,j,n;while(1) for(j=0;j4;j+)/共顯示4個(gè)漢字 65for(n=0;n40;n+)/每個(gè)漢字整屏掃描40次 for(i=0;i16;i+) /逐行掃描16行out1=i%16;/輸出行碼,
34、 out0=stringi*2+j*32; /輸出列碼到C0C7,逐行掃描out2=stringi*2+1+j*32; /輸出列碼到C8C15,逐行掃描 delay(4);/顯示并延時(shí)一段時(shí)間 out0=0 xff; /列線C0C7為高電平,熄滅發(fā)光二極管 out2=0 xff; /列線C8C15為高電平,熄滅發(fā)光二極管 66 掃描顯示時(shí),單片機(jī)通過(guò)P1口低4位經(jīng)4-16譯碼器74HC154的16條譯碼輸出線L0L15經(jīng)驅(qū)動(dòng)后的輸出來(lái)控制,逐行為高電平,來(lái)進(jìn)行掃描。由P0口與P2口控制列碼的輸出,從而顯示出某行應(yīng)點(diǎn)亮的發(fā)光二極管。 以顯示漢字“子”為例,說(shuō)明顯示過(guò)程。由上面程序可看出,漢字“子
35、”的前3行發(fā)光二級(jí)管的列碼為“0 xFF,0 xFF,0 x03,0 xF0,0 xFF,0 xFB,”第一行列碼為:“ 0 xff,0 xff”,由P0口與P2口輸出,無(wú)點(diǎn)亮的發(fā)光二極管。第二行列碼為:“0 x03,0 xf0”,通過(guò)P0口與P2口輸出后,由圖5-13看出,0 x03加到列線C7C0的二進(jìn)制編碼為“0000 0011”,這里要注意加到8個(gè)發(fā)光二極管上的對(duì)應(yīng)位置。67 按照?qǐng)D5-12和圖5-14連線關(guān)系,加到從左到右發(fā)光二極管應(yīng)為C0 C7的二進(jìn)制編碼為“1100 0000”,即最左邊的2個(gè)發(fā)光二極管不亮,其余的6個(gè)發(fā)光二極管點(diǎn)亮。 同理,P2口輸出的0 xF0加到列線C15
36、C8的二進(jìn)制編碼為“1111 0000”,即加到C8C15的二進(jìn)制編碼為“0000 1111”,所以第2行的最右邊的4個(gè)發(fā)光二極管不亮,如圖5-13所示。 對(duì)應(yīng)通過(guò)P0口與P2口輸出加到第3行16個(gè)發(fā)光二極管的列碼為“0 xFF,0 xFB,”,對(duì)應(yīng)于從左到右的C0 C15的二進(jìn)制編碼為“1111 1111 1101 1111”,從而第3行左邊數(shù)第11個(gè)發(fā)光二極管被點(diǎn)亮,其余均熄滅,如圖5-13所示。其余各行點(diǎn)亮的發(fā)光二極管,也是由1616點(diǎn)陣的列碼來(lái)決定。68695.5 單片機(jī)控制液晶顯示模塊1602 LCD的顯示 液晶顯示器LCD (Liquid Crystal Display)具有省電、
37、體積小、抗干擾能力強(qiáng)等優(yōu)點(diǎn), LCD顯示器分為字段型、字符型和點(diǎn)陣圖形型。 (1)字段型。以長(zhǎng)條狀組成字符顯示,主要用于數(shù)字顯示,也可用于顯示西文字母或某些字符,廣泛用于電子表、計(jì)算器、數(shù)字儀表中。 (2)字符型。專門(mén)用于顯示字母、數(shù)字、符號(hào)等。一個(gè)字符由57或510的點(diǎn)陣組成,在單片機(jī)系統(tǒng)中已廣泛使用。 (3)點(diǎn)陣圖形型。廣泛用于圖形顯示,如筆記本電腦、彩色電視和游戲機(jī)等。它是在平板上排列的多行列的矩陣式的晶格點(diǎn),點(diǎn)大小與多少?zèng)Q定了顯示的清晰度。705.5.1 LCD 1602液晶顯示模塊簡(jiǎn)介 單片機(jī)系統(tǒng)中常用的字符型液晶顯示模塊。由于LCD顯示面板較為脆弱,廠商已將LCD控制器、驅(qū)動(dòng)器、R
38、AM 、ROM和液晶顯示器用PCB連接到一起,稱為液晶顯示模塊LCM (LCd Module),購(gòu)買(mǎi)現(xiàn)成的即可。單片機(jī)只需向LCD顯示模塊寫(xiě)入相應(yīng)命令和數(shù)據(jù)就可顯示需要的內(nèi)容。1字符型液晶顯示模塊LCD 1602特性與引腳 字符型LCD模塊常用的有16字1行、16字2行、20字2行、20字4行等模塊,型號(hào)常用1602、1604、2002、2004來(lái)表示,其中為商標(biāo)名稱,16代表液晶顯示器每行可顯示16個(gè)字符,02表示顯示2行。 LCD1602內(nèi)有字符庫(kù)ROM(CGROM),能顯示出192個(gè)字符(57點(diǎn)陣),如圖5-15所示。71圖5-15 ROM字符庫(kù)的內(nèi)容 72 顯示器顯示的數(shù)字和字母部分代
39、碼,恰是ASCII碼表中編碼。 控制LCD 1602顯示字符,只需將待顯示字符的ASCII碼寫(xiě)入顯示數(shù)據(jù)存儲(chǔ)器(DDRAM),內(nèi)部控制電路就可將字符在顯示器上顯示出來(lái)。 例如,顯示字符“A”,單片機(jī)只需將字符“A”的ASCII碼41H寫(xiě)入DDRAM,控制電路就會(huì)將對(duì)應(yīng)的字符庫(kù)ROM(CGROM)中的字符“A”的點(diǎn)陣數(shù)據(jù)找出來(lái)顯示在LCD上。 模塊內(nèi)有80字節(jié)數(shù)據(jù)顯示RAM (DDRAM),除顯示192個(gè)字符(57點(diǎn)陣)的字符庫(kù)ROM(CGROM)外,還有64字節(jié)的自定義字符RAM(CGRAM),用戶可自行定義8個(gè)57點(diǎn)陣字符。73 (a) LCD 1602的外形 (b) LCD 1602的引腳
40、圖5-16 LCD 1602外形及引腳LCD 1602工作電壓4.55.5V,典型5V,工作電流2mA。標(biāo)準(zhǔn)的14引腳(無(wú)背光)或16個(gè)引腳(有背光)的外形及引腳分布如圖5-16所示。74 引腳包括8條數(shù)據(jù)線、3條控制線和3條電源線,見(jiàn)表5-2。通過(guò)單片機(jī)向模塊寫(xiě)入命令和數(shù)據(jù),就可對(duì)顯示方式和顯示內(nèi)容做出選擇。752LCD1602字符的顯示及命令字 顯示字符首先要解決待顯示字符的ASCII碼產(chǎn)生。用戶只需在C51程序中寫(xiě)入欲顯示的字符常量或字符串常量,C51程序在編譯后會(huì)自動(dòng)生成其標(biāo)準(zhǔn)的ASCII碼,然后將生成的ASCII碼送入顯示用數(shù)據(jù)存儲(chǔ)器DDRAM,內(nèi)部控制電路就會(huì)自動(dòng)將該ASCII碼對(duì)
41、應(yīng)的字符在LCD1602顯示出來(lái)。 讓液晶顯示器顯示字符,首先對(duì)其進(jìn)行初始化設(shè)置:對(duì)有、無(wú)光標(biāo)、光標(biāo)移動(dòng)方向、光標(biāo)是否閃爍及字符移動(dòng)方向等進(jìn)行設(shè)置,才能獲得所需顯示效果。 對(duì)LCD 1602的初始化、讀、寫(xiě)、光標(biāo)設(shè)置、顯示數(shù)據(jù)的指針設(shè)置等,都是單片機(jī)向LCD 1602寫(xiě)入命令字來(lái)實(shí)現(xiàn)。命令字見(jiàn)表5-3。 7677表5-3中11個(gè)命令功能說(shuō)明如下:命令1:清屏,光標(biāo)返回地址00H位置(顯示屏的左上方)。命令2:光標(biāo)返回到地址00H位置(顯示屏的左上方)。命令3:光標(biāo)和顯示模式設(shè)置。I/D地址指針加1或減1選擇位。 I/D=1,讀或?qū)懸粋€(gè)字符后地址指針加1; I/D=0,讀或?qū)懸粋€(gè)字符后地址指針減
42、1。 S屏幕上所有字符移動(dòng)方向是否有效的控制位。 S=1,當(dāng)寫(xiě)入一字符時(shí),整屏顯示左移(I/D=1)或右移(I/D=0); S=0,整屏顯示不移動(dòng)。78命令4:顯示開(kāi)/關(guān)及光標(biāo)設(shè)置。 D屏幕整體顯示控制位,D=0關(guān)顯示,D=1開(kāi)顯示。 C光標(biāo)有無(wú)控制位,C=0無(wú)光標(biāo),C=1有光標(biāo)。 B光標(biāo)閃爍控制位,B=0不閃爍,B=1閃爍。命令5:光標(biāo)或字符移位。 S/C光標(biāo)或字符移位選擇控制位。 0:移動(dòng)光標(biāo),1:移動(dòng)顯示的字符。 R/L移位方向選擇控制位。0:左移,1:右移,79命令6:功能設(shè)置命令。DL傳輸數(shù)據(jù)的有效長(zhǎng)度選擇控制位。1:8位數(shù)據(jù)線接口;0:4位數(shù)據(jù)線接口。N顯示器行數(shù)選擇控制位。0:?jiǎn)?/p>
43、行顯示,1:兩行顯示。F字符顯示的點(diǎn)陣控制位。0:顯示57點(diǎn)陣字符,1:顯示510點(diǎn)陣字符。命令7:CGRAM地址設(shè)置。命令8:DDRAM地址設(shè)置。LCD內(nèi)部有一個(gè)數(shù)據(jù)地址指針,用戶可通過(guò)它訪問(wèn)內(nèi)部全部80字節(jié)的數(shù)據(jù)顯示RAM。 命令格式:80H+地址碼。其中,80H為命令碼。80命令9:讀忙標(biāo)志或地址。 BF忙標(biāo)志。1:LCD忙,此時(shí)LCD不能接受命令或數(shù)據(jù);0:表示LCD不忙。命令10:寫(xiě)數(shù)據(jù)。命令11:讀數(shù)據(jù)。 例如,將顯示模式設(shè)置為“162顯示,57點(diǎn)陣,8位數(shù)據(jù)接口”,只需向1602寫(xiě)入光標(biāo)和顯示模式設(shè)置命令(命令3)“00111000B”,即38H即可。 再如,要求液晶顯示器開(kāi)顯示
44、,顯示光標(biāo)且光標(biāo)閃爍,那么根據(jù)顯示開(kāi)關(guān)及光標(biāo)設(shè)置命令(命令4),只要令D=1,C=1和B=1,也就是寫(xiě)入命令“00001111B”,即0FH,就可實(shí)現(xiàn)所需的顯示模式。813字符顯示位置的確定 80字節(jié)的DDRAM,與顯示屏上字符顯示位置一一對(duì)應(yīng),圖5-17給出LCD1602顯示RAM地址與字符顯示位置的對(duì)應(yīng)關(guān)系。 當(dāng)向DDRAM的00H0FH(第1行)、40H4FH(第2行)地址的任一處寫(xiě)數(shù)據(jù)時(shí),LCD立即顯示出來(lái),該區(qū)域也稱為可顯示區(qū)域。 而當(dāng)寫(xiě)入10H27H或50H67H地址處時(shí),字符不會(huì)顯示出來(lái),該區(qū)域也稱為隱藏區(qū)域。如果要顯示寫(xiě)入到隱藏區(qū)域的字符,需要通過(guò)字符移位命令(命令5)將它們移
45、入到可顯示區(qū)域方可正常顯示。 82圖5-17 LCD內(nèi)部顯示RAM的地址映射圖83 需說(shuō)明的是,在向DDRAM寫(xiě)入字符時(shí),首先要設(shè)置DDRAM定位數(shù)據(jù)指針,此操作可通過(guò)命令8完成。 例如,要寫(xiě)字符到DDRAM的40H處,則命令8的格式為: 80H+40H=C0H,其中80H為命令代碼,40H是要寫(xiě)入字符處的地址。84854LCD1602的復(fù)位與初始化LCD1602上電后復(fù)位狀態(tài)為: 清除屏幕顯示 設(shè)置為8位數(shù)據(jù)長(zhǎng)度,單行顯示,57點(diǎn)陣字符。 顯示屏、光標(biāo)、閃爍功能均關(guān)閉。 輸入方式為整屏顯示不移動(dòng),I/D=1。LCD1602的一般初始化設(shè)置為: 寫(xiě)命令38H,即顯示模式設(shè)置(162顯示,57點(diǎn)
46、陣,8位接口)。 寫(xiě)命令08H,顯示關(guān)閉。 寫(xiě)命令01H,顯示清屏,數(shù)據(jù)指針清0。 寫(xiě)命令06H,寫(xiě)一個(gè)字符后地址指針加1。 寫(xiě)命令0CH,設(shè)置開(kāi)顯示,不顯示光標(biāo)。86 需注意,在進(jìn)行上述設(shè)置及對(duì)數(shù)據(jù)進(jìn)行讀取時(shí),通常需要檢測(cè)忙標(biāo)志位BF如果為1,則說(shuō)明忙,要等待;如果BF為0,則可進(jìn)行下一步操作。5LCD1602基本操作 LCD為慢顯示器件,所以在寫(xiě)每條命令前,一定要查詢忙標(biāo)志位BF,即是否處于“忙”狀態(tài)。如LCD正忙于處理其他命令,就等待;如不忙,則向LCD寫(xiě)入命令。 標(biāo)志位BF連接在8位雙向數(shù)據(jù)線的D7位上。如果BF=0,表示LCD不忙;如果BF=1,表示LCD處于忙狀態(tài),需等待。 LCD
47、1602的讀寫(xiě)操作規(guī)定見(jiàn)表5-4。87LCD1602與AT89S51的接口電路見(jiàn)圖5-18。 圖5-18 單片機(jī)與LCD1602接口電路88 由圖5-18可看出,LCD1602的RS、R/W*和E這3個(gè)引腳分別接在P2.0、P2.1和P2.2引腳,只需通過(guò)對(duì)這3個(gè)引腳置“1”或清“0”,就可實(shí)現(xiàn)對(duì)LCD1602的讀寫(xiě)操作。 具體來(lái)說(shuō),顯示一個(gè)字符的操作過(guò)程為“讀狀態(tài)寫(xiě)命令寫(xiě)數(shù)據(jù)自動(dòng)顯示”。(1)讀狀態(tài) 是對(duì)LCD1602 的“忙”標(biāo)志BF進(jìn)行檢測(cè),如果BF=1,說(shuō)明LCD處于忙狀態(tài),不能對(duì)其寫(xiě)命令;如果BF=0,則可寫(xiě)入命令。 檢測(cè)忙標(biāo)志函數(shù)具體如下:8989void check_busy(v
48、oid) /檢查忙標(biāo)志函數(shù)uchar dt;dodt=0 xff; / dt為變量單元,初值為0 xff E=0;RS=0; /按照表5-4讀寫(xiě)操作規(guī)定RS=0,E=1時(shí)才可讀忙標(biāo)志RW=1;E=1;dt=out;/ out為P0口,P0口的狀態(tài)送入dt中 while(dt&0 x80); / 如果忙標(biāo)志BF=1,繼續(xù)循環(huán)檢測(cè),等待BF=0E=0; / BF=0,LCD不忙,結(jié)束檢測(cè)函數(shù)檢測(cè)P0.7腳電平,即檢測(cè)忙標(biāo)志BF,如BF=1,說(shuō)明LCD處于忙狀態(tài),不能執(zhí)行寫(xiě)命令;BF=0,可執(zhí)行寫(xiě)命令。90(2)寫(xiě)命令寫(xiě)命令函數(shù)如下:void write_command(uchar com) /寫(xiě)命
49、令函數(shù)check_busy();E=0; /按規(guī)定RS和E同時(shí)為0時(shí)可以寫(xiě)入命令RS=0; RW=0;out=com;/將命令com寫(xiě)入P0口E=1; /按規(guī)定寫(xiě)命令時(shí),E應(yīng)為正脈沖,即正跳變,所以前面先置E=0_nop_( );/空操作1個(gè)機(jī)器周期,等待硬件反應(yīng)E=0;/ E由高電平變?yōu)榈碗娖?,LCD開(kāi)始執(zhí)行命令delay(1);/延時(shí),等待硬件響應(yīng)9191(3)寫(xiě)數(shù)據(jù) 將要顯示字符的ASCII碼寫(xiě)入LCD中的數(shù)據(jù)顯示RAM(DDRAM),例如將數(shù)據(jù)“dat”,寫(xiě)入LCD模塊。寫(xiě)數(shù)據(jù)函數(shù)如下:void write_data(uchar dat)/寫(xiě)數(shù)據(jù)函數(shù)check_busy();/檢測(cè)忙標(biāo)
50、志BF=1則等待,若BF=0,則可對(duì)LCD操作E=0; /按規(guī)定寫(xiě)數(shù)據(jù)時(shí),E應(yīng)為正脈沖,所以先置E=0RS=1;/按規(guī)定RS=1和RW=0時(shí)可以寫(xiě)入數(shù)據(jù)RW=0; out=dat;/將數(shù)據(jù)dat從P0口輸出,即寫(xiě)入LCD E=1; /E產(chǎn)生正跳變_nop_();/空操作,給硬件反應(yīng)時(shí)間E=0;/E由高變低,寫(xiě)數(shù)據(jù)操作結(jié)束9292delay(1);(4)自動(dòng)顯示 數(shù)據(jù)寫(xiě)入LCD后,自動(dòng)讀出字符庫(kù)ROM(CGROM)中的字型點(diǎn)陣數(shù)據(jù),并自動(dòng)將字型點(diǎn)陣數(shù)據(jù)送到液晶顯示屏上顯示。936. LCD 1602初始化 使用LCD 1602前,需對(duì)其顯示模式進(jìn)行初始化設(shè)置,初始化函數(shù)如下void LCD_in
51、itial(void)/液晶顯示器初始化函數(shù)write_command(0 x38);/寫(xiě)入命令0 x38:兩行顯示,57點(diǎn)陣,8位數(shù)據(jù)_nop_();/空操作,給硬件反應(yīng)時(shí)間write_command(0 x0C);/寫(xiě)入命令0 x0C:開(kāi)整體顯示,光標(biāo)關(guān),無(wú)黑塊_nop_();/空操作,給硬件反應(yīng)時(shí)間write_command(0 x06);/寫(xiě)入命令0 x06:光標(biāo)右移_nop_();/空操作,給硬件反應(yīng)時(shí)間write_command(0 x01);/寫(xiě)入命令0 x01:清屏delay(1); 注意:在函數(shù)開(kāi)始處,由于LCD尚未開(kāi)始工作,所以不需檢測(cè)忙標(biāo)志,但是初始化完成后,每次再寫(xiě)命令
52、、讀寫(xiě)數(shù)據(jù)操作,均需檢測(cè)忙標(biāo)志。94955.5.2 單片機(jī)控制字符型LCD 1602顯示案例 【例5-9】用單片機(jī)驅(qū)動(dòng)字符型液晶顯示器LCD1602,使其顯示兩行文字:“Welcom” 與“Harbin CHINA”。見(jiàn)圖5-19。 在Proteus中,LCD1602的仿真模型采用LM016L。1LM016L引腳及特性 LM016L的原理符號(hào)及引腳見(jiàn)圖5-20。與LCD1602引腳信號(hào)相同。引腳功能如下:969697圖5-19 單片機(jī)與字符型LCD接口電路與仿真 97(1)數(shù)據(jù)線D7D0;(2)控制線(3根:RS、RW、E);(3)兩根電源線(VDD、VEE)。(4)地線Vss;LM016L的
53、屬性設(shè)置見(jiàn)圖5-21,具體如下:(1)每行字符數(shù)為16,行數(shù)為2;(2)時(shí)鐘為250kHz;(3)第1行字符的地址為80H8FH;(4)第2行字符的地址為C0HCFH。989899 圖5-20 字符型液晶顯示器LCD引腳 圖5-21 字符型液晶顯示器LM016L的屬性設(shè)置992原理電路設(shè)計(jì)(1)從Proteus庫(kù)中選取元器件如下:AT89C51:?jiǎn)纹瑱C(jī);LM016L:字符型顯示器;POT-LIN:滑動(dòng)變阻器;RP1、RP2:排電阻。(2)放置元器件、放置電源和地、連線、元器件屬性設(shè)置、電氣檢測(cè)所有操作都在ISIS中完成,具體操作見(jiàn)4.6節(jié)的介紹。1001003C51源程序設(shè)計(jì) 通過(guò)Keil V
54、ision3建立工程,再建立源程序“*.c”文件,操作見(jiàn)3.4節(jié)。在前面介紹的LCD1602基本操作函數(shù)的基礎(chǔ)上,不難理解如下源程序。參考程序:101#include #include /包含_nop_( )空函數(shù)指令的頭文件#define uchar unsigned char#define uint unsigned int#define out P0sbit RS=P20; /位變量sbit RW=P21;/位變量sbit E=P22; /位變量void lcd _initial(void);/LCD初始化函數(shù)void check_busy(void); /檢查忙標(biāo)志函數(shù)void wri
55、te_command(uchar com); /寫(xiě)命令函數(shù)void write_data(uchar dat);/寫(xiě)數(shù)據(jù)函數(shù)void string(uchar ad ,uchar *s);void lcd_test(void);void delay(uint);/延時(shí)函數(shù)102void main(void) /主函數(shù)lcd _initial( );/調(diào)用對(duì)LCD初始化函數(shù) while(1) string(0 x85,Welcome);/顯示的第1行字符串string(0 xC2,Harbin CHINA);/顯示的第2行字符串delay(100); /延時(shí)write_command(0 x01
56、);/寫(xiě)入清屏命令delay(100);/延時(shí)void delay(uint j)/1ms延時(shí)子程序uchar i=250;for(;j0;j-)103103while(-i);i=249;while(-i);i=250;void check_busy(void)/檢查忙標(biāo)志函數(shù)uchar dt;dodt=0 xff;E=0;RS=0;RW=1;104104E=1;dt=out;while(dt&0 x80);E=0;void write_command(uchar com) /寫(xiě)命令函數(shù)check_busy();E=0;RS=0;RW=0;out=com;E=1;_nop_( );E=0;d
57、elay(1);105105void write_data(uchar dat) /寫(xiě)數(shù)據(jù)函數(shù)check_busy();E=0;RS=1;RW=0;out=dat;E=1;_nop_();E=0;delay(1);void LCD_initial(void) /液晶顯示器初始化函數(shù)write_command(0 x38);/寫(xiě)入命令0 x38:8位兩行顯示,57點(diǎn)陣字符write_command(0 x0C);/寫(xiě)入命令0 x0C:開(kāi)整體顯示,光標(biāo)關(guān),無(wú)黑塊write_command(0 x06);/寫(xiě)入命令0 x06:光標(biāo)右移106106write_command(0 x01); /寫(xiě)入命令
58、0 x01:清屏delay(1);void string(uchar ad,uchar *s)/輸出顯示字符串的函數(shù)write_command(ad);while(*s0)write_data(*s+);/輸出字符串,且指針增1delay(100);107107 最后通過(guò)按鈕“Build target”編譯源程序,生成目標(biāo)代碼“*.hex”文件。若編譯失敗,對(duì)程序修改調(diào)試直至編譯成功。4. Proteus仿真(1)加載目標(biāo)代碼文件 打開(kāi)元器件單片機(jī)屬性窗口,在“Program File”欄中添加上面編譯好的目標(biāo)代碼文件“*.hex”;在“Clock Frequency”欄中輸入晶振頻率12MH
59、z。(2)仿真 單擊仿真按鈕 啟動(dòng)仿真,見(jiàn)圖5-19。1081081095.6 鍵盤(pán)接口設(shè)計(jì) 鍵盤(pán)向單片機(jī)輸入數(shù)據(jù)、命令等功能,是人機(jī)對(duì)話的主要手段。 由若干按鍵按照一定規(guī)則組成。每一個(gè)按鍵實(shí)質(zhì)上是一個(gè)按鍵開(kāi)關(guān),按構(gòu)造可分為有觸點(diǎn)開(kāi)關(guān)按鍵和無(wú)觸點(diǎn)按鍵。 有觸點(diǎn)開(kāi)關(guān)按鍵常見(jiàn)的有:觸摸式鍵盤(pán)、薄膜鍵盤(pán)、導(dǎo)電橡膠、按鍵式鍵盤(pán)等,最常用的是按鍵式鍵盤(pán)。 無(wú)觸點(diǎn)開(kāi)關(guān)按鍵有電容式按鍵、光電式按鍵和磁感應(yīng)按鍵等。 下面介紹按鍵式開(kāi)關(guān)鍵盤(pán)工作原理、方式以及接口設(shè)計(jì)與軟件編程。1101105.6.1 鍵盤(pán)接口設(shè)計(jì)應(yīng)解決的問(wèn)題1鍵盤(pán)的任務(wù) 任務(wù)3項(xiàng)。(1)判別是否有鍵按下?若有,進(jìn)入下一步。(2)識(shí)別哪一個(gè)鍵被按
60、下,并求出相應(yīng)的鍵值。(3)根據(jù)鍵值,找到相應(yīng)鍵值處理程序入口。1112鍵盤(pán)輸入特點(diǎn) 鍵盤(pán)一個(gè)按鍵實(shí)質(zhì)就是一個(gè)按鈕開(kāi)關(guān)。 圖5-22(a)所示按鍵開(kāi)關(guān)的兩端分別連接在行線和列線上,列線接地,行線通過(guò)電阻接到+5V上。鍵盤(pán)開(kāi)關(guān)機(jī)械觸點(diǎn)的斷開(kāi)、閉合,其行線電壓輸出波形如圖5-22(b)所示。 圖5-22(b)所示的t1和t3分別為鍵的閉合和斷開(kāi)過(guò)程中的抖動(dòng)期(呈現(xiàn)一串負(fù)脈沖),抖動(dòng)時(shí)間長(zhǎng)短與開(kāi)關(guān)機(jī)械特性有關(guān),一般為510ms,t2為穩(wěn)定的閉合期,其時(shí)間由按鍵動(dòng)作確定,一般為十分之幾秒到幾秒,t0、t4為斷開(kāi)期。112112113圖5-22 鍵盤(pán)開(kāi)關(guān)及其行線波形1133按鍵的識(shí)別 按鍵閉合與否,反應(yīng)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西柳州市2025屆高三第二次模擬考試歷史試題(含答案)
- 【全程復(fù)習(xí)方略】2020年人教A版數(shù)學(xué)文(廣東用)課時(shí)作業(yè):6.2一元二次不等式及其解法
- 一年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)匯編
- 【KS5U原創(chuàng)】新課標(biāo)2021年高二英語(yǔ)暑假作業(yè)-8
- 2025年0197北京風(fēng)信科技有限公司
- 20202021學(xué)年選修6課件第四章第一節(jié)水污染及其防治課件
- 2015-2016年英語(yǔ)必修Ⅴ北師大版Unit15課件W-up及L1
- 2024年中國(guó)通號(hào)總部招聘筆試真題
- 2024年西安醫(yī)專附屬醫(yī)院招聘筆試真題
- 中學(xué)教育班會(huì)班會(huì) 換位思考 與人為善人課件
- 梅毒診療指南(2014版)
- GB/T 35694-2017光伏發(fā)電站安全規(guī)程
- GA 172-2014金屬手銬
- 醫(yī)學(xué)醫(yī)學(xué)文獻(xiàn)檢索與論文寫(xiě)作培訓(xùn)課件
- 高中語(yǔ)文文言文斷句課件
- 使用血管活性藥物的注意事項(xiàng)
- 義務(wù)教育歷史課程標(biāo)準(zhǔn)(2022年版)【重新整理版】
- 北師大版小學(xué)三年級(jí)數(shù)學(xué)下冊(cè)課件(全冊(cè))
- 工程臨時(shí)用工確認(rèn)單
- 氮?dú)庵舷⑹鹿拾咐?jīng)驗(yàn)分享
- 福建省寧德市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)及行政區(qū)劃代碼
評(píng)論
0/150
提交評(píng)論