版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 第5章 單片機的開關檢測、鍵盤輸入 與顯示的接口設計 1 單片機系統(tǒng)顯示及開關檢測、鍵盤輸入是其基本功能。本章介紹單片機與顯示器件、開關及鍵盤的接口設計與軟件編程。5.1 單片機控制發(fā)光二極管顯示 發(fā)光二極管常用來指示系統(tǒng)工作狀態(tài),制作節(jié)日彩燈、廣告牌匾等。 大部分發(fā)光二極管工作電流15mA之間,其內(nèi)阻為20100。電流越大,亮度也越高。 為保證發(fā)光二極管正常工作,同時減少功耗,限流電阻選擇十分重要,若供電電壓為+5V,則限流電阻可選13k。25.1.1 單片機與發(fā)光二極管的連接 第2章已介紹,P0口作通用I/O用,由于漏極開路,需外接上拉電阻。而P1P3口內(nèi)部有30k左右上拉電阻。 下面討
2、論P1P3口如何與LED發(fā)光二極管驅(qū)動連接問題。 單片機并行端口P1P3直接驅(qū)動發(fā)光二極管,電路見圖5-1。與P1、P2、P3口相比,P0口每位可驅(qū)動8個LSTTL輸入,而P1P3口每一位驅(qū)動能力,只有P0口一半。3圖5-1 發(fā)光二極管與單片機并行口的連接4 當P0口某位為高電平時,可提供400A的拉電流;當P0口某位為低電平(0.45V)時,可提供3.2mA的灌電流,而P1P3口內(nèi)有30k左右上拉電阻,如高電平輸出,則從P1、P2和P3口輸出的拉電流Id僅幾百A,驅(qū)動能力較弱,亮度較差,見圖5-1(a)。 如端口引腳為低電平,能使灌電流Id從單片機外部流入內(nèi)部,則將大大增加流過的灌電流值,見
3、圖5-1(b)。AT89S51任一端口要想獲得較大的驅(qū)動能力,要用低電平輸出。如一定要高電平驅(qū)動,可在單片機與發(fā)光二極管間加驅(qū)動電路,如74LS04、74LS244等。565.1.2 I/O端口的編程舉例 對I/O端口編程控制時,要對I/O端口特殊功能寄存器聲明,在C51的編譯器中,這項聲明包含在頭文件reg51.h中,編程時,可通過預處理命令#include,把這個頭文件包含進去。下面通過案例介紹如何編程對發(fā)光二極管輸出控制。7 【例5-1】 制作流水燈,原理電路見圖5-2,8個發(fā)光二極管LED0LED7經(jīng)限流電阻分別接至P1口的P1.0P1.7引腳上,陽極共同接高電平。編寫程序來控制發(fā)光二
4、極管由上至下的反復循環(huán)流水點亮,每次點亮一個發(fā)光二極管。參考程序:#include #include /包含移位函數(shù)_crol_( )的頭文件#define uchar unsigned char #define uint unsigned int void delay(uint i) /延時函數(shù)uchar t; while (i-) 89圖5-2 單片機控制的流水燈for(t=0;t120;t+);void main( )/主程序P1=0 xfe;/向P1口送出點亮數(shù)據(jù) while (1) delay( 500 ); /500為延時參數(shù),可根據(jù)實際需要調(diào)整P1=_crol_(P1,1) ;
5、/ 函數(shù)_crol_(P1,1)把P1中的數(shù)據(jù)循環(huán)左移1位 10程序說明:(1)while(1) 兩種用法:“while(1);”: while(1)后有分號,是使程序停留在這指令上;“while(1) ;”:反復循環(huán)執(zhí)行大括號內(nèi)程序段,本例用法,即控制流水燈反復循環(huán)顯示。 (2)C51函數(shù)庫中的循環(huán)移位函數(shù):循環(huán)移位函數(shù)包括: 循環(huán)左移函數(shù)“_crol_” 循環(huán)右移函數(shù)“_cror_”。 本例用循環(huán)左移 “_crol_(P1,1)”,函數(shù)。括號第1個參數(shù)為循環(huán)左移對象,即對P1中的內(nèi)容循環(huán)左移;第2個參數(shù)為左移位數(shù),即左移1位。編程中一定要把含有移位函數(shù)的頭文件intrins.h包含在內(nèi),例
6、如第2行“#include ”。11在【例5-1】基礎上,編寫控制發(fā)光二極管反復循環(huán)點亮的流水燈。 【例5-2】電路見圖5-2,制作由上至下再由下至上反復循環(huán)點亮顯示的流水燈,3種方法實現(xiàn)。(1)數(shù)組的字節(jié)操作實現(xiàn) 建立1個字符型數(shù)組,將控制8個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個數(shù)據(jù)為左移點亮 數(shù)據(jù),后8個為右移點亮數(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ù)進行移位,從而實現(xiàn)發(fā)光二極管依次點亮。參考程序:#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( );/ 延時 temp=temp1; / temp 中數(shù)據(jù)左移一位 temp=0 x80; / 賦右移初值給temp for(i=0; i1; / temp 中數(shù)據(jù)右移一位 15 程序說明: 注意使用移位運算符“”、“”與使用循環(huán)左移函數(shù)“_crol_”和循環(huán)右移函數(shù)“_cror_” 區(qū)別。左移移位運算“”是將低位丟棄,高位補0。而循環(huán)左移函數(shù)“_crol_”
9、是將移出的高位再補到低位,即循環(huán)移位;同理循環(huán)右移函數(shù)“_cror_” 是將移出的低位再補到高位。(3)用循環(huán)左、右移位函數(shù)實現(xiàn) 使用C51提供的庫函數(shù),即循環(huán)左移n位函數(shù)和循環(huán)右移n位函數(shù),控制發(fā)光二極管點亮。參考程序:#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中的點亮數(shù)據(jù)送P1口,控制點亮顯示 delay( ); / 延時 temp=_crol_( temp,1) ;/ temp 數(shù)據(jù)循環(huán)左移1位 for(i=0; i7; i+) P1=temp;/ temp中的數(shù)據(jù)送P1口輸出 delay( ); / 延時 temp=_cror_( temp,1) ;/temp中數(shù)據(jù)循環(huán)右移1位 18195.2 開關狀態(tài)檢測 讀入I/O端口電平,即可檢測開關處于閉合狀態(tài)還是打開狀態(tài)。5.2.1 開關檢測案例1 用I/O端口來進行開關狀態(tài)檢測,開關一端接到I/O端口引腳上,并通過上拉電阻接+5
11、V上,開關另一端接地,當開關打開時,I/O引腳為高電平,當開關閉合時,I/O引腳為低電平。20圖5-3 開關、LED發(fā)光二極管與P1口的連接21 【例5-3】 如圖5-3,單片機的P1.4P1.7接4個開關S0S3,P1.0P1.3接4個發(fā)光二極管LED0LED3。 編程將P1.4P1.7上的4個開關狀態(tài)反映在P1.0P1.3引腳控制的4個發(fā)光二極管上,開關閉合,對應發(fā)光二極管點亮。 例如P1.4腳上開關S0狀態(tài),由P1.0腳上LED0顯示,P1.6引腳上開關S2狀態(tài),由P1.2腳的LED2顯示。 22參考程序如下:#include #define uchar unsigned charvoi
12、d delay( ) /延時函數(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 開關檢測案例2 【例5-4】 如圖5-4,P1.0和P1.1引腳接有兩只開關S0和S1,兩引腳上的高低電平共4種組合,4種組合分別點亮P2.0P2.3引腳控制的4只LED,即S0、S1均閉合,LED0亮,其余滅;S1閉合、S0打開,LED1亮,其余滅;S0閉合、S1打開,LED2亮,其余滅;S0、S1均打開,LED3亮,其余滅。編程實現(xiàn)此功能。 參考程
13、序:2425圖5-4 開關檢測指示器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位開關狀態(tài) case 0: P2=0 x01; break;/ P1.1、P1.0=00,點亮P2.0腳LED case 1: P2=0 x02; break;/ P1.1、P1.0=01,點亮P2.1腳LED case
14、2: P2=0 x04; break;/ P1.1、P1.0=10,點亮P2.2腳LED case 3: P2=0 x08; break;/ P1.1、P1.0=11,點亮P2.3腳LED while ( 1 );26 程序段中用到循環(huán)結構控制語句do-while以及switch-case語句。275.3 單片機控制LED數(shù)碼管的顯示5.3.1 LED數(shù)碼管顯示原理 LED數(shù)碼管: “8”字型,7段(不包括小數(shù)點)或8段(包括小數(shù)點),每段對應一個發(fā)光二極管,共陽極和共陰極兩種,見圖5-5。 共陽極:數(shù)碼管的陽極連接在一起,接+5V; 共陰極:數(shù)碼管陰極連在一起接地。 對于共陰極數(shù)碼管,當某發(fā)
15、光二極管陽極為高電平時,發(fā)光二極管點亮,相應段被顯示。同樣,共陽極數(shù)碼管陽極連在一起,公共陽極接+5V,當某個發(fā)光二極管陰極接低電平時,該發(fā)光二極管被點亮,相應段被顯示。2829圖5-5 8段LED數(shù)碼管結構及外形 為使LED數(shù)碼管顯示不同字符,要把某些段點亮,就要為數(shù)碼管各段提供一字節(jié)的二進制碼,即字型碼(也稱段碼)。習慣上以“a”段對應字型碼字節(jié)的最低位。各字符段碼見表5-1。3031 如要在數(shù)碼管顯示某字符,只需將該字符字型碼加到各段上即可。 例如某存儲單元中的數(shù)為“02H”,想在共陽極數(shù)碼管上顯示“2”,需要把“2”的字型碼“A4H”加到數(shù)碼管各段。 將欲顯示字符的字型碼作成一個表(數(shù)
16、組),根據(jù)顯示字符從表中查找到相應字型碼,然后把該字型碼輸出數(shù)碼管各個段上,同時數(shù)碼管的公共端接+5V,此時在數(shù)碼管上顯示字符“2”。 下面介紹單片機如何控制LED數(shù)碼管顯示字符。 【例5-5】利用單片機控制一個8段LED數(shù)碼管先循環(huán)顯示單個偶數(shù):0、2、4、6、8,再顯示單個奇數(shù):1、3、5、7、9,如此反復循環(huán)顯示。 本例原理電路及仿真結果,見圖5-6。 參考程序如下:32圖5-6 控制數(shù)碼管循環(huán)顯示單個數(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; /共陽極段碼表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)顯示結束34void delayms(uint j)/ 延時函數(shù)uchar i;for(;j0;j-) i=250; while(-i); i=249; while(-i
18、); 說明:語句“if(segi=0 x01)i=0; ” 含義:如果欲送出的數(shù)組元素為0 x01(數(shù)字“9”段碼0 x90的下一個元素,即結束碼),表明一個循環(huán)顯示已結束,則i=0,則重新開始循環(huán)顯示,從段碼數(shù)組表的第一個元素seg0,即段碼0 xc0(數(shù)字0)重新開始顯示。35365.3.2 LED數(shù)碼管的靜態(tài)顯示與動態(tài)顯示 兩種顯示方式:靜態(tài)顯示和動態(tài)顯示。1. 靜態(tài)顯示方式 無論多少位LED數(shù)碼管,都同時處于顯示狀態(tài)。 多位LED數(shù)碼管工作于靜態(tài)顯示方式時,各位共陰極(或共陽極)連接在一起并接地(或接+5V);每位數(shù)碼管段碼線(adp)分別與一個8位I/O口鎖存器輸出相連。如果送往各個
19、LED數(shù)碼管所顯示字符的段碼一經(jīng)確定,則相應I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入下一個顯37示字符段碼。靜態(tài)顯示方式顯示無閃爍,亮度較高,軟件控制較易。 圖5-7為4位LED數(shù)碼管靜態(tài)顯示電路,各數(shù)碼管可獨立顯示,只要向控制各位I/O口鎖存器送相應顯示段碼,該位就能保持相應的顯示字符。 這樣在同一時間,每一位顯示的字符可各不相同。靜態(tài)顯示方式占用I/O口端口線較多。圖5-7電路,要占用4個8位I/O口(或鎖存器)。如數(shù)碼管數(shù)目增多,則需增加I/O口數(shù)目。38圖5-7 4位LED靜態(tài)顯示的示意圖39 【例5-6】單片機控制2只數(shù)碼管,靜態(tài)顯示2個數(shù)字“27”。 原理電路見圖5-8。
20、單片機用P0口與P1口,分別控制加到兩個數(shù)碼管DS0與DS1的段碼,而共陽極數(shù)碼管DS0與DS1的公共端(公共陽極端)直接接至+5V,因此數(shù)碼管DS0與DS1始終處于導通狀態(tài)。利用P0口與P1口帶有的鎖存功能,只需向單片機P0口與P1口分別寫入相應的顯示字符“2”和“7”的段碼即可。 由于一個數(shù)碼管就占用一個I/O端口。如果數(shù)碼管數(shù)目增多,則需增加I/O口,但軟件編程要簡單的多。40圖5-8 2位數(shù)碼管靜態(tài)顯示的原理電路與仿真41參考程序如下:#include /包含8051單片機寄存器定義的頭文件void main(void) P0=0 xa4;/將數(shù)字2的段碼送P0口 P1=0 xf8;/
21、將數(shù)字7的段碼送P1口 while(1)/無限循環(huán) ; 4243 2. 動態(tài)顯示方式 顯示位數(shù)較多時,靜態(tài)顯示所占的I/O口多,這時常采用動態(tài)顯示。為節(jié)省I/O口,通常將所有顯示器段碼線相應段并聯(lián)在一起,由一個8位I/O口控制,各顯示位公共端分別由另一單獨I/O口線控制。4445圖5-9 4位LED數(shù)碼管動態(tài)顯示示意圖 圖5-9:4位8段LED動態(tài)顯示器電路示意圖。其中單片機發(fā)出的段碼占用1個8位I/O(1)端口,而位選控制使用I/O(2)端口中4位口線。 動態(tài)顯示就是單片機向段碼線輸出欲顯示字符的段碼。每一時刻,只有1位位選線有效,即選中某一位顯示,其他各位位選線都無效。每隔一定時間逐位輪流
22、點亮各數(shù)碼管(掃描方式),由于數(shù)碼管余輝和人眼的“視覺暫留”作用,只要控制好每位數(shù)碼管顯示時間和間隔,則可造成“多位同時亮”的假象,達到同時顯示效果。 各位數(shù)碼管輪流點亮的時間間隔(掃描間隔)應根據(jù)實際情況定。發(fā)光二極管從導通到發(fā)光有一定的延時,如果點亮時間太短,發(fā)光太弱,46人眼無法看清;時間太長,產(chǎn)生閃爍現(xiàn)象,且此時間越長,占用單片機時間也越多。另外,顯示位數(shù)增多,也將占用單片機大量時間,因此動態(tài)顯示實質(zhì)是以執(zhí)行程序時間來換取I/O端口減少。下面是動態(tài)顯示實例。 【例5-7】 8只數(shù)碼管,分別滾動顯示單個數(shù)字18。程序運行后,單片機控制左邊第1個數(shù)碼管顯示1,其他不顯示,延時之后,控制左邊
23、第2個數(shù)碼管顯示1,其他不顯示,直至第8個數(shù)碼管顯示8,其他不顯示,反復循環(huán)上述過程。47 動態(tài)顯示電路見圖5-10,P0口輸出段碼,P2口輸出掃描的位控碼,通過由8個NPN晶體管的位驅(qū)動電路對8個數(shù)碼管位控掃描。即使掃描速度加快,由于是虛擬仿真,數(shù)碼管的余輝也不能像實際電路那樣體現(xiàn)出來。 如對本例實際硬件顯示電路進行快速掃描,由于數(shù)碼管余輝和人眼 “視覺暫留”作用,只要控制好每位數(shù)碼管顯示的時間和間隔,則可造成“多位同時亮” 假象,達到同時顯示效果。 但虛擬仿真做不到這一點。仿真運行下,只能是一位一位點亮顯示,不能看到同時顯示效果,但本例使我們了解動態(tài)掃描顯示實際過程。如采用實際硬件電路,用
24、軟件控制快速掃描,可看到“多位同時點亮” 效果。48圖5-10 8只數(shù)碼管分別滾動顯示單個數(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; /共陽數(shù)碼管段碼表void delay(uint t)/延時函數(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)為將對象j循環(huán)左移1位 P0=dis_codei;/P0口輸出段碼 P2=j;/P2口輸出位控碼 delay(180);/延時,控制每位顯示的時間 51525.4 單片機控制LED點陣顯示器顯示 LED點陣顯示器應用非常廣泛,在許多公共場合,如商場、銀行、車站、機場、醫(yī)院隨處可見。不僅能顯示文字、圖形,還能播放動畫、圖像、視頻等信號。 LED點陣顯示器分為圖文顯示器和視頻顯示器,有單色顯示,還有彩色顯示。下面僅介紹單片機如何來控制單色LED點陣顯示器的顯示。5
26、.4.1 LED點陣顯示器結構與顯示原理 由若干個發(fā)光二極管按矩陣方式排列而成。陣列點數(shù)可分為57、58、68、88點陣;按發(fā)光顏色可分為單色、雙色、三色;按極性排列可分為共陰極和共陽極。531. LED點陣結構 以88LED點陣顯示器為例,外形見圖5-11,內(nèi)部結構見圖5-12,由64個發(fā)光二極管組成,且每個發(fā)光二極管是處于行線(R0R7)和列線(C0C7)之間交叉點上。2. LED點陣顯示原理 顯示的字符由一個個點亮的LED所構成。 由圖5-12點亮點陣中一個發(fā)光二極管條件:對應行為高電平,對應列為低電平。如在很短時間內(nèi)依次點亮很多個發(fā)光二極管,LED點陣就可顯示一個穩(wěn)定字符、數(shù)字或其他圖
27、形??刂芁ED點陣顯示器顯示,實質(zhì)就是54圖5-11 88 LED點陣顯示器外形 55圖5-12 88LED點陣顯示器(共陰極)的結構56控制加到行線和列線上編碼,控制點亮某些發(fā)光二極管(點),從而顯示出由不同發(fā)光點組成的各種字符。 1616 LED點陣顯示器的結構與88LED點陣顯示模塊內(nèi)部結構及顯示原理是類似的,只不過行和列均為16。1616是由4個88 LED點陣組成,且每個發(fā)光二極管也是放置在行線和列線的交叉點上,當對應某一列置0電平,某一行置1電平時,該發(fā)光二極管點亮。 下面以顯示字符“子”為例,見圖5-13。57圖5-13 1616 LED點陣顯示器顯示字符“子”58 顯示過程如下
28、: 先給LED點陣的第1行送高電平(行線高電平有效),同時給所有列線送高電平(列線低電平有效),從而第1行發(fā)光二極管全滅; 延時一段時間后,再給第2行送高電平,同時給所有列線送“1100 0000 0000 1111”,列線為0的發(fā)光二極管點亮,從而點亮10個發(fā)光二極管,顯示出漢字“子”的第一橫; 延時一段時間后,再給第3行送高電平,同時加到列線的編碼為“1111 1111 1101 1111”,點亮1個發(fā)光二極管; ; 延時一段時間后,再給第16行送高電平,同時給列線送“1111 1101 1111 1111” ,顯示出漢字“子”的最下面的一行,點亮1個發(fā)光二極管。然后再重新循環(huán)上述操作,利
29、用人眼視覺暫留效應,一個穩(wěn)定字符“子” 顯示出來,見圖5-13。59605.4.2 控制1616 LED點陣顯示屏的案例 單片機控制1616點陣顯示屏顯示字符案例。 【例5-8】如圖5-14,利用單片機及 74LS154(4-16譯碼器)、74LS07、1616 LED點陣顯示屏來實現(xiàn)字符顯示,編寫程序,循環(huán)顯示字符“電子技術”。 圖中1616 LED點陣顯示屏16行行線R0R15電平,由P1口低4位經(jīng)4-16譯碼器74HC154的16條譯碼輸出線L0L15經(jīng)驅(qū)動后的輸出來控制。16列列線C0C15的電平由P0口和P2口控制。剩下問題是如何確定顯示字符的點陣編碼,以及控制好每一屏逐行顯示的掃描
30、速度(刷新頻率)。 61圖5-14 控制1616LED點陣顯示器(共陰極)顯示字符 62參考程序如下:#include#define uchar unsigned char#define uint unsigned int#define out0 P0#define out2 P2 #define out1 P1void delay(uint j)/延時函數(shù)uchar i=250; for(;j0;j-) while(-i); i=100; 63uchar code string= /漢字“電” 1616點陣列碼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點陣列碼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點陣列碼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/漢字“術”的1616點陣的列碼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個漢字 65for(n=0;n40;n+)/每個漢字整屏掃描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);/顯示并延時一段時間 out0=0 xff; /列線C0C7為高電平,熄滅發(fā)光二極管 out2=0 xff; /列線C8C15為高電平,熄滅發(fā)光二極管 66 掃描顯示時,單片機通過P1口低4位經(jīng)4-16譯碼器74HC154的16條譯碼輸出線L0L15經(jīng)驅(qū)動后的輸出來控制,逐行為高電平,來進行掃描。由P0口與P2口控制列碼的輸出,從而顯示出某行應點亮的發(fā)光二極管。 以顯示漢字“子”為例,說明顯示過程。由上面程序可看出,漢字“子
35、”的前3行發(fā)光二級管的列碼為“0 xFF,0 xFF,0 x03,0 xF0,0 xFF,0 xFB,”第一行列碼為:“ 0 xff,0 xff”,由P0口與P2口輸出,無點亮的發(fā)光二極管。第二行列碼為:“0 x03,0 xf0”,通過P0口與P2口輸出后,由圖5-13看出,0 x03加到列線C7C0的二進制編碼為“0000 0011”,這里要注意加到8個發(fā)光二極管上的對應位置。67 按照圖5-12和圖5-14連線關系,加到從左到右發(fā)光二極管應為C0 C7的二進制編碼為“1100 0000”,即最左邊的2個發(fā)光二極管不亮,其余的6個發(fā)光二極管點亮。 同理,P2口輸出的0 xF0加到列線C15
36、C8的二進制編碼為“1111 0000”,即加到C8C15的二進制編碼為“0000 1111”,所以第2行的最右邊的4個發(fā)光二極管不亮,如圖5-13所示。 對應通過P0口與P2口輸出加到第3行16個發(fā)光二極管的列碼為“0 xFF,0 xFB,”,對應于從左到右的C0 C15的二進制編碼為“1111 1111 1101 1111”,從而第3行左邊數(shù)第11個發(fā)光二極管被點亮,其余均熄滅,如圖5-13所示。其余各行點亮的發(fā)光二極管,也是由1616點陣的列碼來決定。68695.5 單片機控制液晶顯示模塊1602 LCD的顯示 液晶顯示器LCD (Liquid Crystal Display)具有省電、
37、體積小、抗干擾能力強等優(yōu)點, LCD顯示器分為字段型、字符型和點陣圖形型。 (1)字段型。以長條狀組成字符顯示,主要用于數(shù)字顯示,也可用于顯示西文字母或某些字符,廣泛用于電子表、計算器、數(shù)字儀表中。 (2)字符型。專門用于顯示字母、數(shù)字、符號等。一個字符由57或510的點陣組成,在單片機系統(tǒng)中已廣泛使用。 (3)點陣圖形型。廣泛用于圖形顯示,如筆記本電腦、彩色電視和游戲機等。它是在平板上排列的多行列的矩陣式的晶格點,點大小與多少決定了顯示的清晰度。705.5.1 LCD 1602液晶顯示模塊簡介 單片機系統(tǒng)中常用的字符型液晶顯示模塊。由于LCD顯示面板較為脆弱,廠商已將LCD控制器、驅(qū)動器、R
38、AM 、ROM和液晶顯示器用PCB連接到一起,稱為液晶顯示模塊LCM (LCd Module),購買現(xiàn)成的即可。單片機只需向LCD顯示模塊寫入相應命令和數(shù)據(jù)就可顯示需要的內(nèi)容。1字符型液晶顯示模塊LCD 1602特性與引腳 字符型LCD模塊常用的有16字1行、16字2行、20字2行、20字4行等模塊,型號常用1602、1604、2002、2004來表示,其中為商標名稱,16代表液晶顯示器每行可顯示16個字符,02表示顯示2行。 LCD1602內(nèi)有字符庫ROM(CGROM),能顯示出192個字符(57點陣),如圖5-15所示。71圖5-15 ROM字符庫的內(nèi)容 72 顯示器顯示的數(shù)字和字母部分代
39、碼,恰是ASCII碼表中編碼。 控制LCD 1602顯示字符,只需將待顯示字符的ASCII碼寫入顯示數(shù)據(jù)存儲器(DDRAM),內(nèi)部控制電路就可將字符在顯示器上顯示出來。 例如,顯示字符“A”,單片機只需將字符“A”的ASCII碼41H寫入DDRAM,控制電路就會將對應的字符庫ROM(CGROM)中的字符“A”的點陣數(shù)據(jù)找出來顯示在LCD上。 模塊內(nèi)有80字節(jié)數(shù)據(jù)顯示RAM (DDRAM),除顯示192個字符(57點陣)的字符庫ROM(CGROM)外,還有64字節(jié)的自定義字符RAM(CGRAM),用戶可自行定義8個57點陣字符。73 (a) LCD 1602的外形 (b) LCD 1602的引腳
40、圖5-16 LCD 1602外形及引腳LCD 1602工作電壓4.55.5V,典型5V,工作電流2mA。標準的14引腳(無背光)或16個引腳(有背光)的外形及引腳分布如圖5-16所示。74 引腳包括8條數(shù)據(jù)線、3條控制線和3條電源線,見表5-2。通過單片機向模塊寫入命令和數(shù)據(jù),就可對顯示方式和顯示內(nèi)容做出選擇。752LCD1602字符的顯示及命令字 顯示字符首先要解決待顯示字符的ASCII碼產(chǎn)生。用戶只需在C51程序中寫入欲顯示的字符常量或字符串常量,C51程序在編譯后會自動生成其標準的ASCII碼,然后將生成的ASCII碼送入顯示用數(shù)據(jù)存儲器DDRAM,內(nèi)部控制電路就會自動將該ASCII碼對
41、應的字符在LCD1602顯示出來。 讓液晶顯示器顯示字符,首先對其進行初始化設置:對有、無光標、光標移動方向、光標是否閃爍及字符移動方向等進行設置,才能獲得所需顯示效果。 對LCD 1602的初始化、讀、寫、光標設置、顯示數(shù)據(jù)的指針設置等,都是單片機向LCD 1602寫入命令字來實現(xiàn)。命令字見表5-3。 7677表5-3中11個命令功能說明如下:命令1:清屏,光標返回地址00H位置(顯示屏的左上方)。命令2:光標返回到地址00H位置(顯示屏的左上方)。命令3:光標和顯示模式設置。I/D地址指針加1或減1選擇位。 I/D=1,讀或?qū)懸粋€字符后地址指針加1; I/D=0,讀或?qū)懸粋€字符后地址指針減
42、1。 S屏幕上所有字符移動方向是否有效的控制位。 S=1,當寫入一字符時,整屏顯示左移(I/D=1)或右移(I/D=0); S=0,整屏顯示不移動。78命令4:顯示開/關及光標設置。 D屏幕整體顯示控制位,D=0關顯示,D=1開顯示。 C光標有無控制位,C=0無光標,C=1有光標。 B光標閃爍控制位,B=0不閃爍,B=1閃爍。命令5:光標或字符移位。 S/C光標或字符移位選擇控制位。 0:移動光標,1:移動顯示的字符。 R/L移位方向選擇控制位。0:左移,1:右移,79命令6:功能設置命令。DL傳輸數(shù)據(jù)的有效長度選擇控制位。1:8位數(shù)據(jù)線接口;0:4位數(shù)據(jù)線接口。N顯示器行數(shù)選擇控制位。0:單
43、行顯示,1:兩行顯示。F字符顯示的點陣控制位。0:顯示57點陣字符,1:顯示510點陣字符。命令7:CGRAM地址設置。命令8:DDRAM地址設置。LCD內(nèi)部有一個數(shù)據(jù)地址指針,用戶可通過它訪問內(nèi)部全部80字節(jié)的數(shù)據(jù)顯示RAM。 命令格式:80H+地址碼。其中,80H為命令碼。80命令9:讀忙標志或地址。 BF忙標志。1:LCD忙,此時LCD不能接受命令或數(shù)據(jù);0:表示LCD不忙。命令10:寫數(shù)據(jù)。命令11:讀數(shù)據(jù)。 例如,將顯示模式設置為“162顯示,57點陣,8位數(shù)據(jù)接口”,只需向1602寫入光標和顯示模式設置命令(命令3)“00111000B”,即38H即可。 再如,要求液晶顯示器開顯示
44、,顯示光標且光標閃爍,那么根據(jù)顯示開關及光標設置命令(命令4),只要令D=1,C=1和B=1,也就是寫入命令“00001111B”,即0FH,就可實現(xiàn)所需的顯示模式。813字符顯示位置的確定 80字節(jié)的DDRAM,與顯示屏上字符顯示位置一一對應,圖5-17給出LCD1602顯示RAM地址與字符顯示位置的對應關系。 當向DDRAM的00H0FH(第1行)、40H4FH(第2行)地址的任一處寫數(shù)據(jù)時,LCD立即顯示出來,該區(qū)域也稱為可顯示區(qū)域。 而當寫入10H27H或50H67H地址處時,字符不會顯示出來,該區(qū)域也稱為隱藏區(qū)域。如果要顯示寫入到隱藏區(qū)域的字符,需要通過字符移位命令(命令5)將它們移
45、入到可顯示區(qū)域方可正常顯示。 82圖5-17 LCD內(nèi)部顯示RAM的地址映射圖83 需說明的是,在向DDRAM寫入字符時,首先要設置DDRAM定位數(shù)據(jù)指針,此操作可通過命令8完成。 例如,要寫字符到DDRAM的40H處,則命令8的格式為: 80H+40H=C0H,其中80H為命令代碼,40H是要寫入字符處的地址。84854LCD1602的復位與初始化LCD1602上電后復位狀態(tài)為: 清除屏幕顯示 設置為8位數(shù)據(jù)長度,單行顯示,57點陣字符。 顯示屏、光標、閃爍功能均關閉。 輸入方式為整屏顯示不移動,I/D=1。LCD1602的一般初始化設置為: 寫命令38H,即顯示模式設置(162顯示,57點
46、陣,8位接口)。 寫命令08H,顯示關閉。 寫命令01H,顯示清屏,數(shù)據(jù)指針清0。 寫命令06H,寫一個字符后地址指針加1。 寫命令0CH,設置開顯示,不顯示光標。86 需注意,在進行上述設置及對數(shù)據(jù)進行讀取時,通常需要檢測忙標志位BF如果為1,則說明忙,要等待;如果BF為0,則可進行下一步操作。5LCD1602基本操作 LCD為慢顯示器件,所以在寫每條命令前,一定要查詢忙標志位BF,即是否處于“忙”狀態(tài)。如LCD正忙于處理其他命令,就等待;如不忙,則向LCD寫入命令。 標志位BF連接在8位雙向數(shù)據(jù)線的D7位上。如果BF=0,表示LCD不忙;如果BF=1,表示LCD處于忙狀態(tài),需等待。 LCD
47、1602的讀寫操作規(guī)定見表5-4。87LCD1602與AT89S51的接口電路見圖5-18。 圖5-18 單片機與LCD1602接口電路88 由圖5-18可看出,LCD1602的RS、R/W*和E這3個引腳分別接在P2.0、P2.1和P2.2引腳,只需通過對這3個引腳置“1”或清“0”,就可實現(xiàn)對LCD1602的讀寫操作。 具體來說,顯示一個字符的操作過程為“讀狀態(tài)寫命令寫數(shù)據(jù)自動顯示”。(1)讀狀態(tài) 是對LCD1602 的“忙”標志BF進行檢測,如果BF=1,說明LCD處于忙狀態(tài),不能對其寫命令;如果BF=0,則可寫入命令。 檢測忙標志函數(shù)具體如下:8989void check_busy(v
48、oid) /檢查忙標志函數(shù)uchar dt;dodt=0 xff; / dt為變量單元,初值為0 xff E=0;RS=0; /按照表5-4讀寫操作規(guī)定RS=0,E=1時才可讀忙標志RW=1;E=1;dt=out;/ out為P0口,P0口的狀態(tài)送入dt中 while(dt&0 x80); / 如果忙標志BF=1,繼續(xù)循環(huán)檢測,等待BF=0E=0; / BF=0,LCD不忙,結束檢測函數(shù)檢測P0.7腳電平,即檢測忙標志BF,如BF=1,說明LCD處于忙狀態(tài),不能執(zhí)行寫命令;BF=0,可執(zhí)行寫命令。90(2)寫命令寫命令函數(shù)如下:void write_command(uchar com) /寫命
49、令函數(shù)check_busy();E=0; /按規(guī)定RS和E同時為0時可以寫入命令RS=0; RW=0;out=com;/將命令com寫入P0口E=1; /按規(guī)定寫命令時,E應為正脈沖,即正跳變,所以前面先置E=0_nop_( );/空操作1個機器周期,等待硬件反應E=0;/ E由高電平變?yōu)榈碗娖剑琇CD開始執(zhí)行命令delay(1);/延時,等待硬件響應9191(3)寫數(shù)據(jù) 將要顯示字符的ASCII碼寫入LCD中的數(shù)據(jù)顯示RAM(DDRAM),例如將數(shù)據(jù)“dat”,寫入LCD模塊。寫數(shù)據(jù)函數(shù)如下:void write_data(uchar dat)/寫數(shù)據(jù)函數(shù)check_busy();/檢測忙標
50、志BF=1則等待,若BF=0,則可對LCD操作E=0; /按規(guī)定寫數(shù)據(jù)時,E應為正脈沖,所以先置E=0RS=1;/按規(guī)定RS=1和RW=0時可以寫入數(shù)據(jù)RW=0; out=dat;/將數(shù)據(jù)dat從P0口輸出,即寫入LCD E=1; /E產(chǎn)生正跳變_nop_();/空操作,給硬件反應時間E=0;/E由高變低,寫數(shù)據(jù)操作結束9292delay(1);(4)自動顯示 數(shù)據(jù)寫入LCD后,自動讀出字符庫ROM(CGROM)中的字型點陣數(shù)據(jù),并自動將字型點陣數(shù)據(jù)送到液晶顯示屏上顯示。936. LCD 1602初始化 使用LCD 1602前,需對其顯示模式進行初始化設置,初始化函數(shù)如下void LCD_in
51、itial(void)/液晶顯示器初始化函數(shù)write_command(0 x38);/寫入命令0 x38:兩行顯示,57點陣,8位數(shù)據(jù)_nop_();/空操作,給硬件反應時間write_command(0 x0C);/寫入命令0 x0C:開整體顯示,光標關,無黑塊_nop_();/空操作,給硬件反應時間write_command(0 x06);/寫入命令0 x06:光標右移_nop_();/空操作,給硬件反應時間write_command(0 x01);/寫入命令0 x01:清屏delay(1); 注意:在函數(shù)開始處,由于LCD尚未開始工作,所以不需檢測忙標志,但是初始化完成后,每次再寫命令
52、、讀寫數(shù)據(jù)操作,均需檢測忙標志。94955.5.2 單片機控制字符型LCD 1602顯示案例 【例5-9】用單片機驅(qū)動字符型液晶顯示器LCD1602,使其顯示兩行文字:“Welcom” 與“Harbin CHINA”。見圖5-19。 在Proteus中,LCD1602的仿真模型采用LM016L。1LM016L引腳及特性 LM016L的原理符號及引腳見圖5-20。與LCD1602引腳信號相同。引腳功能如下:969697圖5-19 單片機與字符型LCD接口電路與仿真 97(1)數(shù)據(jù)線D7D0;(2)控制線(3根:RS、RW、E);(3)兩根電源線(VDD、VEE)。(4)地線Vss;LM016L的
53、屬性設置見圖5-21,具體如下:(1)每行字符數(shù)為16,行數(shù)為2;(2)時鐘為250kHz;(3)第1行字符的地址為80H8FH;(4)第2行字符的地址為C0HCFH。989899 圖5-20 字符型液晶顯示器LCD引腳 圖5-21 字符型液晶顯示器LM016L的屬性設置992原理電路設計(1)從Proteus庫中選取元器件如下:AT89C51:單片機;LM016L:字符型顯示器;POT-LIN:滑動變阻器;RP1、RP2:排電阻。(2)放置元器件、放置電源和地、連線、元器件屬性設置、電氣檢測所有操作都在ISIS中完成,具體操作見4.6節(jié)的介紹。1001003C51源程序設計 通過Keil V
54、ision3建立工程,再建立源程序“*.c”文件,操作見3.4節(jié)。在前面介紹的LCD1602基本操作函數(shù)的基礎上,不難理解如下源程序。參考程序: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); /檢查忙標志函數(shù)void wri
55、te_command(uchar com); /寫命令函數(shù)void write_data(uchar dat);/寫數(shù)據(jù)函數(shù)void string(uchar ad ,uchar *s);void lcd_test(void);void delay(uint);/延時函數(shù)102void main(void) /主函數(shù)lcd _initial( );/調(diào)用對LCD初始化函數(shù) while(1) string(0 x85,Welcome);/顯示的第1行字符串string(0 xC2,Harbin CHINA);/顯示的第2行字符串delay(100); /延時write_command(0 x01
56、);/寫入清屏命令delay(100);/延時void delay(uint j)/1ms延時子程序uchar i=250;for(;j0;j-)103103while(-i);i=249;while(-i);i=250;void check_busy(void)/檢查忙標志函數(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) /寫命令函數(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) /寫數(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);/寫入命令0 x38:8位兩行顯示,57點陣字符write_command(0 x0C);/寫入命令0 x0C:開整體顯示,光標關,無黑塊write_command(0 x06);/寫入命令0 x06:光標右移106106write_command(0 x01); /寫入命令
58、0 x01:清屏delay(1);void string(uchar ad,uchar *s)/輸出顯示字符串的函數(shù)write_command(ad);while(*s0)write_data(*s+);/輸出字符串,且指針增1delay(100);107107 最后通過按鈕“Build target”編譯源程序,生成目標代碼“*.hex”文件。若編譯失敗,對程序修改調(diào)試直至編譯成功。4. Proteus仿真(1)加載目標代碼文件 打開元器件單片機屬性窗口,在“Program File”欄中添加上面編譯好的目標代碼文件“*.hex”;在“Clock Frequency”欄中輸入晶振頻率12MH
59、z。(2)仿真 單擊仿真按鈕 啟動仿真,見圖5-19。1081081095.6 鍵盤接口設計 鍵盤向單片機輸入數(shù)據(jù)、命令等功能,是人機對話的主要手段。 由若干按鍵按照一定規(guī)則組成。每一個按鍵實質(zhì)上是一個按鍵開關,按構造可分為有觸點開關按鍵和無觸點按鍵。 有觸點開關按鍵常見的有:觸摸式鍵盤、薄膜鍵盤、導電橡膠、按鍵式鍵盤等,最常用的是按鍵式鍵盤。 無觸點開關按鍵有電容式按鍵、光電式按鍵和磁感應按鍵等。 下面介紹按鍵式開關鍵盤工作原理、方式以及接口設計與軟件編程。1101105.6.1 鍵盤接口設計應解決的問題1鍵盤的任務 任務3項。(1)判別是否有鍵按下?若有,進入下一步。(2)識別哪一個鍵被按
60、下,并求出相應的鍵值。(3)根據(jù)鍵值,找到相應鍵值處理程序入口。1112鍵盤輸入特點 鍵盤一個按鍵實質(zhì)就是一個按鈕開關。 圖5-22(a)所示按鍵開關的兩端分別連接在行線和列線上,列線接地,行線通過電阻接到+5V上。鍵盤開關機械觸點的斷開、閉合,其行線電壓輸出波形如圖5-22(b)所示。 圖5-22(b)所示的t1和t3分別為鍵的閉合和斷開過程中的抖動期(呈現(xiàn)一串負脈沖),抖動時間長短與開關機械特性有關,一般為510ms,t2為穩(wěn)定的閉合期,其時間由按鍵動作確定,一般為十分之幾秒到幾秒,t0、t4為斷開期。112112113圖5-22 鍵盤開關及其行線波形1133按鍵的識別 按鍵閉合與否,反應
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 坐姿娃娃產(chǎn)品供應鏈分析
- 生產(chǎn)香料制品用香精油項目運營指導方案
- 衣領項目營銷計劃書
- 蓄電池市場分析及投資價值研究報告
- 含藥物的護足霜產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 心理咨詢行業(yè)營銷策略方案
- 玻璃器皿用紙制杯墊項目運營指導方案
- 醫(yī)用防塵衛(wèi)生口罩產(chǎn)品供應鏈分析
- 穿戴式揚聲器產(chǎn)品供應鏈分析
- 舉辦水球比賽行業(yè)經(jīng)營分析報告
- 績效考核及薪酬機制和執(zhí)行情況審計報告模板
- 組分模型與pvti模塊擬合
- 黑色素瘤診斷與治療演示課件(PPT 38頁)
- 高中數(shù)學奧賽輔導:第四講不定方程
- 02 明渠均勻流斷面尺寸設計
- 第八講 matlab simulink基礎.
- 創(chuàng)傷急救周圍血管損傷
- 通力電梯KCE電氣系統(tǒng)學習指南
- 電子商務師_4級_理論知識題庫-判斷題-全部判斷題
- 苗木材料報審及進場清單
- 腎移植術的解剖(1)
評論
0/150
提交評論