第5章IO口應(yīng)用顯示與開關(guān)鍵盤輸入_第1頁
第5章IO口應(yīng)用顯示與開關(guān)鍵盤輸入_第2頁
第5章IO口應(yīng)用顯示與開關(guān)鍵盤輸入_第3頁
第5章IO口應(yīng)用顯示與開關(guān)鍵盤輸入_第4頁
第5章IO口應(yīng)用顯示與開關(guān)鍵盤輸入_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章

I/O口應(yīng)用-顯示與開關(guān)/鍵盤輸入1

內(nèi)容概要2單片機(jī)片內(nèi)的I/O口常見的顯示器件常見的輸入器件發(fā)光二極管LED數(shù)碼管LCD液晶屏開關(guān)鍵盤撥盤開關(guān)3發(fā)光二極管4LED數(shù)碼管5LCD液晶屏6常見的輸入器件

5.1單片機(jī)控制發(fā)光二極管顯示第2章介紹了單片機(jī)片內(nèi)4個(gè)I/O端口P0口~P3口的內(nèi)部電路以及外部引腳特性。如果P0口作為通用I/O使用,由于漏極開路,需要外接上拉電阻。而P1~P3口內(nèi)部已有30kΩ左右的上拉電阻。下面首先討論P(yáng)1~P3口如何與LED發(fā)光二極管連接。發(fā)光二極管常用來指示系統(tǒng)工作狀態(tài),制作節(jié)日彩燈、廣告牌匾等。大部分發(fā)光二極管工作電流1~5mA之間,其內(nèi)阻為20~100Ω。電流越大,亮度也越高。為保證發(fā)光二極管正常工作,同時(shí)減少功耗,限流電阻選擇十分重要,若供電電壓為+5V,則限流電阻可選1~3kΩ。5.1.1單片機(jī)與發(fā)光二極管的連接單片機(jī)通過并行端口P1~P3直接驅(qū)動(dòng)發(fā)光二極管,電路如圖5-1所示。P0口與P1、P2、P3口相比,P0口每位可驅(qū)動(dòng)8個(gè)LSTTL輸入,而P1~P3口每一位的驅(qū)動(dòng)能力,只有P0口的一半。當(dāng)P0口的某位為高電平時(shí),可提供400μA的拉電流(見圖5-1(a));當(dāng)P0口某位為低電平(0.45V)時(shí),可提供3.2mA的灌電流(見圖5-1(b)),而P1~P3口內(nèi)部有30kΩ左右的上拉電阻,如果高電平輸出,則從P1、P2和P3口輸出的拉電流Id僅為幾百μA,驅(qū)動(dòng)能力較弱,亮度較差,如圖5-1(a)所示。9圖5-1發(fā)光二極管與單片機(jī)并行口的連接如果端口引腳為低電平,能使灌電流Id從單片機(jī)的外部流入內(nèi)部,則將大大增加流過的灌電流值,如圖5-1(b)所示。所以,AT89S51單片機(jī)任何一個(gè)端口要想獲得較大的驅(qū)動(dòng)能力,要采用低電平輸出。如果一定要高電平驅(qū)動(dòng),可在單片機(jī)與發(fā)光二極管之間加驅(qū)動(dòng)電路,如74LS04、74LS244等。10115.1.2單片機(jī)I/O端口控制發(fā)光二極管的編程發(fā)光二極管與單片機(jī)的I/O端口的連接,如圖5-1(b)所示。如要點(diǎn)亮某發(fā)光二極管,只需該I/O端口位寫入“0”即可。下面通過一個(gè)例子介紹如何對(duì)I/O端口編程實(shí)現(xiàn)對(duì)發(fā)光二極管亮滅的控制。

【例5-1】制作一個(gè)單片機(jī)控制的流水燈,原理電路見圖5-2,8個(gè)發(fā)光二極管LED0~LED7經(jīng)限流電阻分別接至P1口的P1.0~P1.7引腳上,陽極共同接高電平。編寫程序,每次點(diǎn)亮一個(gè)發(fā)光二極管,控制發(fā)光二極管由上至下的反復(fù)循環(huán)流水點(diǎn)亮。說明:本例采用了Proteus環(huán)境下的虛擬仿真,7.5版本元件庫中沒有AT89S51單片機(jī),采用的是AT89C51來代替AT89S51,以下同。參考程序如下:

1213圖5-2單片機(jī)控制的流水燈 ORG0100HSTART:MOVR2,#8 MOVA,#0FEH;FEH為點(diǎn)亮P1.0腳發(fā)光二極管需寫入;P1口的控制碼LOOP:MOVP1,A;控制碼寫入P1口,點(diǎn)亮相應(yīng)的LED LCALL DELAY;調(diào)用延時(shí)子程序

RLA ;控制碼循環(huán)左移,點(diǎn)亮下一位

DJNZR2,LOOP;判斷左移是否超過8位,未超過繼續(xù)循環(huán)

LJMP START;左移循環(huán)已8次,再重新進(jìn)行下一次循環(huán)點(diǎn)亮1415DELAY:MOVR5,#20 ;延時(shí)子程序,延時(shí)約0.2sD1: MOV R6,#20D2: MOV R7,#248D3: DJNZ R7,D3;R7不為0則原地跳轉(zhuǎn)

DJNZ R6,D2 DJNZ R5,D1 RET END5.2開關(guān)狀態(tài)檢測(cè)檢測(cè)開關(guān)處于閉合狀態(tài)還是打開狀態(tài),只需把開關(guān)一端接到I/O端口的引腳上,另一端接地,然后通過檢測(cè)I/O端口引腳的電平來實(shí)現(xiàn)。

【例5-2】

如圖5-3所示,利用單片機(jī)、1個(gè)開關(guān)k和1個(gè)發(fā)光二極管LED,構(gòu)成一個(gè)簡(jiǎn)單的檢測(cè)開關(guān)k是否閉合的系統(tǒng)。圖5-3中,開關(guān)k的一端接到單片機(jī)P3.0引腳上,并通過上拉電阻接到+5V上,開關(guān)的另一端接地,當(dāng)開關(guān)打開時(shí),P3.0引腳為高電平,當(dāng)開關(guān)閉合時(shí),P3.0引腳為低電平。16圖5-3開關(guān)、LED發(fā)光二極管與P1口的連接單片機(jī)對(duì)開關(guān)狀態(tài)的檢測(cè)是由程序檢測(cè)P3.0引腳的輸入電平是高還是低。當(dāng)開關(guān)閉合,即P3.0腳為低電平;當(dāng)開關(guān)打開,P3.0引腳為高電平。P1.0引腳接發(fā)光二極管的陰極LED,當(dāng)開關(guān)k閉合時(shí),LED點(diǎn)亮;開關(guān)打開時(shí),LED熄滅。開關(guān)k與LED沒有任何電氣上的聯(lián)系。19參考程序如下:

ORG0100HSTART:JBP3.0,NOLIG;判P3.0高還是低,P3.0高;開關(guān)打開,跳NOLIG CLR P1.0;P3.0為低,開關(guān)閉合,則;P1.0輸出0,點(diǎn)亮LED SJMP STARTNOLIG:SETB P1.0;開關(guān)為打開狀態(tài),P1.0置1;LED熄滅

SJMP START;返回

END5.3單片機(jī)控制LED數(shù)碼管的顯示5.3.1LED數(shù)碼管顯示原理LED數(shù)碼管是常見的顯示器件。LED數(shù)碼管為“8”字型的,共計(jì)8段(包括小數(shù)點(diǎn)段在內(nèi))或7段(不包括小數(shù)點(diǎn)段),每一段對(duì)應(yīng)一個(gè)發(fā)光二極管,有共陽極和共陰極兩種,如圖5-4所示。共陽極數(shù)碼管的陽極連接在一起,公共陽極接到+5V上;共陰極數(shù)碼管的陰極連接在一起,通常此公共陰極接地。對(duì)于共陰極數(shù)碼管,當(dāng)某個(gè)發(fā)光二極管的陽極為高電平時(shí),發(fā)光二極管點(diǎn)亮,相應(yīng)的段被顯示。同樣,共陽極數(shù)碼管的陽極連接在一起接+5V,當(dāng)某個(gè)發(fā)光二極管的陰極接低電平時(shí),該發(fā)光二極管被點(diǎn)亮,相應(yīng)的段被顯示。2021圖5-48段LED數(shù)碼管結(jié)構(gòu)及外形為了使LED數(shù)碼管顯示不同的字符,要把某些段點(diǎn)亮,就要為數(shù)碼管的各段提供一個(gè)字節(jié)的二進(jìn)制代碼,即段碼。習(xí)慣上以“a”段對(duì)應(yīng)字型碼字節(jié)的最低位。各種字符的段碼如表5-1所示。如要在數(shù)碼管上顯示某一字符,只需將該字符的段碼加到各段上即可。

