版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第10章
AT89S51單片機(jī)與輸入/
輸出外設(shè)的接口
1內(nèi)容概要大多數(shù)單片機(jī)應(yīng)用系統(tǒng),都要配置輸入外設(shè)和輸出外設(shè)。常見輸入外設(shè)有鍵盤、BCD碼撥盤等;輸出外設(shè)有LED數(shù)碼管、LCD顯示器、打印機(jī)等。本章介紹AT89S51單片機(jī)與各種輸入外設(shè)、輸出外設(shè)的接口電路設(shè)計以及軟件編程。
210.1LED數(shù)碼管顯示器的接口設(shè)計LED(LightEmittingDiode)數(shù)碼管應(yīng)用非常普遍,由發(fā)光二極管構(gòu)成。10.1.1LED數(shù)碼管的工作原理常見的LED數(shù)碼管為“8”字型的,共計8段。每一段對應(yīng)一個發(fā)光二極管。這種數(shù)碼管顯示器有共陽極和共陰極兩種,如圖10-1所示。共陰極LED數(shù)碼管的發(fā)光二極管的陰極連接在一起,通常此公共陰極接地。當(dāng)某個發(fā)光二極管的陽極為高電平時,發(fā)光二極管點亮,相應(yīng)的段被顯示。
4圖10-18段LED數(shù)碼管結(jié)構(gòu)及外形同樣,共陽極數(shù)碼管的發(fā)光二極管的陽極連接在一起,通常此公共陽極接正電壓,當(dāng)某個發(fā)光二極管的陰極接低電平時,發(fā)光二極管被點亮,相應(yīng)段被顯示。
為了使LED數(shù)碼管顯示不同的符號或數(shù)字,要把某些段的發(fā)光二極管點亮,這樣就要為LED數(shù)碼管提供代碼,因為這些代碼可使LED相應(yīng)的段發(fā)光,從而顯示不同字型,因此該代碼也稱為段碼(或稱字型碼)。
LED數(shù)碼管共計8段。因此提供給LED數(shù)碼管的段碼(或字型碼)正好是一個字節(jié)。在使用中,習(xí)慣上是以“a”段對應(yīng)段碼字節(jié)的最低位。各段與字節(jié)中各位對應(yīng)關(guān)系如表10-1所示。5
6按照上述格式,顯示各種字符的8段LED數(shù)碼管的段碼如表10-2所示。表10-1只列出了部分段碼,讀者也可對某些顯示的字符重新定義,也可選擇其他字型的LED數(shù)碼管。除了“8”字型的LED數(shù)碼管外,市面上還有“±1”型、“米”字型和“點陣”型LED顯示器,如圖10-2所示。廠家也可根據(jù)用戶的需要定做特殊字型的數(shù)碼管。本章均以“8”字型的LED數(shù)碼管為例。
89圖10-2
其他各種字型的LED顯示器10.1.2LED數(shù)碼管顯示器接口設(shè)計舉例LED數(shù)碼管有靜態(tài)顯示和動態(tài)顯示兩種顯示方式。1.LED靜態(tài)顯示方式靜態(tài)顯示指無論多少位LED數(shù)碼管,都同時處于顯示狀態(tài)。數(shù)碼管工作于靜態(tài)顯示方式時,各位的共陰極(或共陽極)連接在一起并接地(或接+5V);每位的段碼線(a~dp)分別與一個8位的I/O口鎖存器輸出相連。如果送往各個LED數(shù)碼管所顯示字符的段碼一經(jīng)確定,則相應(yīng)I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入另一個字符的段碼為止。正因10如此,靜態(tài)顯示無閃爍,亮度較高,軟件控制比較容易。
圖10-3為4位LED數(shù)碼管靜態(tài)顯示器電路,各位可獨立顯示,只要在該位的段碼線上保持段碼電平,該位就能保持相應(yīng)的顯示字符。由于各位分別由一8位的數(shù)字輸出端口控制段碼線,故在同一時間里,每一位顯示的字符可以各不相同。靜態(tài)顯示方式占用口線較多。對于圖10-3電路,要占用4個8位I/O口。如果顯示器的數(shù)目增多,則需要增加I/O口的數(shù)目。因此在顯示位數(shù)較多的情況下,一般都采用動態(tài)顯示方式。11圖10-34位LED靜態(tài)顯示的原理電路【例10-1】
圖10-4為單片機(jī)通過82C55與3個數(shù)碼管顯示器的靜態(tài)顯示電路。圖中82C55的PA口、PB口、PC口及控制口的端口地址分別為7CFFH、7DFFH、7EFFH、7FFFH。顯示程序如下:#include<reg51.h>#include<absacc.h>#defineucharunsignedchar #definecmd8255XBYTE[0x7fff] /*82C55的控制字寄存器端口地址0x7fff*/ #definePA8255XBYTE[0x7cff] /*82C55的PA端口地址0x7cff*/ #definePB8255XBYTE[0x7dff]/*82C55的PB端口地址0x7dff*/ #definePC8255XBYTE[0x7eff] /*82C55的PC端口地址0x7eff*/ uchar
idatadis_buf[3]; /*顯示緩沖區(qū)*/ 1314圖10-482C55與3位LED顯示器的接口電路ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; /*共陰極數(shù)碼管段碼表*/voiddisplay(void){ uchar
segcode;
segcode=dis_buf[0];
segcode=table[segcode]; /*段碼*/ PA=segcode; /*段碼送PA口的數(shù)碼管顯示*/
segcode=dis_buf[1];
segcode=table[segcode]; /*段碼*/ PB=segcode; /*段碼送PB口的數(shù)碼管顯示*/
segcode=dis_buf[2];
segcode=table[segcode]; /*段碼*/15PC=segcode; /*段碼送PC口的數(shù)碼管顯示*/}voidmain(void){ cmd8255=0x80; /*向82C55控制寄存器寫入控制字*/dis_buf[3]={1,2,3};display()while(1) }上述程序依次在3個顯示器上顯示“1”、“2”、“3”(按照PA口、PB口、PC口的次序)。如改變顯示的內(nèi)容,只需改變顯示緩沖區(qū)的內(nèi)容即可。
162.LED動態(tài)顯示方式當(dāng)顯示位數(shù)較多,靜態(tài)顯示所需的I/O口太多,這時常采用動態(tài)顯示。為節(jié)省I/O口,通常將所有顯示器的段碼線的相應(yīng)段并聯(lián)在一起,由一個8位I/O口控制,而各位顯示位的公共端分別由相應(yīng)的I/O線控制。圖10-5所示為一個4位8段LED動態(tài)顯示器電路。其中段碼線占用一個8位I/O口,而位選控制使用一個I/O口的4位口線。動態(tài)顯示就是通過段碼線向顯示器(所有的)輸出所要顯示字符的段碼。每一時刻,只有一位位選線有效,其他各位都無效。逐位地每隔一定時間輪流點亮各位顯示器(掃描方式),由于LED數(shù)碼管的余輝和人眼的“視覺暫留”17圖10-54位8段LED動態(tài)顯示的原理電路作用,只要控制好每位顯示的時間和間隔,則可以造成“多位同時亮”的假象,達(dá)到同時顯示的效果。LED不同位顯示的時間間隔(掃描間隔)應(yīng)根據(jù)實際情況而定。發(fā)光二極管從導(dǎo)通到發(fā)光有一定的延時,如果導(dǎo)通時間太短,發(fā)光太弱,人眼無法看清;時間太長,要受限于臨界閃爍頻率,而且此時間越長,占用單片機(jī)時間也越多。另外,顯示位數(shù)增多,也將占用單片機(jī)大量時間,因此動態(tài)顯示的實質(zhì)是以犧牲單片機(jī)時間來換取I/O端口減少。下面介紹一個動態(tài)顯示的接口實例。
19【例10-2】圖10-6為單片機(jī)通過82C55控制8位共陰極顯示器動態(tài)顯示的接口電路。圖中7407為驅(qū)動電路芯片。82C55的PA口、PB口、PC口及控制口的端口地址分別為7FFCH、7FFDH、7FFEH、7FFFH。8位待顯示的字符存放在dis_buf數(shù)組中,程序中的table為顯示字符的段碼表。顯示時,PB口輸出段碼,PA口輸出位控碼。動態(tài)顯示程序如下。20圖10-68位LED動態(tài)顯示過程和結(jié)果#include<reg51.h>#include<absacc.h>#defineucharunsignedchar #definecmd8255XBYTE[0x7fff] /*82C55的控制字寄存器端口地址0x7fff*/ #definePA8255XBYTE[0x7ffc] /*82C55的PA口地址0x7ffc*/ #definePB8255XBYTE[0x7ffd] /*82C55的PB口地址0x7ffd*/ #definePC8255XBYTE[0x7ffe] /*82C55的PC口地址0x7ffe*/ uchar
idatadis_buf[8]; /*顯示緩沖區(qū)*/ ucharcodetable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; /*共陰極數(shù)碼管段碼表*/22voiddelay(uchard); /*延時函數(shù),用戶根據(jù)實際需要自行編寫*/voiddisplay(void){ uchar
segcode,bitcode,i;
bitcode=0xfe; /*點亮最左邊的顯示器的位控碼*/
for(i=0;i<7;i++){ segcode=dis_buf[i]; PB8255=table[segcode]; /*段碼從PB口輸出*/ PA8255=bitcode;/*位控碼從PA口輸出,點亮某一位*/ delay(1); /*延時*/
bitcode=bitcode<<1; /*位控碼左移1位*/
bitcode=bitcode│0x01; } }23voidmain(void){cmd8255=0x80;dis_buf[8]={1,2,3,4,5,6,7,8};while(1){display()}}與靜態(tài)顯示比,動態(tài)顯示優(yōu)點節(jié)省I/O口,顯示器越多,優(yōu)勢越明顯。缺點顯示亮度不如靜態(tài)顯示的高,要調(diào)整好“掃描”速率,如果“掃描”速率較低,會出現(xiàn)閃爍現(xiàn)象。2410.2鍵盤的接口設(shè)計鍵盤功能:向單片機(jī)輸入數(shù)據(jù)、命令等,是人與單片機(jī)對話的主要手段。下面介紹鍵盤工作原理和工作方式。10.2.1鍵盤接口應(yīng)解決的問題1.鍵盤的任務(wù)任務(wù)有3項:(1)首先判別是否有鍵按下?若有,進(jìn)入下一步。(2)識別哪一個鍵被按下,并求出相應(yīng)的鍵值。(3)根據(jù)鍵值,找到相應(yīng)鍵值的處理程序入口。
252.鍵盤輸入的特點常見鍵盤:觸摸式鍵盤、薄膜鍵盤和按鍵式鍵盤,最常用的是按鍵式鍵盤。鍵盤按鍵實質(zhì)上是一個開關(guān)。如圖10-7(a)所示,按鍵開關(guān)的兩端分別連接在行線和列線上,通過鍵盤開關(guān)機(jī)械觸點的斷開、閉合,其行線電壓輸出波形如圖10-7(b)所示。圖10-7(b)所示的t1和t3分別為鍵的閉合和斷開過程中的抖動期(呈現(xiàn)一串負(fù)脈沖),抖動時間長短與開關(guān)的機(jī)械特性有關(guān),一般為5~10ms,t2為穩(wěn)定的閉合期,其時間由按鍵動作確定,一般為十分之幾秒到幾秒,t0、t4為斷開期。
26圖10-7鍵盤開關(guān)及其行線波形
3.按鍵的識別鍵的閉合與否,反映在行線輸出電壓上就是呈現(xiàn)高電平或低電平,通過對行線電平的高低狀態(tài)的檢測,便可確認(rèn)按鍵是否按下以及是否釋放。為確保單片機(jī)對一次按鍵動作只確認(rèn)一次按鍵有效,必須消除抖動期t1和t3的影響。4.如何消除按鍵的抖動去抖動的方法有兩種,一種是用軟件延時來消除按鍵抖動,基本思想是:在檢測到有鍵按下時,該鍵所對應(yīng)的行線為低電平,執(zhí)行一段延時10ms的子程序后,確認(rèn)該行線電平是否仍為低電平,如果仍為低電平,則確認(rèn)該行確實有鍵按下。當(dāng)按鍵松開時,行線的低電平變?yōu)楦唠娖剑?8執(zhí)行一段延時10ms的子程序后,檢測該行線為高電平,說明按鍵確實已經(jīng)松開。采取以上措施,可消除兩個抖動期t1和t3的影響。另一種去除按鍵抖動的方法是采用專用的鍵盤/顯示器接口芯片,這類芯片中都有自動去抖動的硬件電路。10.2.2鍵盤接口設(shè)計舉例鍵盤兩類:非編碼鍵盤和編碼鍵盤。非編碼鍵盤按鍵直接與單片機(jī)相連,通常使用在按鍵數(shù)量較少的場合。用這種鍵盤,系統(tǒng)功能通常比較簡單,需處理的任務(wù)較少,但可降低成本、簡化電路設(shè)計。按下按鍵的鍵號信息通過軟件來獲取。非編碼鍵盤常見的為兩種結(jié)構(gòu):獨立式鍵盤和矩陣式鍵盤。1.獨立式鍵盤(1)查詢方式的獨立式鍵盤程序特點:一鍵一線,鍵相互獨立,每個按鍵各接一條I/O口線,通過檢測I/O輸入線的電平狀態(tài),可很容易判斷哪個按鍵被按下。如圖10-8所示,圖中的上拉電阻保證按鍵釋放時,輸入檢測線上有穩(wěn)定的高電平,當(dāng)某一按鍵按下時,對應(yīng)的檢測線就變成了低電平,與其它按鍵相連的檢測線仍為高電平,只需讀入I/O輸入線的狀態(tài),判別哪一條I/O輸入線為低電平,就很容易識別出哪個鍵被按下。
30圖10-8
獨立式鍵盤的接口電路
優(yōu)點:電路簡單,各條檢測線獨立,識別按鍵號的軟件編寫簡單。獨立式鍵盤適用于按鍵數(shù)目較少的場合,在按鍵數(shù)目較多的場合,要占用較多的I/O口線?!纠?0-3】鍵盤為圖10-8所示的獨立式鍵盤,采用查詢方式對鍵盤的鍵值讀取。參考程序如下:#include<reg51.h>voidmain(void){ unsignedcharkeyvalue; do { P1=0xff;
keyvalue=P1;
keyvalue=~keyvalue;32
switch(keyvalue){ case1:……; /*處理0號鍵*/ break;case2:……; /*處理1號鍵*/ break;case4:……; /*處理2號鍵*/ break;case8:……; /*處理3號鍵*/ break;case16:……; /*處理4號鍵*/ break;case32:……; /*處理5號鍵*/ break;case64:……; /*處理6號鍵*/break;case128:……; /*處理7號鍵*/default:break; /*無按下鍵處理*/ }}while(1)}
34(2)中斷掃描方式的獨立式鍵盤程序為進(jìn)一步提高掃描鍵盤工作效率,可采用中斷掃描方式,如圖10-9。鍵盤只有在鍵盤有按鍵按下時,才進(jìn)行處理,所以實時性強(qiáng),效率高。當(dāng)鍵盤中有按鍵按下時,74LS30的輸出經(jīng)過74LS04反相后向單片機(jī)的中斷請求輸入引腳INT0*發(fā)出中斷請求信號,單片機(jī)響應(yīng)中斷,執(zhí)行鍵盤掃描程序中斷服務(wù)子程序,識別出按下按鍵的鍵號,并跳向該按鍵的處理程序。
3536圖10-9
獨立式鍵盤的接口電路【例10-4】鍵盤接口見圖10-9,編寫中斷方式的獨立式鍵盤處理程序。程序如下。#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineTRUE1#defineFALSE0bitkey_flage;uchar
key_value;voiddelay_10ms(void); /*延時10ms函數(shù)*/37voidmain(void){ IE=0x81; IP=0x01;key_flag=0; /*設(shè)置中斷標(biāo)志為0*/do{ if(key_flag) /*如果按鍵有效*/ { switch(key_value)/*根據(jù)按鍵分支*/ { case1:……; /*處理.0號鍵*/ break; case2:……; /*處理1號鍵*/ break; case4:……; /*處理2號鍵*/ break; case8:……; /*處理3號鍵*/ break;38case16:……; /*處理4號鍵*/break;case32:……; /*處理5號鍵*/break;case64:……; /*處理6號鍵*/break;case128:……; /*處理7號鍵*/default:break; /*無效按鍵,如多個鍵同時按下*/ }
key_flag=0; }}
while(TRUE);}39voidint0()interrupt0{ uchar
reread_key; IE=ox80; /*屏蔽中斷*/
key_flag=0; /*設(shè)置中斷標(biāo)志*/P1=0xff; /*P1口鎖存器置1*/key_value=P1; /*讀入P1口的狀態(tài)*/delay_10ms(void); /*延時10ms*/reread_key=P1&0x07; /*再次讀取P1口的狀態(tài)*/if(key_value==reread_key) { key_flag=1; /*設(shè)置中斷標(biāo)志為1*/}IE=0x81; /*中斷允許*/}402.矩陣式鍵盤矩陣式(也稱行列式)鍵盤用于按鍵數(shù)目較多場合,由行線和列線組成,一組為行線,另一組為列線,按鍵位于行、列的交叉點上。如圖10-10所示,一個44的行、列結(jié)構(gòu)可以構(gòu)成一個16個按鍵的鍵盤。在按鍵數(shù)目較多的場合,與獨立式鍵盤相比,要節(jié)省較多的I/O口線。(1)查詢方式的矩陣式鍵盤程序【例10-5】對圖10-10所示的矩陣式鍵盤,編寫查詢式的鍵盤處理程序。41圖10-10
矩陣式鍵盤接口首先判鍵盤有無鍵按下,即把所有行線P1.0~P1.3均置為低電平,然后檢查各列線的狀態(tài),若列線不全為高電平,則表示鍵盤中有鍵被按下;若所有列線列均為高電平,說明鍵盤中無鍵按下。在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。判斷閉合鍵所在的位置,其方法是依次將行線置為低電平,在逐行檢查各列線的電平狀態(tài)。若某列為低,則該列線與行線交叉處的按鍵就是閉合的按鍵。判斷有無鍵按下,以及按下鍵的位置的參考程序如下。
43#include<reg51.h>#defineucharunsignedchar #defineuintunsignedint
voidmain(void){ ucharkey; while(1){key=keyscan();/*調(diào)用鍵盤掃描函數(shù),返回的鍵值送變量key*/ delay(); /*延時*/}voiddelay(void); /*延時函數(shù)*/{ uchari;
for(i=0;i<200;i++){}}
44uchar
keyscan(void) /*鍵盤掃描函數(shù)*/{ uchar
code_h; /*行掃描值*/
uchar
code_l; /*列掃描值*/ P1=0xf0; /*P1.0~P1.3輸出都為0,準(zhǔn)備讀列狀態(tài)*/ if((P1&f0)!=0xf0) /*如果P1.4~P1.7不全為1,可能有鍵按下*/ { delay(); /*延時去抖動*/if((P1&f0)!=0xf0)/*重讀P1.4~P1.7,若還是不全為1,定有鍵按下*/code_h=0xfe; /*P1.0置為0,開始行掃描*/while((code_h&0x10)!=0xf0);/*判斷是否為最后一行,若不是,繼續(xù)掃描*/{ P1=code_h; /*P1口輸出行掃描值*/ if((P1&f0)!=0xf0); /*如果P1.4~P1.7不全為1,該行有鍵按下*/{ code_l=(P1&0xf0|0x0f);/*保留P1高4位,低4位變?yōu)?,作為列值*/
45return((~code_h)+(~code_l));/*鍵掃描值=行掃描值+列掃描值,返回主程序*/ }else /*若該行無鍵按下,往下執(zhí)行*/
code_h=(code_h<<1)|0x01;/*行掃描值左移,掃描下一行*/
} } } return(0);/*無鍵按下,返回0*/}4610.2.3鍵盤掃描方式的選取單片機(jī)忙于其他各項工作任務(wù)時,如何兼顧鍵盤的輸入,這取決于鍵盤的工作方式。鍵盤工作方式選取原則是,既要保證及時響應(yīng)按鍵操作,又不要過多占用單片機(jī)的工作時間。通常,鍵盤工作方式有3種:查詢掃描、定時掃描和中斷掃描。1.查詢掃描查詢方式(也稱編程掃描方式)是利用單片機(jī)空閑時,調(diào)用鍵盤掃描子程序,反復(fù)掃描鍵盤,來響應(yīng)鍵盤的輸入請求。例如【例10-3】和【例10-5】.47采用本掃描方式,如單片機(jī)查詢頻率過高,雖能及時響應(yīng)鍵盤的輸入,但也會影響其他任務(wù)的進(jìn)行。如查詢的頻率過低,可能出現(xiàn)鍵盤輸入漏判。所以要根據(jù)單片機(jī)系統(tǒng)的繁忙程度和鍵盤的操作頻率,來調(diào)整鍵盤掃描的頻率。2.定時掃描單片機(jī)對鍵盤的掃描也可采用定時掃描方式,即每隔一定的時間對鍵盤掃描一次。在這種方式中,通常利用單片機(jī)內(nèi)的定時器產(chǎn)生的定時中斷,進(jìn)入中斷子程序來對鍵盤進(jìn)行掃描,在有鍵按下時識別出該鍵,并執(zhí)行相應(yīng)鍵的處理程序。由于每次按鍵的時間一般不會小于100ms,所以為不漏判有效按鍵,定時中斷的周期一般應(yīng)小于100ms。483.中斷掃描方式為進(jìn)一步提高單片機(jī)掃描鍵盤的工作效率,可采用中斷掃描方式,即只有在按鍵按下時,才會向單片機(jī)的發(fā)出中斷請求信號,單片機(jī)響應(yīng)中斷,執(zhí)行鍵盤掃描程序中斷服務(wù)子程序,識別出按下的按鍵,并跳向該按鍵的處理程序。如果無鍵按下,單片機(jī)將不理睬鍵盤。此方式優(yōu)點是,只有按鍵按下時,才進(jìn)行處理,所以其實時性強(qiáng),工作效率高。
10.3鍵盤/顯示器接口的設(shè)計實例設(shè)計中,常把鍵盤和顯示器一起考慮。下面介紹幾種典型方案。4910.3.1利用并行I/O芯片82C55實現(xiàn)鍵盤/顯示器接口【例10-6】圖10-11是AT89S51用并行I/O接口芯片82C55實現(xiàn)的32鍵和8位LED數(shù)碼管顯示的鍵盤/顯示器接口電路。AT89S51外擴(kuò)一片82C55,82C55的PA、PB、PC口及控制口的地址分別為:7FFCH、7FFDH、7FFEH以及7FFFH。82C55的PA口為輸出口,控制鍵盤列線的掃描,PA口同時又是8位共陰極顯示器的位掃描口。PB口作為顯示段碼的輸出口,82C55的PC口作為鍵盤的行線狀態(tài)的輸入口,圖中7407為同相驅(qū)動器。
50圖10-11
用并行I/O接口芯片82C55實現(xiàn)鍵盤/顯示器接口電路
1.動態(tài)顯示程序設(shè)計圖10-11中的顯示部分的接口電路與圖10-6是相同的,顯示程序的設(shè)計見【例10-2】。2.鍵盤掃描程序設(shè)計鍵盤采用掃描工作方式。鍵盤程序功能有以下4方面:(1)判別鍵盤上有無鍵閉合,其方法為掃描口PA0~PA7輸出全“0”,讀PC口的狀態(tài),若PC0~3為全“1”(鍵盤上行線全為高電平),則鍵盤上沒有閉合鍵,若PC0~3不全為“1”,則有鍵閉合。(2)去除鍵的機(jī)械抖動,在判別出鍵盤上有鍵閉合后,52延遲一段時間再判別鍵盤的狀態(tài),若仍有鍵閉合,則認(rèn)為鍵盤上有鍵處于穩(wěn)定的閉合期,否則認(rèn)為是鍵的抖動。(3)判閉合鍵鍵號,對鍵盤的列線進(jìn)行逐列掃描,掃描口PA0~PA7依次輸出下列編碼,即只有一列為低電平,其余各列為高電平:53依次讀PC口的狀態(tài),若PC0~PC3為全“1”,則列線為“0”的這一列上沒有鍵閉合。閉合鍵的鍵號等于為低電平的列號加上行線為低電平的行的首鍵號。例如:PA口輸出為11111101時,讀出PC0~PC3為1101,則1行1列相交的鍵處于閉合狀態(tài),第一列的首鍵號為8,列號為1。因此,閉合鍵的鍵號N為:
N=行首鍵號+列號=8+1=9(4)對鍵的一次閉合僅作一次處理,采用的方法為等待閉合鍵釋放以后再作處理。鍵盤掃描程序如下。54#include<reg51.h>#include<absacc.h>#defineucharunsignedchar #defineuintunsignedint
voiddelay(uint);uchar
scankey(void);uchar
keyscan(void);voidmain(void){ ucharkey; while(1){ key=keyscan(); delay(2000);} }55voiddelay(uinti);{ uintj;
for(j=0;j<1;j++){}}uchar
checkkey();/*檢測有無鍵按下函數(shù),有鍵按下返回0xff,無鍵按下返回0*/{ uchari; XBYTE[0x7ffc]=0x00; /*列線PA口輸出全0*/ i=XBYTE[0x7ffe]; /*讀入行線PC口的狀態(tài)*/i=i&0x0f; /*屏蔽PC口的高4位*/if(i==0x0f)return(0); /*無鍵按下返回0*/elsereturn(0xff);}uchar
keyscan(); /*鍵盤掃描函數(shù),如有鍵按下返回該鍵的編碼,無鍵按下返回0xff*/
56{ uchar
scancode; /*定義列掃描碼變量*/uchar
codevalue; /*定義返回的編碼變量*/ucharm; /*定義行首編碼變量*/uchark; /*定義行檢測碼*/uchar
i,j; if(checkkey()==0;)return(0xff);/*檢測是否有鍵按下,無鍵按下返回0xff*/else{ delay(200);
if(checkkey()==0;)return(0xff); /*檢測是否有鍵按下,無鍵按下返回0xff*/ else { scancode=0xfe;m=0x00;/*列掃描碼,行首鍵碼賦初值*/for(i=0;i<8;i++){ k=0x01; XBYTE[0x7ffc]=scancode; /*送列掃描碼*/57for(j=0;j<8;j++){ if((XBYTE[0x7ffd]&k)==0; /*檢測當(dāng)前行是否有鍵按下*/{ codevalue=m+j; /*當(dāng)前行有鍵按下,求編碼*/ {while(((checkkey()!=0);
return(codevalue); /*返回按下鍵的編碼*/}elsek=k<<1; /*行檢測碼左移1位*/}m=m+8; /*計算下一行的首鍵碼*/scancode=scancode<<1; /*列掃描碼左移1位,掃描下一列*/} } }}5810.3.2利用串行口實現(xiàn)的鍵盤/顯示器接口當(dāng)AT89S51的串行口未作它用時,可使用串口來外擴(kuò)鍵盤/顯示器。應(yīng)用串行口方式0,外擴(kuò)移位寄存器74LS164、74LS165來構(gòu)成鍵盤/顯示器接口,這是在實際的設(shè)計中,經(jīng)常采用的一種方案,接口電路如圖10-12所示。60圖10-12
用AT89S51串行口擴(kuò)展的鍵盤/顯示器接口【例10-7】如圖10-12所示的鍵盤/顯示器接口,顯示部分接有8個74LS164,作為8個LED數(shù)碼管的段碼輸出口。P3.3作為TXD引腳同步移位脈沖輸出的控制線,P3.3=0,與門封死,禁止同步移位脈沖輸出。本靜態(tài)顯示方式要比動態(tài)顯示的亮度更大些,由于74LS164在低電平輸出時,允許通過的電流為8mA,故不必加驅(qū)動電路。與動態(tài)掃描相比較,單片機(jī)不必頻繁地掃描顯示器,提高了工作效率,因而軟件設(shè)計比較簡單。顯示子程序要求在8位數(shù)碼管顯示器上顯示“1、2、3、4、5、6、7、8”,顯示子程序如下。61#include<reg51.h>#defineucharunsignedchar sbitP3_3=P3^3;charcodetab[8]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; /*顯示字符1~8的段碼*/voiddisplay(void){ uchari; TI=0;SCON=0; /*串口方式0*/P3_3=1; /*與門打開,TXD可輸出同步移位脈沖*/for(i=0;i<8;i++){ SBUF=tab[7-i]; /*串行輸出顯示代碼到數(shù)碼管*/ while(TI==0); /*等待發(fā)送完*/TI=0;62}P3_3=0;/*與門關(guān)閉,即關(guān)閉顯示,同步移位脈沖不能輸出*/}鍵盤電路部分的74LS165是并行輸入,串行輸出的同步移位寄存器,其中QH為串行輸出端,CLK為同步脈沖輸入端,SH/LD*為控制端。若SH/LD*=0,為并行輸入數(shù)據(jù)(串行輸出端關(guān)閉);若SH/=1,為串行輸出(并行輸入關(guān)閉),74LS165的并行輸入作為鍵盤的列線,鍵盤的行線接至AT89S51的INT0*和INT1*腳,作為兩行鍵的行狀態(tài)輸入。鍵盤處理程序采用中斷方式,參考程序如下。
63#include<reg51.h>#defineucharunsignedchar int
keynum;charRxByte;charInterrupt_Flag; /*Interrupt_Flag作為區(qū)分兩個外中斷的標(biāo)志位*/sbitP10=0x90;sbitP32=0xb2; /*定義外中斷0輸入腳*/sbitP33=0xb3; /*定義外中斷1輸入腳*/voidGetKeyRxByte();main(){ keynum=0xff; EX0=1; /*允許外中斷0中斷*/ EX1=1; /*允許外中斷1中斷*/64ES=1; /*允許串行口中斷*/EA=1; /*全局中斷允許*/while(1){ if(keynum==0xff); /*鍵盤值全為高,無鍵按下*/{……} ; /*無鍵按下的處理*/else{ {……} /*有鍵按下的處理*/keynum==0xff;}}}voidint0()interrupt0using0{ P1_0=0; /*74LS165并行輸入*/P1_0=1; /*74LS165串行輸出*/Interrupt_Flag=0;}voidint1()interrupt2using0{ P1_0=0; /*74LS165并行輸入*/P1_0=1; /*74LS165串行輸出*/Interrupt_Flag=1;}voidserial_port()interrupt4using0{ if(RI==1){ RxByte=SBUF; GetKeyByte();}TI=0;RI=0;}VoidGetKeyRxByte(){ int
i,temp;
for(i=0;i<8;i++) if(((RxByte>>i)&0x01)==0) { temp=i; keynum=temp+8*Interrupt_Flag;/*得到鍵值*/ return;}}程序說明:(1)由于程序中有兩個外中斷,故設(shè)置了Interrupt_Flag作為區(qū)分兩個外中斷的標(biāo)志位,當(dāng)響應(yīng)中斷時,Interrupt_Flag=0,響應(yīng)中斷時,Interrupt_Flag=1(2)函數(shù)GetKeyRxByte()用于從接收到的串行數(shù)據(jù)中獲得鍵值,在函數(shù)中采用移位的方法來實現(xiàn)。10.3.3專用接口芯片HD7279實現(xiàn)的鍵盤/顯示器控制1.各種專用的鍵盤/顯示器接口芯片簡介使用各種專用可編程鍵盤/顯示器接口芯片,用戶可以省去編寫鍵盤/顯示器動態(tài)掃描程序以及鍵盤去抖動程序編寫的煩瑣工作,只需要單片機(jī)與專用鍵盤/顯示器接口芯片進(jìn)行正確的連接,對芯片中的各個寄存器進(jìn)行正確設(shè)置,以及編寫接口驅(qū)動程序即可。
目前各種專用的鍵盤/顯示器接口芯片種類繁多,早期較流行的是Intel公司的并行總線接口的專用鍵盤/顯示器芯片8279,目前流行的鍵盤/顯示器接口芯片與單片機(jī)的接口均串行連接,占口線少。常見的鍵盤/顯示器專用芯片有:周立功公司的ZLG7289A,南京沁恒公司的CH451、HD7279等。這些芯片對所連接的LED數(shù)碼管全都采用動態(tài)掃描方式,且控制的鍵盤均為編碼鍵盤(可直接得到閉合鍵的鍵號),且硬件直接去抖動。下面對目前較為常見的專用鍵盤/顯示器芯片給予簡要介紹。(1)專用鍵盤/顯示器接口芯片82798279是Intel公司推的可編程的鍵盤/顯示器接口芯片。鍵盤控制部分可控制8×8的鍵盤矩陣或8×8陣列的開關(guān)傳感器,并能自動獲得按下鍵的鍵號或8×8陣列中閉合的開關(guān)傳感器的位置。該芯片能自動去鍵盤抖動并具有雙鍵鎖定保護(hù)功能。顯示RAM的容量為16×8位,最多可控制16位LED數(shù)碼管顯示。但是8279的驅(qū)動電流較小,與LED數(shù)碼管相連時,需要加驅(qū)動電路,元器件較多,電路復(fù)雜,占用較大的PCB面積,綜合成本高。而且8279與單片機(jī)之間采用三總線結(jié)構(gòu)連接,要占用多達(dá)13條口線,目前8279已經(jīng)逐漸淡出市場。(2)專用鍵盤/顯示器接口芯片CH451可動態(tài)驅(qū)動8位LED數(shù)碼管,具有BCD碼譯碼、閃爍、移位等功能。內(nèi)置大電流驅(qū)動電路,段電流不小于30mA,位電流不小于160mA,動態(tài)掃描控制,支持段電流上限調(diào)整,可省去所有限流電阻。芯片內(nèi)置的64鍵盤控制器,可對8×8矩陣鍵盤自動掃描,且自動去抖動,并提供鍵盤中斷和按鍵釋放標(biāo)志位,可供查詢按鍵按下與釋放狀態(tài)。片內(nèi)有上電復(fù)位電路和看門狗定時器,可提供高電平有效和低電平有效的兩種復(fù)位輸出。該芯片性價比較高,是使用較為廣泛的專用接口芯片。但其抗干擾能力不是很強(qiáng),不支持組合鍵的識別。(3)專用鍵盤/顯示器接口芯片HD7279HD7279芯片功能強(qiáng),具有一定的抗干擾能力,與單片機(jī)間采用串行連接,可控制并驅(qū)動8位LED數(shù)碼管和實現(xiàn)64(8×8)鍵的鍵盤管理。由于HD7279的外圍電路簡單,價格低廉,目前在鍵盤/顯示器接口的設(shè)計中得到了較為廣泛的應(yīng)用。2.HD7279A簡介HD7279A能同時驅(qū)動8個共陰極LED數(shù)碼管(或64個獨立的LED發(fā)光二極管)和64(88)鍵的編碼鍵盤矩陣??刂芁ED數(shù)碼管采用動態(tài)掃描的循環(huán)顯示方式。HD7279A有如下特性:與AT89S51間采用串行接口方式,僅占4條口線,接口簡單;具有自動消除鍵抖動并識別有效鍵值的功能。內(nèi)部有譯碼器,可直接接收BCD碼或十六進(jìn)制碼,同時具有兩種譯碼方式,實現(xiàn)LED數(shù)碼管的位尋址和段尋址,可方便地控制每位LED數(shù)碼管中任意一段是否發(fā)光;內(nèi)部含驅(qū)動器,可直接驅(qū)動不超過25.4mm的LED數(shù)碼管;多種控制命令,如消隱、閃爍、左移、右移和段尋址、位尋址等;含有片選信號輸入端,容易實現(xiàn)多于8位顯示器或多于64鍵的鍵盤控制。(1)引腳說明與電氣特性28引腳標(biāo)準(zhǔn)雙列直插式封裝(DIP),單一+5V供電。引腳如圖10-13所示,引腳功能見表10-3。DIG0~DIG7為位驅(qū)動輸出端,可連接8只LED數(shù)碼管的共陰極;段驅(qū)動輸出端SA~SG分別連接至LED數(shù)碼管的a~g段的陽極,而DP腳連至小數(shù)點dp的陽極。DIG0~DIG7和DP以及SA~SG還分別是64鍵的鍵盤的列線和行線,完成對鍵盤的譯碼和鍵值識別。88矩陣陣列中的每個鍵值(見圖10-17)可用讀鍵盤命令讀出,鍵值范圍是00H~3FH。圖10-13HD7279A的引腳HD7279A芯片與單片機(jī)連接僅需4條口線:CS*、DATA、CLK和KEY。CS*:當(dāng)單片機(jī)訪問HD7279A(寫入命令、顯示數(shù)據(jù)、位地址、段地址或讀出鍵值等)時,應(yīng)將CS*置為低電平。DATA:串行數(shù)據(jù)端,當(dāng)單片機(jī)向HD7279A發(fā)送數(shù)據(jù)時,DATA為輸入端;當(dāng)單片機(jī)從HD7279A讀入鍵值時,DATA為輸出端。CLK:數(shù)據(jù)串行傳送的同步時鐘輸入端,時鐘的上升沿將數(shù)據(jù)寫入HD7279A中或從HD7279A中讀出數(shù)據(jù)。KEY:按鍵信號輸出端,在無鍵按下時為高電平,在有鍵按下時變?yōu)榈碗娖剑⑶乙恢北3值皆摪聪骆I至釋放為止。
為復(fù)位端,由低電平變?yōu)楦唠娖剑⒔?jīng)過18~25ms復(fù)位結(jié)束。通常,該端接+5V即可。若對可靠性要求較高,則可外接復(fù)位電路,或直接由單片機(jī)控制。RC腳用于外接振蕩元件,其典型值為R=1.5k,C=15pF。NC腳必須懸空。HD7279A的電氣特性如表10-4所示。(2)控制命令介紹HD7279A芯片的控制命令由6條不帶數(shù)據(jù)的單字節(jié)純命令、7條帶數(shù)據(jù)的命令和1條讀鍵盤命令組成。①純命令(6條)。所有純命令都是單字節(jié)命令,如表10-5所示。②帶數(shù)據(jù)命令(7條)。均由雙字節(jié)組成,第一字節(jié)為命令標(biāo)志碼(有的還有位地址),第二字節(jié)為顯示內(nèi)容。a.按方式0譯碼顯示命令命令中的a2、a1、a0表示LED數(shù)碼管的位地址,表示顯示數(shù)據(jù)應(yīng)送給哪一位LED,a2、a1、a0=000表示LED最低位,a2、a1、a0=111表示LED最高位。d2、d1、d0為顯示數(shù)據(jù),HD7279A收到這些數(shù)據(jù)后,將按表10-6所示的規(guī)則譯碼和顯示。dp為小數(shù)點顯示控制位,dp=1時,小數(shù)點顯示,dp=0時,小數(shù)點不顯示。命令中的×××為無影響位。例如,命令第一字節(jié)為80H,第二字節(jié)為08H,則L1位LED顯示內(nèi)容為8,小數(shù)點dp熄滅:命令第一字節(jié)為87H,第二字節(jié)為8EH,則L8位LED顯示內(nèi)容為P,小數(shù)點dp點亮。b.按方式1譯碼顯示命令該命令和方式0譯碼顯示的含義基本相同,不同的是譯碼方式為1,LED顯示的內(nèi)容與十六進(jìn)制相對應(yīng),如表10-7。例如,命令第一字節(jié)為C8H,第二字節(jié)09H,則L1位LED顯示內(nèi)容為9,小數(shù)點dp熄滅;命令第一字節(jié)為C9H,第二字節(jié)為8FH,則L2位LED顯示內(nèi)容為F,小數(shù)點dp點亮。c.不譯碼顯示命令命令中的a2、a1、a0為顯示位的位地址,第2字節(jié)為LED顯示內(nèi)容,其中dp和A~G分別代表小數(shù)點和對應(yīng)的段,當(dāng)取值為1時,該段點亮;取值為0時,該段熄滅。該命令可在指定位上顯示字符。例如,若第一字節(jié)為95H,第二字節(jié)3EH,則在L6位LED上顯示字符U,小數(shù)點dp
熄滅。d.閃爍控制命令該命令規(guī)定了每個數(shù)碼管的閃爍屬性。d8~d1分別對應(yīng)L8~L1位數(shù)碼管,其值為1時,LED不閃爍;其值為0時,LED閃爍。該命令的默認(rèn)狀態(tài)是所有的數(shù)碼管均不閃爍。例如,命令第一字節(jié)為88H,第二字節(jié)為97H,則L7、L6、L4位LED閃爍。e.消隱控制命令該命令規(guī)定了每個數(shù)碼管的消隱屬性。d8~d1分別對應(yīng)L8~L1位數(shù)碼管,其值為1時,LED顯示;值為0時消隱,。應(yīng)注意至少要有一個LED數(shù)碼管保持顯示,如果全部消隱,則該命令無效。例如,命令第一字節(jié)為98H,第二字節(jié)為81H,則L7~L2位的6位LED消隱。
f.段點亮命令該命令是點亮某個LED數(shù)碼管中的某一段或獨立的64個LED發(fā)光二極管中的某一個。命令中××為無影響位,d5~d0取值為00H~3FH,所對應(yīng)點亮段如表10-8所示。例如,命令第一字節(jié)為E0H,第二字節(jié)為00H,則點亮L1位LED的g段;如果第二字節(jié)為19H,則點亮L4位LED的f段;再如第二字節(jié)為35H,則點亮L7位LED的b段;
g.段關(guān)閉命令本命令是從HD7279A讀出當(dāng)前的鍵值。命令的第一字節(jié)為15H,表示單片機(jī)寫到HD7279A的是讀鍵命令,第二字節(jié)d7~d0為從HD7279A中讀出的按鍵值,其范圍為00H~3FH。當(dāng)按鍵按下時,KEY引腳從高電平變?yōu)榈碗娖?,并保持到按鍵釋放為止。在此期間,若HD7279A收到來自單片機(jī)的讀鍵盤命令15H,則HD7279A向單片機(jī)發(fā)出當(dāng)前的按鍵代碼。應(yīng)注意,HD7279A只能給出其中一個按下鍵的代碼,不適合兩個或兩個以上鍵同時按下的場合。如確實需雙鍵組合使用,可在單片機(jī)某位I/O引腳接一鍵,HD7279A所連鍵盤共同組成雙鍵功能。④時序HD7279A用串行方式與單片機(jī)通信,串行數(shù)據(jù)從DATA引腳送入或輸出,并與CLK端同步。當(dāng)片選信號變?yōu)榈碗娖胶?,DATA引腳上的數(shù)據(jù)在CLK脈沖上升沿作用下寫入或讀出HD7279A的數(shù)據(jù)緩沖器。
(3)命令時序a.純命令時序單片機(jī)發(fā)出8個CLK脈沖,向HD7279A發(fā)出8位命令,DATA引腳最后為高阻態(tài),如圖10-14所示。圖10-14
純命令時序
b.帶數(shù)據(jù)命令時序單片機(jī)發(fā)出16個CLK脈沖,前8個向HD7279A發(fā)送8位命令;后8個向HD7279A傳送8位顯示數(shù)據(jù),DATA引腳最后為高阻態(tài),如圖10-15。圖10-15
帶數(shù)據(jù)命令時序c.讀鍵盤命令時序單片機(jī)發(fā)出16個CLK脈沖,前8個向HD7279A發(fā)送8位命令;發(fā)送完之后DATA引腳為高阻態(tài);后8個CLK由HD7279A向單片機(jī)返回8位按鍵值,DATA引腳為輸出狀態(tài)。最后一個CLK脈沖的下降沿將DATA引腳恢復(fù)為高阻態(tài),如圖10-16所示。圖10-16
讀鍵盤命令時序保證正確時序是HD7279A正常工作的前提。當(dāng)選定HD7279A的振蕩元件RC和單片機(jī)的晶振之后,應(yīng)調(diào)節(jié)延時時間,使時序中的T1~T8滿足表10-9所示要求。由表中的數(shù)值可知HD7279A的速度,應(yīng)仔細(xì)調(diào)整HD7279A的時序,使其運行時間接近最短。3.AT89S51單片機(jī)與HD7279A接口設(shè)計(1)硬件接口電路
圖10-17為AT89S51通過HD7279A控制8個LED數(shù)碼管以及64鍵矩陣鍵盤的接口電路。晶振頻率為12MHz。上電后,HD7279A大約經(jīng)過15~18ms的時間才進(jìn)入工作狀態(tài)。單片機(jī)通過引腳的電平(已接至單片機(jī)P1.3腳,)來判斷鍵盤矩陣中是否有按鍵按下。HD7279A采用動態(tài)循環(huán)掃描方式,如采用普通的LED數(shù)碼管亮度不夠,則可采用高亮度或超高亮度型號的LED數(shù)碼管。圖10-17所示的3、5、26引腳懸空。圖10-17AT89S51單片機(jī)與HD7279A的接口電路
(2)程序設(shè)計控制顯示器顯示及鍵盤的主要程序如下。#include<reg51.h>/*定義各種函數(shù)*/voidwrite7279(unsignedchar,unsignedchar);/*寫7279*/unsignedcharread7279(unsignedchar); /*讀7279*/voidsend_byte(unsignedchar);/*發(fā)送一個字節(jié)*/unsignedreceive_byte(void); /*接收一個字節(jié)*/voidlongdelay(void); /*長延時函數(shù)*/voidshortdelay(void);/*短延時函數(shù)*/voiddelay10ms(unsignedchar);/*延時unsignedchar個10ms函數(shù)*//*變量及IO口定義*/unsignedcharkey_number,i,j;unsignedint
tmp;unsignedlongwait_cnter;sbitCS=P1^0; /*HD7279A的CS端連P1.0*/sbitCLK=P1^1; /*HD7279A的CLK端連P1.1*/sbitDATA=P1^2; /*HD7279A的DATA端連P1.2*/sbitKEY=P1^3; /*HD7279A的KEY端連P1.3*//*HD7279A命令定義*/#defineRESET0xa4; /*復(fù)位命令*/ #defineREADKEY0x15; /*讀鍵盤數(shù)據(jù)命令*/ #defineDECODE00x80; /*方式0譯碼命令*/ #defineDECODE10xc8; /*方式1譯碼命令*/#defineUNDECODE0x90; /*不譯碼命令*/ #defineSEGON0xe0; /*段點亮命令*/ #defineSEGOFF0xc0; /*段關(guān)閉命令*/ #defineBLINKCTL0x88; /*閃爍控制命令*/#defineTEST0xbf; /*測試命令*/ #defineRTL_CYCLE0xa3; /*循環(huán)左移命令*/#defineRTR_CYCLE0xa2; /*循環(huán)右移指令*/#defineRTL_UNCYL0xa1; /*左移命令*/ #defineRTR_UNCYL0xa0; /*右移命令*//*主程序*/voidmain(void) { while(1) { for(tmp=0;tmp<0x3000;tmp++); /*上電延時*/send_byte(RESET); /*發(fā)送復(fù)位HD7279A的命令*//*發(fā)送測試命令*/send_byte(TEST); /*發(fā)送測試命令,LED全部點亮并閃爍*/for(j=0;j<5;j++); /*延時約5秒*/{ delay10ms(100);}send_byte(RESET); /*發(fā)送復(fù)位HD7279A的命令,關(guān)閉顯示器顯示*//*鍵盤監(jiān)測:如有鍵按下,則將鍵碼顯示出來,如10ms內(nèi)無鍵按下或按下0鍵,則往下執(zhí)行*/wait_cnter=0;key_number=0xff;write7279(BLINKCTL,0xfc); /*把第1、2兩位設(shè)為閃爍顯示*/write7279(UNDECODE,0x08); /*在第1位上顯示下劃線“_”*/write7279(UNDECODE+1,0x08);/*在第2位上顯示下劃線“_”*/do{ if(!key) /*如果鍵盤中有鍵按下*/ { key_number=read7279(READKEY);/*讀出鍵碼*/write7279(DECODE1+1,key_number/16);/*在第2位顯示按鍵碼高8位*/write7279(DECODE1,key_number&0x0f);/*在第1位顯示按鍵碼低8位*/while(!key); /*等待按鍵松開*/wait_cnter=0}wait_cnter++;}while(key_number!=0&&wait_cnter<0x30000);/*如果按鍵為“0”和超時則往下執(zhí)行*/write7279(BLINKCTL,0xff) /*清除顯示器的閃爍設(shè)置*//*循環(huán)顯示程序*/write7279(UNDECODE+7,0x3b) /*在第8位以不譯碼方式,顯示字符“5”*/delay10ms(100); /*延時*/for(j=0;j<31;j++); /*循環(huán)右移31次*/ { send_byte(RTR_CYCLE); /*發(fā)送循環(huán)右移命令*/delay10ms(10); /*延時*/} for(j=0;j<15;j++); /*循環(huán)左移31次*/ { send_byte(RTL_CYCLE); /*發(fā)送循環(huán)左移命令*/delay10ms(10); /*延時*/}delay10ms(200); /*延時*/send_byte(RESET); /*發(fā)送復(fù)位HD7279A的命令,關(guān)閉顯示器顯示*//*不循環(huán)左移顯示*/for(j=0;j<16;j++); /*向左不循環(huán)移動*/ { send_byte(RTL_UNCYL); /*發(fā)不循環(huán)左移命令*/write7279(DECODE0,j); /*譯碼方式0命令,在第1位顯示*/delay10ms(10); /*延時*/ }delay10ms(200); /*延時*/send_byte(RESET); /*發(fā)送復(fù)位HD7279A的命令,關(guān)閉顯示器顯示*//*不循環(huán)右移顯示*/for(j=0;j<16;j++); /*向右不循環(huán)移動*/{ send_byte(RTR_UNCYL); /*不循環(huán)右移命令*/write7279(DECODE1+7,j); /*譯碼方式1命令,顯示在第8位*/delay10ms(50); /*延時*/ }delay10ms(200); /*延時*/send_byte(RESET); /*發(fā)送復(fù)位HD7279A的命令,關(guān)閉顯示器顯示*//*顯示器的64個段輪流點亮并同時關(guān)閉前一段*/for(j=0;j<64;j++); {write7279(SEGON,j); /*將8個顯示器的64個段逐段點亮*/write7279(SEGONOFF,j-1);/*點亮1個段同時,將前1個顯示段關(guān)閉*/delay10ms(50); /*延時*/}voidwrite7279(unsignedcharcmd,unsignedchardata)/*寫7279函數(shù)*/{ send_byte(cmd);
send_byte(data);}unsignedcharread7279(unsignedcharcmd)/*讀7279函數(shù)*/{ send_byte(cmd);
return(receive_byte());
}voidsend_byte(unsignedcharout_byte)/*發(fā)送一個字節(jié)函數(shù)*/{ unsignedchari;
CS=0;
longdelay();
for(i=0;i<8;i++);
{ if(out_byte&0x_80)(DATA=1;)else(DATA=0;) CLK=1;
shortdelay()CLK=0;
shortdelay()
out_byte=out_byte*2 }DATA=0;}voidcharreceive_byte(void) /*接收一個字節(jié)函數(shù)*/{ unsignedchari,in_byte;
DATA=1; /*設(shè)置為輸入*/
longdelay(); /*長延時*/for(i=0;i<8;i++);{ CLK=1;shortdelay();
in_byte=in_byte*2if(DATA){ in_byte=in_byte|0x01;}CLK=0;shortdelay(); }DATA=0;return(in_byte); }程序中的長延時、短延時以及延時10ms三個函數(shù)程序中沒有給出,讀者自行編制。10.4AT89S51單片機(jī)與液晶顯示器(LCD)的接口LCD(LiquidCrystalDisplay)是液晶顯示器的縮寫,具有省電、抗干擾能力強(qiáng)等優(yōu)點,因此被廣泛應(yīng)用在智能儀器儀表和單片機(jī)測控系統(tǒng)中。10.4.1LCD顯示器的分類當(dāng)前市場上液晶顯示器種類繁多,按排列形狀可分為字段型、點陣字符型和點陣圖形型。(1)字段型。它是以長條狀組成字符顯示。該類顯示器主要用于數(shù)字顯示,也可用于顯示西文字母或某些字符,已廣泛用于電子表、計算器、數(shù)字儀表中。(2)點陣字符型。它專門用于顯示字母、數(shù)字、符號等。它由若干57或510的點陣組成,每一個點陣顯示一個字符。此類顯示模塊廣泛應(yīng)用在各類單片機(jī)應(yīng)用系統(tǒng)中。(3)點陣圖形型。它是在平板上排列多行或多列,形成矩陣式的晶格點,點的大小可根據(jù)顯示的清晰度來設(shè)計。這類液晶顯示器可廣泛應(yīng)用于圖形顯示,如用于筆記本電腦、彩色電視和游戲機(jī)等。10.4.2點陣字符型液晶顯示模塊介紹在單片機(jī)應(yīng)用系統(tǒng)中,常使用點陣字符型LCD顯示器。要使用點陣字符型LCD顯示器,必須有相應(yīng)的LCD控制器、驅(qū)動器來對LCD顯示器進(jìn)行掃描、驅(qū)動,還要有一定空間的RAM和ROM來存儲單片機(jī)寫入的命令和顯示字符的點陣。由于LCD的面板較為脆弱,制造商已將LCD控制器、驅(qū)動器、RAM、ROM和LCD顯示器用PCB連接到一起,稱為液晶顯示模塊(LCdModule,LCM)。使用者只需購買現(xiàn)成的液晶顯示模塊即可。單片機(jī)控制LCM時,只要向LCM送入相應(yīng)的命令和數(shù)據(jù)就可實現(xiàn)所需要的顯示內(nèi)容,這種模塊與單片機(jī)接口簡單,使用靈活方便。下面僅對使用較為常見的點陣字符型液晶顯示模塊:1602字符型LCM(兩行顯示,每行16個字符)作以介紹。1.基本結(jié)構(gòu)與特性(1)液晶顯示板在液晶顯示板上排列著若干57或510點陣的字符顯示位,從規(guī)格上分為每行8、16、20、24、32、40位,有1行、2行及4行等,用戶可根據(jù)需要,選擇購買。(2)模塊電路框圖
圖10-18為字符型LCD模塊框圖,它由日立公司生產(chǎn)的控制器HD44780、驅(qū)動器HD44100及幾個電阻和電容組成。HD44100是擴(kuò)展顯示字符位用的(例如,16字符1行模塊就可不用HD44100,16字符2行模塊就要用一片HD44100)。
圖10-18
字符型LCD模塊的電路框圖
(3)1602字符型LCM的特性①內(nèi)部具有字符發(fā)生器ROM(CGROM),即字符庫??娠@示192個57點陣字符,見圖10-19。由該字符庫可看出LCM顯示的數(shù)字和字母部分的代碼值,恰好與ASCII碼表中的數(shù)字和字母相同。所以在顯示數(shù)字和字母時,只需向LCM送入對應(yīng)的ASCII碼即可。② 模塊內(nèi)有64字節(jié)的自定義字符RAM(CGRAM),用戶可自行定義8個57點陣字符。③模塊內(nèi)有80字節(jié)的數(shù)據(jù)顯示存儲器(DDRAM)。圖10-19ROM字符庫的內(nèi)容2.LCM的引腳1602LCM通常有16個引腳,也有少數(shù)的LCM為14個引腳,其中包括8條數(shù)據(jù)線、3條控制線和3條電源線,如表10-10所示。通過單片機(jī)寫入模塊的命令和數(shù)據(jù),就可對顯示方式和顯示內(nèi)容做出選擇。3.命令格式及功能說明(1)內(nèi)部寄存器LCD控制器HD44780內(nèi)有多個寄存器,寄存器的選擇如表10-11所示。RS位和R/W*引腳上的電平?jīng)Q定對寄存器的選擇和讀/寫,而DB7~DB0決定命令功能。(2)命令功能說明下面介紹可寫入命令寄存器的11個命令。①清屏。命令格式如下:功能:清除屏幕顯示,并把地址計數(shù)器AC置“0”。②返回。命令格式如下:功能:置DDRAM(顯示數(shù)據(jù)RAM)及顯示RAM的地址為“0”,顯示返回到原始位置。
③輸入方式設(shè)置。命令格式如下:
功能:設(shè)置光標(biāo)移動方向,并指定整體顯示是否移動。其中:I/D=1,為增量方式;I/D=0,為減量方式;如S=1,表示移位;如S=0,表示不移位。
④顯示開關(guān)控制。命令格式如下:功能:D位(DB2)控制整體顯示的開關(guān),D=1,開顯示;D=0,關(guān)顯示。C位(DB1)控制光標(biāo)的開關(guān),C=1,光標(biāo)開;C=0,光標(biāo)關(guān)。B位(DB0)控制光標(biāo)處字符的閃爍,B=1,字符閃爍;B=0,字符不閃爍。⑤光標(biāo)移位。命令格式如下:功能:移動光標(biāo)或整體顯示,DDRAM中內(nèi)容不變。其中:S/C=1時,顯示移位;S/C=0時,光標(biāo)移位。R/L=1時,向右移位,R/L=0時,向左移位。⑥功能設(shè)置。命令格式如下:
功能:DL位設(shè)置接口數(shù)據(jù)位數(shù),DL=1為8位數(shù)據(jù)接口;DL=0為4位數(shù)據(jù)接口。N位設(shè)置顯示行數(shù),N=0單行顯示;N=1雙行顯示。F位設(shè)置字型大小,F(xiàn)=1時為510點陣,F(xiàn)=0時為57點陣。⑦CGRAM(自定義字符RAM)地址設(shè)置。格式如下:功能:設(shè)置CGRAM的地址,地址范圍為0~63。⑧DDRAM(數(shù)據(jù)顯示存儲器)地址設(shè)置。命令格式如下:功能:設(shè)置DDRAM的地址,地址范圍為0~127。⑨讀忙標(biāo)志BF及地址計數(shù)器。命令格式如下:
功能:BF位為忙標(biāo)志。BF=1,表示忙,此時LCM不能接收命令和數(shù)據(jù);BF=0,則表示LCM不忙,可接收命令和數(shù)據(jù)。AC位為地址計數(shù)器的值,范圍為0~127。⑩向CGRAM/DDRAM寫數(shù)據(jù)。命令格式如下:功能:將數(shù)據(jù)寫入
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 混凝土蓄水池施工方案
- 監(jiān)控系統(tǒng)施工方案
- 2026年司鉆鉆井作業(yè)模擬考試題庫及答案
- 2026 年中職保育師(幼兒生活照料)試題及答案
- 舟山2025年舟山市定海區(qū)面向大學(xué)畢業(yè)生退役士兵招聘3名事業(yè)單位工作人員筆試歷年參考題庫附帶答案詳解
- 紅河云南紅河建水縣消防救援大隊招聘政府專職消防隊員10人筆試歷年參考題庫附帶答案詳解
- 玉溪玉溪市2025年下半年事業(yè)單位招聘139人筆試歷年參考題庫附帶答案詳解
- 滁州2025年安徽滁州明光市招聘社區(qū)專職工作者28人筆試歷年參考題庫附帶答案詳解
- 湖南湖南省老干部大學(xué)2025年高層次人才招聘筆試歷年參考題庫附帶答案詳解
- 湖南2025年湖南藍(lán)山縣機(jī)關(guān)事業(yè)單位選調(diào)(選聘)44人筆試歷年參考題庫附帶答案詳解
- 影視文學(xué)劇本分析其文體特征
- (正式版)JTT 1218.6-2024 城市軌道交通運營設(shè)備維修與更新技術(shù)規(guī)范 第6部分:站臺門
- 高考物理一輪復(fù)習(xí)重難點逐個突破專題71旋轉(zhuǎn)圓模型放縮圓模型平移圓模型(原卷版+解析)
- 幼兒園大班社會課件:《我是中國娃》
- 重慶市萬州區(qū)2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)試卷+
- 冰雕雪雕工程投標(biāo)方案(技術(shù)標(biāo))
- 內(nèi)科質(zhì)控會議管理制度
- 魯奇加壓氣化爐的開、停車操作課件
- 美國怡口全屋水處置介紹
- 常用實驗室檢查血常規(guī)演示文稿
- 生命第一:員工安全意識手冊
評論
0/150
提交評論