2223例如某存儲(chǔ)單元中的數(shù)為“02H”,想在共陽極數(shù)碼管上顯示“2”,需要把“2”的段碼“A4H”加到數(shù)碼管各段。通常采用的方法是將欲顯示的字符的段碼作成一個(gè)表,根據(jù)顯示的字符從表中查找到相應(yīng)的段碼,然后單片機(jī)把該段碼輸出到數(shù)碼管的各個(gè)段上,同時(shí)數(shù)碼管的公共端接+5V,此時(shí)在數(shù)碼管上顯示出字符“2”。

24【例5-3】用單片機(jī)控制一個(gè)8段LED數(shù)碼管,如圖5-5所示。要求數(shù)碼管反復(fù)循環(huán)顯示單個(gè)數(shù)字:0~9。圖5-5控制數(shù)碼管循環(huán)顯示單個(gè)數(shù)字圖5-5中,采用了共陽極數(shù)碼管,R1~R7為限流電阻。單片機(jī)P0口輸出段碼,數(shù)碼管的公共段接+5v。欲顯示的數(shù)字0~9的字型碼由于無規(guī)律可循,只能采用查表的方式來完成要求,這樣可按著數(shù)字0~9的順序,把每個(gè)數(shù)字的字型碼按順序排好,形成一個(gè)段碼表。根據(jù)要顯示的數(shù)字,查找到相應(yīng)的段碼,從而控制LED數(shù)碼管顯示相應(yīng)的字符。讀者通過本例應(yīng)掌握段碼查表程序的編寫。

26參考程序如下:ORG 0100HSTART:MOV DPTR,#TABLE

;指針指向表頭地址S1:MOVA,#00H ;設(shè)置地址偏移量

MOVCA,@A+DPTR

;查表取得段碼,送A CJNEA,#01H,S2;判斷A中段碼是否為結(jié)束符01H,不是則跳S2繼續(xù)顯示LJMP START ;是結(jié)束符01H,重新從;開始顯示S2: MOV P0,A ;段碼送LED顯示

LCALL DELAY

INC DPTR

;指針加1 LJMP S1DELAY:MOV R5,#20 ;延時(shí)子程序D2: MOV R6,#20D1: MOV R7,#248D3: DJNZ R7,D3 DJNZ R6,D1 DJNZ R5,D2 RET 28TABLE:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;共陽極數(shù)碼管段碼表DB 01H;結(jié)束符

END程序設(shè)計(jì)中,為達(dá)到反復(fù)循環(huán)顯示數(shù)字0~9的目的,在段碼表中設(shè)置了一個(gè)結(jié)束符01H,來控制反復(fù)循環(huán)顯示。295.3.2LED數(shù)碼管的顯示方式1.靜態(tài)顯示方式靜態(tài)顯示就是指無論多少位LED數(shù)碼管,都同時(shí)處于顯示狀態(tài)。多位LED數(shù)碼管工作于靜態(tài)顯示方式時(shí),各位的共陰極(或共陽極)連接在一起并接地(或接+5V);每位數(shù)碼管的段碼線(a~dp)分別與一個(gè)單片機(jī)控制的8位I/O口鎖存器輸出相連。如果送往各個(gè)LED數(shù)碼管所顯示字符的段碼一經(jīng)確定,則相應(yīng)I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入下一個(gè)顯示字符的段碼。因此,靜態(tài)顯示方式的顯示無閃爍,亮度較高,軟件控制比較容易。3031圖5-6所示為4位LED數(shù)碼管靜態(tài)顯示電路,各個(gè)數(shù)碼管可獨(dú)立顯示,只要向控制各位I/O口鎖存器寫入相應(yīng)的顯示段碼,該位就能保持相應(yīng)的顯示字符。這樣在同一時(shí)間,每一位顯示的字符可以各不相同。但是,靜態(tài)顯示方式占用I/O口線較多。對(duì)于圖5-6所示電路,要占用4個(gè)8位I/O口(或鎖存器)。如果數(shù)碼管數(shù)目增多,則還需要增加I/O口的數(shù)目。在實(shí)際的系統(tǒng)設(shè)計(jì)中,如果顯示位數(shù)較少,可采用靜態(tài)顯示方式。但顯示位數(shù)較多時(shí),為了降低成本,一般采用動(dòng)態(tài)顯示方式。圖5-64位LED靜態(tài)顯示的示意圖2.動(dòng)態(tài)掃描顯示方式顯示位數(shù)較多時(shí),靜態(tài)顯示所占用的I/O口多,為節(jié)省I/O口與驅(qū)動(dòng)電路的數(shù)目,常采用動(dòng)態(tài)掃描顯示方式。將所有LED數(shù)碼管顯示器的段碼線的相應(yīng)段并聯(lián)在一起,由一個(gè)8位I/O端口控制,而各顯示位的公共端分別由另一單獨(dú)的I/O端口線控制。34圖5-7所示為一個(gè)4位8段LED數(shù)碼管動(dòng)態(tài)掃描顯示電路的示意圖。其中單片機(jī)向I/O(1)端口發(fā)出欲顯示字符的段碼,而顯示器的位點(diǎn)亮控制使用I/O(2)端口中的4位口線,來控制數(shù)碼管公共端的電平,每一時(shí)刻,只有1位位選線有效,即選中某一位顯示,其他各位位選線都無效,不顯示。每隔一定時(shí)間逐位地輪流點(diǎn)亮各數(shù)碼管(掃描),由于數(shù)碼管的余輝和人眼的“視覺暫留”作用,只要控制好每位數(shù)碼管點(diǎn)亮顯示的時(shí)間和間隔,則可造成“多位同時(shí)亮”的假象,達(dá)到4位同時(shí)顯示的效果。圖5-74位LED數(shù)碼管動(dòng)態(tài)顯示示意圖各位數(shù)碼管輪流點(diǎn)亮的時(shí)間間隔(掃描間隔)應(yīng)根據(jù)實(shí)際情況而定。發(fā)光二極管從導(dǎo)通到發(fā)光有一定的延時(shí),如果點(diǎn)亮?xí)r間太短,發(fā)光太弱,人眼無法看清;時(shí)間太長,產(chǎn)生閃爍現(xiàn)象,而且此時(shí)間越長,占用單片機(jī)時(shí)間也越多。另外,顯示位數(shù)增多,也將占用單片機(jī)的大量時(shí)間,因此動(dòng)態(tài)顯示的實(shí)質(zhì)是以執(zhí)行程序的時(shí)間來換取I/O端口數(shù)目的減少。為克服動(dòng)態(tài)顯示的弊病,可采用5.6.4小節(jié)介紹的專用的鍵盤/顯示器芯片,由芯片內(nèi)部硬件掃描電路自動(dòng)完成顯示數(shù)據(jù)的掃描刷新。

365.3.3LED數(shù)碼管靜態(tài)顯示設(shè)計(jì)【例5-4】用AT89S51設(shè)計(jì)一個(gè)2位LED數(shù)碼管顯示的“秒表”,顯示時(shí)間為00~99秒,每秒自動(dòng)加1。原理電路如圖5-8所示。電路采用單片機(jī)的P2口、P3口分別控制兩個(gè)LED數(shù)碼管作為“秒表”的時(shí)間顯示。顯示數(shù)字的段碼采用查表方法。“秒”計(jì)時(shí)產(chǎn)生采用軟件延時(shí)的方法。由本例可見,采用靜態(tài)顯示,需要一個(gè)數(shù)碼管對(duì)應(yīng)一個(gè)I/O端口。當(dāng)數(shù)碼管的數(shù)目較多時(shí),需要占用較多的I/O端口。但是軟件編程比較簡(jiǎn)單,只需向P2口、P3口輸出顯示數(shù)字的段碼即可,且顯示不閃爍。38圖5-82位LED數(shù)碼管靜態(tài)顯示的秒表3940425.3.4LED數(shù)碼管動(dòng)態(tài)顯示設(shè)計(jì)下面介紹單片機(jī)控制數(shù)碼管動(dòng)態(tài)顯示的案例?!纠?-5】圖5-9所示的動(dòng)態(tài)掃描顯示電路,由單片機(jī)控制8只共陽極數(shù)碼管,同時(shí)在數(shù)碼管上同時(shí)顯示8個(gè)數(shù)字1~8。電路中P0口輸出顯示字符的段碼,P2口輸出點(diǎn)亮某位的位選碼。由于8位數(shù)碼管的各段是并聯(lián)的,P0端口一次只能送出一個(gè)顯示段碼,即一次只能點(diǎn)亮1位數(shù)碼管。單片機(jī)先控制左邊第1個(gè)數(shù)碼管顯示1,經(jīng)過延時(shí)后,再控制左邊第2個(gè)數(shù)碼管顯示2,……,直至第8個(gè)數(shù)碼管顯示8,反復(fù)循環(huán)上述過程。圖5-9數(shù)碼管采用動(dòng)態(tài)顯示方式同時(shí)顯示數(shù)字1~8單片機(jī)對(duì)8個(gè)數(shù)碼管進(jìn)行快速位選掃描,只要位選掃描速度選擇適當(dāng),雖然是每次只點(diǎn)亮一位數(shù)碼管,但由于數(shù)碼管的余輝和人眼的“視覺暫留”作用,只要控制好每位數(shù)碼管顯示的時(shí)間和間隔,則可造成“多位同時(shí)亮”的假象,達(dá)到8位數(shù)碼管同時(shí)顯示字符的效果。44455.4單片機(jī)控制LED點(diǎn)陣顯示器顯示LED點(diǎn)陣顯示器應(yīng)用非常廣泛,在許多公共場(chǎng)合,如商場(chǎng)、銀行、車站、機(jī)場(chǎng)、醫(yī)院隨處可見。不僅能顯示文字、圖形,還能播放動(dòng)畫、圖像、視頻等信號(hào)。LED點(diǎn)陣顯示器分為圖文顯示器和視頻顯示器,有單色顯示,還有彩色顯示。下面僅介紹單片機(jī)如何來控制單色LED點(diǎn)陣顯示器的顯示。5.4.1LED點(diǎn)陣顯示器結(jié)構(gòu)與顯示原理由若干個(gè)發(fā)光二極管按矩陣方式排列而成。陣列點(diǎn)數(shù)可分為5×7、5×8、6×8、8×8點(diǎn)陣;按發(fā)光顏色可分為單色、雙色、三色;按極性排列可分為共陰極和共陽極。471.LED點(diǎn)陣結(jié)構(gòu)以8×8LED點(diǎn)陣顯示器為例,外形見圖5-10,內(nèi)部結(jié)構(gòu)見圖5-11,由64個(gè)發(fā)光二極管組成,且每個(gè)發(fā)光二極管是處于行線(R0~R7)和列線(C0~C7)之間交叉點(diǎn)上.2.LED點(diǎn)陣顯示原理

LED點(diǎn)陣顯示器顯示的一個(gè)字符是由點(diǎn)陣中被點(diǎn)亮的LED所構(gòu)成。下面以發(fā)光二極管陽極接行線,陰極接列線的點(diǎn)陣顯示器,即圖5-11的結(jié)構(gòu)來說明??梢钥闯?,點(diǎn)亮點(diǎn)陣中的一個(gè)發(fā)光二極管的條件是:所在行為高電平,所在列為低電平。當(dāng)然,行與列也是相對(duì)的,如把圖5-11中的行列互換,則點(diǎn)亮點(diǎn)陣中的一個(gè)發(fā)光二極管的條件是:對(duì)應(yīng)的行為低電平,對(duì)應(yīng)的列為高電平。

圖5-108×8LED點(diǎn)陣顯示器外形圖5-118×8LED點(diǎn)陣顯示器(共陰極)的結(jié)構(gòu)如果在很短時(shí)間內(nèi)依次點(diǎn)亮很多個(gè)發(fā)光二極管,LED點(diǎn)陣就可以顯示一個(gè)穩(wěn)定的字符、數(shù)字或其他圖形。因此控制LED點(diǎn)陣顯示,實(shí)質(zhì)上就是控制加到行線和列線上的電平編碼來控制點(diǎn)亮某些發(fā)光二極管(點(diǎn)),從而顯示出由不同發(fā)光的點(diǎn)組成的各種字符。

8×8LED點(diǎn)陣顯示模塊中的每個(gè)發(fā)光二極管均放置在行線和列線的交叉點(diǎn)上,當(dāng)對(duì)應(yīng)的某一行置1電平,某一列為0電平時(shí),該發(fā)光二極管被點(diǎn)亮。下面以8×8LED點(diǎn)陣顯示器顯示字符“7”為例,見圖5-12。圖5-128×8LED點(diǎn)陣顯示器顯示字符“7”顯示過程如下:先給8×8LED點(diǎn)陣的第1行送高電平(行線高電平有效),同時(shí)給所有列線送高電平(列線低電平有效),從而第1行發(fā)光二極管全滅;

延時(shí)一段時(shí)間,再給第2行送高電平,同時(shí)給所有列線送“11000001”,列線為0的發(fā)光二極管點(diǎn)亮,從而點(diǎn)亮5個(gè)發(fā)光二極管,顯示出字符“7”的第一橫;

延時(shí)一段時(shí)間后,再給第3行送高電平,同時(shí)加到列線的編碼為“11111101”,點(diǎn)亮1個(gè)發(fā)光二極管;……;

延時(shí)一段時(shí)間后,再給第8行送高電平,同時(shí)給列線送“11111011”,顯示出字符“7”的最下面的一行,點(diǎn)亮1個(gè)發(fā)光二極管。然后再重新循環(huán)上述操作,利用人眼的視覺暫留效應(yīng),一個(gè)穩(wěn)定的字符“7”就顯示出來,如圖5-12所示。

16×16LED點(diǎn)陣顯示器的結(jié)構(gòu)與8×8LED點(diǎn)陣顯示模塊內(nèi)部結(jié)構(gòu)及顯示原理是類似的,只不過行和列均為16。16×16LED點(diǎn)陣顯示器是由4個(gè)8×8LED點(diǎn)陣顯示器組成,且每個(gè)發(fā)光二極管也是放置在行線和列線的交叉點(diǎn)上,當(dāng)對(duì)應(yīng)的某一列置0電平,某一行置1電平時(shí),該發(fā)光二極管點(diǎn)亮。下面以16×16LED點(diǎn)陣顯示器顯示字符“子”為例,見圖5-13。圖5-1316×16LED點(diǎn)陣顯示器顯示字符“子”顯示過程如下:先給LED點(diǎn)陣的第1行送高電平(行線高電平有效),同時(shí)給所有列線送高電平(列線低電平有效),從而第1行發(fā)光二極管全滅;延時(shí)一段時(shí)間后,再給第2行送高電平,同時(shí)給所有列線送“1100000000001111”,列線為0的發(fā)光二極管點(diǎn)亮,從而點(diǎn)亮10個(gè)發(fā)光二極管,顯示出漢字“子”的第一橫;延時(shí)一段時(shí)間后,再給第3行送高電平,同時(shí)加到列線的編碼為“1111111111011111”,點(diǎn)亮1個(gè)發(fā)光二極管……;

延時(shí)一段時(shí)間后,再給第16行送高電平,同時(shí)給列線送“1111110111111111”,顯示出漢字“子”的最下面的一行,點(diǎn)亮1個(gè)發(fā)光二極管。然后再重新循環(huán)上述操作,利用人眼視覺暫留效應(yīng),一個(gè)穩(wěn)定字符“子”顯示出來,見圖5-13。5.4.2控制16×16LED點(diǎn)陣顯示屏的案例單片機(jī)控制16×16點(diǎn)陣顯示屏顯示字符案例?!纠?-8】如圖5-14,利用單片機(jī)及74LS154(4-16譯碼器)、74LS07、16×16LED點(diǎn)陣顯示屏來實(shí)現(xiàn)字符顯示,編寫程序,循環(huán)顯示字符“電子技術(shù)”。圖5-14控制16×16LED點(diǎn)陣顯示器(共陰極)顯示字符

圖中16×16LED點(diǎn)陣顯示屏16行行線R0~R15電平,由P1口低4位經(jīng)4-16譯碼器74HC154的16條譯碼輸出線L0~L15經(jīng)驅(qū)動(dòng)后的輸出來控制。16列列線C0~C15的電平由P0口和P2口控制。剩下問題是如何確定顯示字符的點(diǎn)陣編碼,以及控制好每一屏逐行顯示的掃描速度(刷新頻率)。

66掃描顯示時(shí),單片機(jī)通過P1口低4位經(jīng)4-16譯碼器74HC154的16條譯碼輸出線L0~L15經(jīng)驅(qū)動(dòng)后的輸出來控制,逐行為高電平,來進(jìn)行掃描。由P0口與P2口控制列碼C0~C15的輸出,從而顯示出某行應(yīng)當(dāng)點(diǎn)亮的發(fā)光二極管。下面以顯示漢字“子”為例,說明其顯示過程。由程序可看出,漢字“子”的前3行發(fā)光二級(jí)管的列碼為“FFH,FFH,03H,F0H,FFH,FBH,……”,第一行的列碼為“FFH,FFH”,由P0口與P2口輸出,沒有點(diǎn)亮的發(fā)光二極管。第二行的列碼為“03H,F0H”,通過P0口與P2口輸出后,由圖5-14的電路可看出,H03加到列線C7~C0的二進(jìn)制編碼為“00000011”,這里要注意加到8個(gè)發(fā)光二極管上的對(duì)應(yīng)位置。按照?qǐng)D5-13和圖5-14的連線關(guān)系,加到從左到右發(fā)光二極管應(yīng)為C0~C7的二進(jìn)制編碼為“11000000”,

即最左邊的2個(gè)發(fā)光二極管不亮,其余的6個(gè)發(fā)光二極管點(diǎn)亮。同理,P2口輸出的HF0加到列線C15~C8的二進(jìn)制編碼為“11110000”,即加到C8~C15的二進(jìn)制編碼為“00001111”,所以第二行的最右邊的4個(gè)發(fā)光二極管不亮,如圖5-13所示。對(duì)應(yīng)通過P0口與P2口輸出加到第3行16個(gè)發(fā)光二極管的列碼為“FFH,FBH,”,對(duì)應(yīng)于從左到右的C0~C15的二進(jìn)制編碼為“1111111110111111”,從而第3行左邊數(shù)第11個(gè)發(fā)光二極管被點(diǎn)亮,其余均熄滅,如圖5-14所示。其余各行點(diǎn)亮的發(fā)光二極管,也是由16×16點(diǎn)陣的列碼來決定的。

5.5單片機(jī)控制液晶顯示模塊1602LCD的顯示液晶顯示器(LiquidCrystalDisplay,LCD)具有省電、體積小、抗干擾能力強(qiáng)等優(yōu)點(diǎn),LCD顯示器分為字段型、字符型和點(diǎn)陣圖形型。(1)字段型。以長條狀組成字符顯示,主要用于數(shù)字顯示,也可用于顯示西文字母或某些字符,廣泛用于電子表、計(jì)算器、數(shù)字儀表中。(2)字符型。專門用于顯示字母、數(shù)字、符號(hào)等。一個(gè)字符由57或510的點(diǎn)陣組成,在單片機(jī)系統(tǒng)中已廣泛使用。(3)點(diǎn)陣圖形型。廣泛用于圖形顯示,如筆記本電腦彩色電視和游戲機(jī)等。它是在平板上排列的多行列的矩陣式的晶格點(diǎn),點(diǎn)大小與多少?zèng)Q定了顯示的清晰度。5.5.1LCD1602液晶顯示模塊簡(jiǎn)介最常見的字符型液晶顯示模塊。單片機(jī)系統(tǒng)中常用。由于LCD顯示面板較為脆弱,廠商已將LCD控制器、驅(qū)動(dòng)器、RAM、ROM和液晶顯示器用PCB連接到一起,稱為液晶顯示模塊(LCdModule,LCM),用戶只需購買現(xiàn)成的液晶顯示模塊即可。單片機(jī)只需向LCD顯示模塊寫入相應(yīng)命令和數(shù)據(jù)就可顯示需要的內(nèi)容。1.字符型液晶顯示模塊LCD1602特性與引腳字符型LCD模塊常用的有16字×1行、16字×2行、20字×2行、20字×4行等模塊,型號(hào)常用×××1602、×××1604、×××2002、×××2004來表示,其中×××為商標(biāo)名稱,16代表液晶顯示器每行可顯示16個(gè)字符,02表示顯示2行。LCD1602內(nèi)部具有字符庫ROM(CGROM),能顯示出192個(gè)字符(5×7點(diǎn)陣),如圖5-15所示。圖5-15ROM字符庫的內(nèi)容由字符庫可看出顯示器顯示的數(shù)字和字母部分代碼,恰是ASCII碼表中編碼。單片機(jī)控制LCD1602顯示字符,只需將待顯示字符的ASCII碼寫入內(nèi)部的顯示數(shù)據(jù)RAM(DDRAM),用內(nèi)部控制電路就可將字符在顯示器上顯示出來。例如,顯示字符“A”,單片機(jī)只需將字符“A”的ASCII碼41H寫入DDRAM,控制電路就會(huì)將對(duì)應(yīng)的字符庫ROM(CGROM)中的字符“A”的點(diǎn)陣數(shù)據(jù)找出來顯示在LCD上。模塊內(nèi)有80字節(jié)數(shù)據(jù)顯示RAM(DDRAM),除顯示192個(gè)字符(57點(diǎn)陣)的字符庫ROM(CGROM)外,還有64字節(jié)的自定義字符RAM(CGRAM),用戶可自行定義8個(gè)5×7點(diǎn)陣字符。LCD1602工作電壓4.5~5.5V,典型5V,工作電流2mA。標(biāo)準(zhǔn)的14引腳(無背光)或16個(gè)引腳(有背光)的外形及引腳分布如圖5-16所示。

(a)LCD1602的外形(b)LCD1602的引腳圖5-16LCD1602外形及引腳引腳包括8條數(shù)據(jù)線、3條控制線和3條電源線,見表5-2。通過單片機(jī)向模塊寫入命令和數(shù)據(jù),就可對(duì)顯示方式和顯示內(nèi)容做出選擇。2.LCD1602字符的顯示及命令字顯示字符首先要解決待顯示字符的ASCII碼產(chǎn)生。用戶只需在C51程序中寫入欲顯示的字符常量或字符串常量,C51程序在編譯后會(huì)自動(dòng)生成其標(biāo)準(zhǔn)的ASCII碼,然后將生成的ASCII碼送入顯示用數(shù)據(jù)存儲(chǔ)器DDRAM,內(nèi)部控制電路就會(huì)自動(dòng)將該ASCII碼對(duì)應(yīng)的字符在LCD1602顯示出來。讓液晶顯示器顯示字符,首先對(duì)其進(jìn)行初始化設(shè)置還必須對(duì)有、無光標(biāo)、光標(biāo)移動(dòng)方向、光標(biāo)是否閃爍及字符移動(dòng)方向等進(jìn)行設(shè)置,才能獲得所需顯示效果。對(duì)LCD1602的初始化、讀、寫、光標(biāo)設(shè)置、顯示數(shù)據(jù)的指針設(shè)置等,都是單片機(jī)向LCD1602寫入命令字來實(shí)現(xiàn)。命令字見表5-3。

表5-3中11個(gè)命令功能說明如下:命令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è)字符后地址指針減1。S—屏幕上所有字符移動(dòng)方向是否有效的控制位。S=1,當(dāng)寫入一字符時(shí),整屏顯示左移(I/D=1)或右移(I/D=0);S=0,整屏顯示不移動(dòng)。命令4:顯示開/關(guān)及光標(biāo)設(shè)置。D—屏幕整體顯示控制位,D=0關(guān)顯示,D=1開顯示。C—光標(biāo)有無控制位,C=0無光標(biāo),C=1有光標(biāo)。B—光標(biāo)閃爍控制位,B=0不閃爍,B=1閃爍。命令5:光標(biāo)或字符移位。S/C—光標(biāo)或字符移位選擇控制位。S/C=1移動(dòng)顯示的字符,S/C=0移動(dòng)光標(biāo)。R/L—移位方向選擇控制位。0:左移,1:右移。命令6:功能設(shè)置命令。DL—傳輸數(shù)據(jù)的有效長度選擇控制位。1:8位數(shù)據(jù)線接口;0:4位數(shù)據(jù)線接口。N—顯示器行數(shù)選擇控制位。0:?jiǎn)涡酗@示,1:兩行顯示。F—字符顯示的點(diǎn)陣控制位。0:顯示5×7點(diǎn)陣字符,1:顯示5×10點(diǎn)陣字符。命令7:CGRAM地址設(shè)置。命令8:DDRAM地址設(shè)置。LCD內(nèi)部有一個(gè)數(shù)據(jù)地址指針,用戶可通過它訪問內(nèi)部全部80字節(jié)的數(shù)據(jù)顯示RAM。命令格式為:80H+地址碼。其中,80H為命令碼。命令9:讀忙標(biāo)志或地址。BF—忙標(biāo)志。BF=1,表示LCD忙,此時(shí)LCD不能接受命令或數(shù)據(jù);BF=0,表示LCD不忙。命令10:寫數(shù)據(jù)。命令11:讀數(shù)據(jù)。例如,將顯示模式設(shè)置為“16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口”,只需要向1602寫入光標(biāo)和顯示模式設(shè)置命令(命令6)“00111000B”,即38H即可。再如,要求液晶顯示器開顯示,顯示光標(biāo)且光標(biāo)閃爍,那么根據(jù)顯示開關(guān)及光標(biāo)設(shè)置命令(命令4),只要令D=1,C=1和B=1,也就是寫入命令“00001111B”,即0FH,就可實(shí)現(xiàn)所需的顯示模式。3.字符顯示位置的確定LCD1602內(nèi)部有80字節(jié)DDRAM,與顯示屏上字符顯示位置一一對(duì)應(yīng),圖5-17給出LCD1602顯示RAM地址與字符顯示位置的對(duì)應(yīng)關(guān)系。

圖5-17LCD內(nèi)部顯示RAM的地址映射圖當(dāng)向DDRAM的00H~0FH(第1行)、40H~4FH(第2行)地址的任一處寫數(shù)據(jù)時(shí),LCD立即顯示出來,該區(qū)域也稱為可顯示區(qū)域。而當(dāng)寫入10H~27H或50H~67H地址處時(shí),字符不會(huì)顯示出來,該區(qū)域也稱為隱藏區(qū)域。如果要顯示寫入到隱藏區(qū)域的字符,需要通過字符移位命令(命令5)將它們移入到可顯示區(qū)域方可正常顯示。需說明的是,在向DDRAM寫入字符時(shí),首先要設(shè)置DDRAM定位數(shù)據(jù)指針,此操作可通過命令8完成。例如,要寫字符到DDRAM的40H處,則命令8的格式為:80H+40H=C0H,其中80H為命令代碼,40H是要寫入字符處的地址。4.LCD1602的復(fù)位LCD1602上電后復(fù)位狀態(tài)為:清除屏幕顯示設(shè)置為8位數(shù)據(jù)長度,單行顯示,5×7點(diǎn)陣字符。顯示屏、光標(biāo)、閃爍功能均關(guān)閉。輸入方式為整屏顯示不移動(dòng),I/D=1。LCD1602的一般初始化設(shè)置為:寫入命令01H(命令1),顯示清屏,數(shù)據(jù)指針清0。寫入命令38H(命令6),顯示模式設(shè)置(16×2顯示5×7點(diǎn)陣,8位數(shù)據(jù)接口)。寫入命令0CH(命令4),設(shè)置開顯示,不顯示光標(biāo)。寫入命令06H(命令3),寫一個(gè)字符后地址指針加1寫入命令08H,顯示關(guān)閉。在進(jìn)行上述設(shè)置及對(duì)數(shù)據(jù)進(jìn)行讀取時(shí),通常需要檢測(cè)忙標(biāo)志位BF,如果為1,則說明忙,要等待;如果BF為0則可進(jìn)行下一步操作。

LCD1602的讀寫操作規(guī)定見表5-4。LCD1602與AT89S51的接口電路見圖5-18。圖5-18單片機(jī)與LCD1602接口電路由圖5-18可看出,單片機(jī)的P3.0、P3.1和P3.2引腳分別與LCD1602的RS、R/和E這3個(gè)引腳連接,只需通過指令對(duì)這3個(gè)引腳置“1”或清“0”,就可實(shí)現(xiàn)對(duì)LCD1602的讀寫操作控制。單片機(jī)的P2口與LCD1602的D0~D7相連,進(jìn)行命令或數(shù)據(jù)的傳送。具體來說,顯示一個(gè)字符的操作過程為“讀忙標(biāo)志位BF→寫命令→寫顯示字符→自動(dòng)顯示”。895.5.2單片機(jī)控制字符型LCD1602的顯示案例下面通過一個(gè)具體案例介紹單片機(jī)如何控制LCD1602顯示字符?!纠?-7】用AT89C51單片機(jī)控制LCD1602,使其顯示兩行文字:“Welcomto”與“HarbinInstitute”,Proteus的虛擬仿真原理電路如圖5-19所示。在Proteus中,LCD1602液晶顯示器的對(duì)應(yīng)仿真模型為LM016L(相當(dāng)于14腳的LCD1602,即表5-2中的1~14腳)。LM016L的符號(hào)與引腳如圖5-20所示,與14引腳LCD1602液晶顯示器的引腳信號(hào)相同,引腳功能說明見表5-2。

圖5-19單片機(jī)與字符型LCD接口電路與仿真92圖5-20字符型液晶顯示器LCD引腳939596程序說明:(1)程序中調(diào)用了3個(gè)子程序,即檢測(cè)LCD1602“忙”標(biāo)志、向LCD1602寫入命令、向LCD1602寫入數(shù)據(jù),3個(gè)子程序中包括了相應(yīng)的控制信號(hào)產(chǎn)生,使用時(shí)只需調(diào)用即可。(2)顯示兩行字符時(shí),分別使用了相應(yīng)的顯示位置的設(shè)置命令(命令8)。第一行的顯示位置從03H開始;第二行的顯示位置從40H開始。(3)使用了R0寄存器來控制兩行分別顯示字符的個(gè)數(shù)

975.6鍵盤接口設(shè)計(jì)

鍵盤——向單片機(jī)輸入數(shù)據(jù)、命令等功能,是人機(jī)對(duì)話的主要手段。由若干按鍵按照一定規(guī)則組成。每一個(gè)按鍵實(shí)質(zhì)上是一個(gè)按鍵開關(guān),按構(gòu)造可分為有觸點(diǎn)開關(guān)按鍵和無觸點(diǎn)按鍵。

有觸點(diǎn)開關(guān)按鍵常見的有:觸摸式鍵盤、薄膜鍵盤、導(dǎo)電橡膠、按鍵式鍵盤等,最常用按鍵式鍵盤。

無觸點(diǎn)開關(guān)按鍵有電容式按鍵、光電式按鍵、磁感應(yīng)按鍵等。下面介紹按鍵式開關(guān)鍵盤工作原理、方式以及與鍵盤接口設(shè)計(jì)與軟件編程。985.6.1鍵盤接口設(shè)計(jì)應(yīng)解決的問題1.鍵盤的任務(wù)任務(wù)3項(xiàng)。(1)判別是否有鍵按下?若有,進(jìn)入第(2)步。(2)識(shí)別哪一個(gè)鍵被按下,并求出相應(yīng)的鍵值。(3)根據(jù)鍵值,找到相應(yīng)鍵值處理程序入口。2.鍵盤輸入特點(diǎn)鍵盤一個(gè)按鍵實(shí)質(zhì)就是一個(gè)按鈕開關(guān)。圖5-21(a)所示按鍵開關(guān)的兩端分別連接在行線和列線上,列線接地,行線通過電阻接到+5V上。鍵盤開關(guān)機(jī)械觸點(diǎn)的斷開、閉合,其行線電壓輸出波形如圖5-21(b)所示。圖5-21(b)所示的t1和t3分別為鍵的閉合和斷開過程中的抖動(dòng)期(呈現(xiàn)一串負(fù)脈沖),抖動(dòng)時(shí)間長短與開關(guān)機(jī)械特性有關(guān),一般為5~10ms,t2為穩(wěn)定的閉合期,其時(shí)間由按鍵動(dòng)作確定,一般為十分之幾秒到幾秒,t0、t4為斷開期。100101圖5-21鍵盤開關(guān)及其行線波形3.按鍵的識(shí)別按鍵閉合與否,反應(yīng)在行線輸出電壓上就是高電平或低電平,對(duì)行線電平高低狀態(tài)檢測(cè),便可確認(rèn)按鍵是否按下與松開。為了確保單片機(jī)對(duì)一次按鍵動(dòng)作只確認(rèn)一次按鍵有效,必須消除抖動(dòng)期t1和t3的影響。4.如何消除按鍵的抖動(dòng)兩種去抖動(dòng)方法。一種是用軟件延時(shí)來消除按鍵抖動(dòng)基本思想:在檢測(cè)到有鍵按下時(shí),該鍵所對(duì)應(yīng)的行線為低電平,執(zhí)行一段延時(shí)10ms的子程序后,確認(rèn)該行線電平是否仍為低電平,如果仍為低電平,則確認(rèn)該行確實(shí)有鍵按下。當(dāng)按鍵松開時(shí),行線的低電平變?yōu)楦唠娖?,?zhí)行一段延時(shí)10ms的子程序后,檢測(cè)該行線為高電平,說明按鍵確實(shí)已經(jīng)松開。

102采取以上措施,可消除兩個(gè)抖動(dòng)期t1和t3的影響。另一種去除按鍵抖動(dòng)的方法是采用專用的鍵盤/顯示器接口芯片,這類芯片中都有自動(dòng)去抖動(dòng)的硬件電路。常見的鍵盤有:獨(dú)立式鍵盤和矩陣式鍵盤兩種結(jié)構(gòu)。1035.6.2獨(dú)立式鍵盤的設(shè)計(jì)獨(dú)立式鍵盤特點(diǎn)各鍵相互獨(dú)立,每個(gè)按鍵各接一條I/O口線,通過檢測(cè)I/O輸入線的電平狀態(tài),易判斷哪個(gè)按鍵被按下。圖5-22為一獨(dú)立式鍵盤,8個(gè)按鍵k1~k8分別接到單片機(jī)的P1.0~P1.7引腳上,圖中上拉電阻保證按鍵未按下時(shí),保證對(duì)應(yīng)I/O口線為穩(wěn)定高電平。當(dāng)某一按鍵按下時(shí),對(duì)應(yīng)I/O口線就變成低電平,與其他按鍵相連的I/O口線仍為高電平。因此,只需讀入I/O口線狀態(tài),判別是否為低電平,就很容易識(shí)別出哪個(gè)鍵被按下??梢姫?dú)立式鍵盤優(yōu)點(diǎn)是電路簡(jiǎn)單,各條檢測(cè)線獨(dú)立,識(shí)別按鍵號(hào)的軟件編寫簡(jiǎn)單。如按鍵數(shù)目較多,要占用較多I/O口線。因此獨(dú)立式鍵盤適于按鍵數(shù)目較少場(chǎng)合。

104圖5-22獨(dú)立式鍵盤的接口電路1.獨(dú)立式鍵盤的查詢工作方式【例5-10】對(duì)圖5-23所示獨(dú)立式鍵盤,用查詢方式實(shí)現(xiàn)鍵盤掃描根據(jù)按下不同按鍵,對(duì)其進(jìn)行處理。獨(dú)立式鍵盤查詢方式的參考程序如下: 106108對(duì)應(yīng)8個(gè)按鍵的鍵處理子程序Pkey0~Pkey7,要根據(jù)按鍵功能的具體要求來編寫。但是需要注意的是,進(jìn)入鍵處理子程序后,應(yīng)先判斷按下的按鍵是否松開,確認(rèn)松開后,再進(jìn)行按鍵功能的處理。所以指令“JNBP1.x,Pkeyx”(x=0~7)用來判斷按鍵是否松開。2.獨(dú)立式鍵盤的中斷掃描方式上面介紹的獨(dú)立式鍵盤的查詢方式,即使鍵盤無按鍵按下,也要查詢。為提高鍵盤掃描的工作效率,可采用中斷掃描方式,即只有在按鍵按下時(shí),才進(jìn)行掃描查詢與處理,因此中斷掃描方式的鍵盤實(shí)時(shí)性強(qiáng),工作效率高。

【例5-9】設(shè)計(jì)一個(gè)采用中斷方式的獨(dú)立式鍵盤,只有在鍵盤有按鍵按下時(shí),才向單片機(jī)發(fā)出中斷請(qǐng)求。單片機(jī)進(jìn)入中斷服務(wù)程序后,再對(duì)按下的鍵進(jìn)行查詢。中斷方式的獨(dú)立式鍵盤的原理電路見圖5-23。圖中P1.0~P1.7口線接上拉電阻至+5V,當(dāng)鍵盤中沒有按鍵按下時(shí)P1.0~P1.7口線均為高電平。

圖5-23中斷掃描方式的獨(dú)立式鍵盤的接口電路當(dāng)某個(gè)按鍵按下時(shí),按鍵所在行的行線為低電平,經(jīng)過8輸入與非門74LS30的輸出以及74LS04反相后向單片機(jī)的中斷請(qǐng)求輸入引腳發(fā)出低電平的外部中斷請(qǐng)求信號(hào),單片機(jī)響應(yīng)中斷,進(jìn)入外部中斷的中斷服務(wù)子程序,在中斷服務(wù)子程序中,再進(jìn)行按鍵的查詢掃描,根據(jù)掃描結(jié)果跳向按下鍵的鍵處理程序。

1121131145.6.3矩陣式鍵盤的設(shè)計(jì)

按鍵數(shù)目較多的場(chǎng)合常采用矩陣式(也稱行列式)鍵盤。鍵盤由行線和列線組成,按鍵位于行、列的交叉點(diǎn)上。如圖5-24所示,一個(gè)4×4的行列結(jié)構(gòu)可構(gòu)成一個(gè)16個(gè)按鍵k0~k15的鍵盤,需要一個(gè)8位的并行I/O口。如果采用8×8的行列結(jié)構(gòu),可構(gòu)成一個(gè)8×8=64鍵的鍵盤,只需要兩個(gè)8位的并行I/O口。很明顯,在按鍵數(shù)目較多的場(chǎng)合,矩陣式鍵盤要比獨(dú)立式鍵盤節(jié)省較多的I/O口線。116圖5-24矩陣式(行列式)鍵盤的接口電路

對(duì)圖5-24的矩陣式鍵盤的查詢掃描,一般包括以下4個(gè)步驟。(1)首先判別整個(gè)鍵盤有無按鍵按下,方法為單片機(jī)驅(qū)動(dòng)列線P1.4~P1.7輸出全“0”,然后讀行線P1.0~P1.3的狀態(tài),若為全“1”,則鍵盤上沒有閉合鍵,若P1.0~P1.3不全為“1”,則有鍵按下。(2)去除鍵的抖動(dòng),當(dāng)判別出可能有鍵按下時(shí),軟件延時(shí)一段時(shí)間(10ms左右)再判別鍵盤的狀態(tài),若仍有鍵閉合,則認(rèn)為鍵盤上有確定的鍵按下,否則是鍵抖動(dòng)。(3)求出按下鍵的鍵號(hào),圖5-24中的16個(gè)按鍵,鍵號(hào)依次為0,1,…15。各行的首鍵號(hào)分別為0,4,8,12,列號(hào)依次為0,1,2,3。行線通過上拉電阻接+5V,當(dāng)無鍵按下時(shí),行線為高電平,當(dāng)有按鍵按下時(shí),對(duì)應(yīng)的行線與列線短接,行線的電平將由此行線相連的列線電平?jīng)Q定。117如果把行線設(shè)置為單片機(jī)的輸入口線,列線設(shè)置為單片機(jī)的輸出口線,則按鍵號(hào)的識(shí)別過程是:先令0列線P1.4為低電平“0”,其余3根列線都為高電平,逐行檢查行線狀態(tài)。如果行線P1.0~P1.3都為高電平“1”,則P1.4這一列上沒有按鍵閉合,若P1.0~P1.3中有一行為低電平,則該行線與列線交叉的按鍵按下。如果P1.4這一列上沒有按鍵閉合,接著再使P1.5為低電平,其余列線為高電平。用同樣的方法檢查P1.5這一列上有無按鍵閉合,以此類推。這樣采用逐列掃描(只有一列為低),然后讀入各行線的電平,即可求出按下鍵的鍵號(hào)N為:N=行的首鍵號(hào)+列號(hào)。各行的首鍵號(hào)分別為0,4,8,12,列號(hào)依次為0,1,2,3。編程時(shí)設(shè)置1個(gè)列號(hào)計(jì)數(shù)器,初值為0,每掃描1列,列號(hào)計(jì)數(shù)器加1。118(4)判閉合鍵是否松開,如果松開則將鍵號(hào)送入A中保存,單片機(jī)根據(jù)按下鍵的鍵號(hào),對(duì)該鍵的一次閉合僅作一次鍵功能處理。1.矩陣式鍵盤的查詢掃描的編程【例5-10】對(duì)圖5-24的矩陣式鍵盤,編寫鍵盤的查詢掃描程序。查詢掃描的參考程序如下。119120121122上述的鍵盤掃描程序?qū)聪骆I的鍵號(hào)存于累加器A中,如果想要把鍵號(hào)顯示出來,只需在P2口接一個(gè)共陽極數(shù)碼管,通過下面的程序,將存于累加器A中的鍵號(hào),通過查表的方法,將鍵值的段碼通過P2口輸出給數(shù)碼管即可。參考的顯示子程序如下。

查詢掃描鍵盤無論是否有鍵按下,都需要進(jìn)行掃描。為提高鍵盤掃描的工作效率,可采用中斷掃描方式。2.矩陣式鍵盤的中斷掃描查詢方式采用中斷掃描方式,只有在鍵盤有按鍵按下時(shí),才會(huì)向單片機(jī)發(fā)出中斷請(qǐng)求,單片機(jī)執(zhí)行中斷服務(wù)子程序去掃描查詢鍵盤,識(shí)別出按下的鍵號(hào)。如果無鍵按下,單片機(jī)將不會(huì)掃描鍵盤。該方式的優(yōu)點(diǎn)是,實(shí)時(shí)性強(qiáng),工作效率高?!纠?-11】矩陣式鍵盤的中斷查詢掃描方式的設(shè)計(jì),接口電路如圖5-25所示。

鍵盤的列線與P1口的高4位相連,行線與P1口的低4位相連。圖中的4輸入與門74LS21用于產(chǎn)生按鍵中斷,其輸入端與鍵盤各行線相連,經(jīng)上拉電阻接至+5V,輸出端接至單片機(jī)的外部中斷請(qǐng)求輸入引腳。圖5-25矩陣式(行列式)鍵盤的中斷方式的接口電路當(dāng)鍵盤沒有按鍵按下時(shí),與門各輸入端均為高電平,無中斷請(qǐng)求,單片機(jī)將不會(huì)掃描鍵盤。當(dāng)有按鍵按下時(shí),相應(yīng)的列線為低電平,與門74LS21輸出也為低電平,向單片機(jī)發(fā)出中斷請(qǐng)求,若單片機(jī)外部中斷允許,就會(huì)向單片機(jī)發(fā)出中斷請(qǐng)求,單片機(jī)響應(yīng)該中斷請(qǐng)求,轉(zhuǎn)去執(zhí)行【例5-10】的查詢掃描程序,這里不再贅述。中斷掃描方式的參考程序如下:查詢掃描可以采用定時(shí)查詢也可以采用實(shí)時(shí)查詢。

定時(shí)查詢是單片機(jī)對(duì)鍵盤掃描每隔一定時(shí)間對(duì)鍵盤掃描一次。通常利用單片機(jī)的定時(shí)器產(chǎn)生定時(shí)中斷,進(jìn)入定時(shí)中斷服務(wù)程序后對(duì)鍵盤進(jìn)行掃描。由于每次按鍵的時(shí)間一般不會(huì)小于100ms,所以為了不漏判有效的按鍵,定時(shí)中斷的周期一般應(yīng)小于100ms。

實(shí)時(shí)查詢是單片機(jī)一直調(diào)用查詢掃描子程序,反復(fù)掃描鍵盤。如果查詢時(shí)間過短,雖能及時(shí)響應(yīng)鍵盤的輸入,但也會(huì)影響其他任務(wù)的進(jìn)行。如果查詢時(shí)間過長,有可能出現(xiàn)鍵盤輸入的漏判現(xiàn)象。所以要根據(jù)單片機(jī)系統(tǒng)的繁忙程度和鍵盤的操作頻率,來調(diào)整鍵盤的掃描查詢時(shí)間。5.6.4單片機(jī)與專用鍵盤/顯示器芯片HD7279的接口設(shè)計(jì)單片機(jī)通過專用可編程鍵盤/顯示器接口芯片與鍵盤/顯示器連接,由于片內(nèi)有硬件掃描電路,可對(duì)鍵盤/顯示器自動(dòng)進(jìn)行掃描,直接得到閉合鍵的鍵號(hào),省去了編寫鍵盤/顯示器動(dòng)態(tài)掃描程序以及鍵盤去抖動(dòng)程序以及計(jì)算閉合鍵鍵號(hào)的繁瑣工作。目前各種專用鍵盤/顯示器接口芯片種類繁多,早期流行的是Intel公司的并行接口的專用鍵盤/顯示器芯片8279,目前流行的鍵盤/顯示器接口芯片與單片機(jī)的接口多采用串行連接方式,占用I/O口線少。常見的專用鍵盤/顯示器芯片有:HD7279,ZLG7289A,CH451)等。這些接口芯片對(duì)所驅(qū)動(dòng)的LED數(shù)碼管全都采用動(dòng)態(tài)掃描方式,并可對(duì)鍵盤自動(dòng)掃描,直接得到閉合鍵的鍵號(hào)(編碼鍵盤),且自動(dòng)去除按鍵抖動(dòng)。

專用鍵盤/顯示器接口芯片HD7279與單片機(jī)間采用串行連接,功能強(qiáng),具有一定的抗干擾能力,可控制與驅(qū)動(dòng)8位LED數(shù)碼管顯示以及實(shí)現(xiàn)8×8的鍵盤管理。由于其外圍電路簡(jiǎn)單,價(jià)格低廉,目前在鍵盤/顯示器接口的設(shè)計(jì)中得到較為廣泛的應(yīng)用。1.HD7279A簡(jiǎn)介HD7279A能同時(shí)驅(qū)動(dòng)8個(gè)共陰極LED數(shù)碼管(或64個(gè)獨(dú)立的LED發(fā)光二極管)和8×8的編碼鍵盤。對(duì)LED數(shù)碼管采用的是動(dòng)態(tài)掃描的循環(huán)顯示方式,特性如下:與單片機(jī)間采用串行接口方式,僅占用4條口線,接口簡(jiǎn)單;具有自動(dòng)按鍵去抖動(dòng)并識(shí)別有效鍵值的功能;內(nèi)部含有譯碼器,可直接接收BCD碼或十六進(jìn)制碼,同時(shí)具有兩種譯碼方式,實(shí)現(xiàn)LED數(shù)碼管的位尋址和段尋址,可方便地控制每位LED數(shù)碼管中任意一段是否發(fā)光;內(nèi)部含有驅(qū)動(dòng)器,可以直接驅(qū)動(dòng)不超過25.4mm的LED數(shù)碼管;多種控制命令,如消隱、閃爍、左移、右移和段尋址、位尋址等;含有片選信號(hào)輸入端,容易實(shí)現(xiàn)多于8位數(shù)碼管顯示器或多于64鍵的鍵盤控制。(1)引腳說明與電氣特性HD7279A為28引腳雙列直插(DIP)式封裝,單一+5V供電,引腳見圖5-26,引腳功能見表5-5。圖5-26HD7279A的引腳DIG0~DIG7:位驅(qū)動(dòng)輸出端,可分別連接8只LED數(shù)碼管的共陰極;段驅(qū)動(dòng)輸出端SA~SG分別連接至LED數(shù)碼管的a~g段的陽極,而DP引腳連至小數(shù)點(diǎn)dp的陽極。DIG0~DIG7、DP和SA~SG還分別是64鍵鍵盤的列線和行線,完成對(duì)鍵盤的譯碼和鍵值識(shí)別。88矩陣鍵盤中的每個(gè)鍵值可用讀鍵盤命令讀出,鍵值的范圍是00H~3FH。HD7279A與單片機(jī)連接僅需4條口線:CS*、DATA、CLK和KEY*。CS*:當(dāng)單片機(jī)訪問HD7279A芯片(寫入命令、顯示數(shù)據(jù)、位地址、段地址或讀出鍵值等)時(shí),應(yīng)將置低電平。DATA:串行數(shù)據(jù)輸入/輸出端,當(dāng)單片機(jī)向HD7279A芯片發(fā)送數(shù)據(jù)時(shí),DATA為輸入端;當(dāng)單片機(jī)從HD7279A讀鍵號(hào)時(shí),DATA輸出鍵號(hào)。

CLK:數(shù)據(jù)串行傳送的同步時(shí)鐘輸入端,時(shí)鐘的上升沿將數(shù)據(jù)寫入HD7279A中或從HD7279A中讀出數(shù)據(jù)。KEY*:按鍵信號(hào)輸出端,無鍵按下為高電平,有鍵按下為低電平,且一直保持到該鍵釋放為止。RESET*:復(fù)位端,通常該端接+5V。若對(duì)可靠性要求較高,則可外接復(fù)位電路,或直接由單片機(jī)控制。RC:該腳外接振蕩元件,其典型值為R=1.5k,C=15pF。NC:懸空。HD7279A電氣特性見表5-6。(2)控制命令控制命令由6條不帶數(shù)據(jù)的單字節(jié)純命令、7條帶數(shù)據(jù)的命令和1條讀鍵盤命令組成。①純命令(6條)所有純命令都是單字節(jié)命令,見表5-7。②帶數(shù)據(jù)命令(7條)均由雙字節(jié)組成,第1字節(jié)為命令標(biāo)志碼(有的還有位地址),第2字節(jié)為顯示內(nèi)容。a.方式0譯碼顯示命令:139a2、a1、a0—8只數(shù)碼管位地址,表示顯示數(shù)據(jù)應(yīng)送給哪一位數(shù)碼管,000:最低位數(shù)碼管,111:最高位數(shù)碼管。d3、d2、d1、d0—顯示數(shù)據(jù),HD7279A收到這些數(shù)據(jù)后,將按表5-6所示的規(guī)則譯碼和顯示。dp—小數(shù)點(diǎn)顯示控制位,1:小數(shù)點(diǎn)顯示,0:小數(shù)點(diǎn)不顯示。:無用位。例如,命令第1字節(jié)為80H,第2字節(jié)為08H,則L1位(最低位)數(shù)碼管顯示8,小數(shù)點(diǎn)dp熄滅;命令第1字節(jié)為87H,第2字節(jié)為8EH,則L8位(最高位)LED顯示內(nèi)容為P,小數(shù)點(diǎn)dp點(diǎn)亮。b.方式1譯碼顯示命令:142該命令與方式0譯碼顯示的含義基本相同,不同的是譯碼方式為1,數(shù)碼管顯示的內(nèi)容與十六進(jìn)制相對(duì)應(yīng),如表5-9所示。例如,命令第1字節(jié)為C8H,第2字節(jié)為09H,則L1位數(shù)碼管顯示9,小數(shù)點(diǎn)dp熄滅;命令第1字節(jié)為C9H,第2字節(jié)為8FH,則L2位數(shù)碼管顯示F,小數(shù)點(diǎn)dp點(diǎn)亮。c.不譯碼顯示命令:144命令中的a2、a1、a0為顯示位的位地址,第2字節(jié)為LED顯示內(nèi)容,其中dp和A~G分別代表數(shù)碼管的小數(shù)點(diǎn)和對(duì)應(yīng)的段,當(dāng)取值為1時(shí),該段點(diǎn)亮;取值為0時(shí),該段熄滅。該命令可在指定位上顯示字符。例如,若命令第1字節(jié)為95H,第2字節(jié)為3EH,則在L6位LED上顯示字符U,小數(shù)點(diǎn)dp熄滅。d.閃爍控制命令:該命令規(guī)定了每個(gè)數(shù)碼管的閃爍屬性。d8~d1分別對(duì)應(yīng)L8~L1位數(shù)碼管,其值為1時(shí),數(shù)碼管不閃爍;其值為0時(shí),數(shù)碼管閃爍。該命令的默認(rèn)值是所有數(shù)碼管均不閃爍。例如,命令第1字節(jié)為88H,第2字節(jié)為97H,則L7、L6、L4位數(shù)碼管閃爍。146e.消隱控制命令:該命令規(guī)定了每個(gè)數(shù)碼管的消隱屬性。d8~d1分別對(duì)應(yīng)L8~L1位數(shù)碼管,其值為1時(shí),數(shù)碼管顯示;值為0時(shí)消隱。應(yīng)注意至少要有1個(gè)LED數(shù)碼管保持顯示,如果全部消隱,則該命令無效。例如,命令第1字節(jié)為98H,第2字節(jié)為81H,則L7~L2位的6位數(shù)碼管消隱。f.段點(diǎn)亮命令:該命令是點(diǎn)亮某位數(shù)碼管中的某一段?!痢翞闊o影響位,d5~d0取值為00H~3FH,所對(duì)應(yīng)的點(diǎn)亮段見表5-10。例如,命令第1字節(jié)E0H,第2字節(jié)00H,則點(diǎn)亮L1位數(shù)碼管的g段;如果第2字節(jié)為19H,則點(diǎn)亮L4位數(shù)碼管的f段;再如第2字節(jié)為35H,則點(diǎn)亮L7位LED的b段g.段關(guān)閉命令:關(guān)閉某個(gè)數(shù)碼管中的某一段?!痢翞闊o影響位,d5~d0的取值為00H~3FH,所對(duì)應(yīng)的關(guān)閉段同表5-8,僅僅是將點(diǎn)亮段變?yōu)殛P(guān)閉段。例如,命令第1字節(jié)為C0H,第2字節(jié)為00H,則關(guān)閉L1位LED的g段;第2字節(jié)為10H,則關(guān)閉L3位LED的g段。③讀取鍵值命令本命令是從HD7279A讀出當(dāng)前按下的鍵值,格式如下:

命令的第1字節(jié)為15H,表示單片機(jī)寫到HD7279A的是讀鍵值命令,而第2字節(jié)d7~d0為從HD7279A中讀出的按鍵值,其范圍為00H~3FH。當(dāng)按鍵按下時(shí),HD7279A的KEY*腳從高電平變?yōu)榈碗娖?,并保持到按鍵釋放為止。在此期間,若HD7279A收到來自單片機(jī)的讀鍵盤命令15H,則HD7279A向單片機(jī)發(fā)出當(dāng)前的按鍵代碼。應(yīng)注意,HD7279A只給其中1個(gè)按下鍵的代碼,不適合2個(gè)或2個(gè)以上鍵同時(shí)按下的場(chǎng)合。如果確實(shí)需要雙鍵組合使用,可在單片機(jī)某位I/O引腳接1個(gè)鍵,與HD7279A所連鍵盤共同組

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論