新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用AT89C51控制活動(dòng)字符顯示屏

用AT89C51控制活動(dòng)字符顯示屏

作者: 時(shí)間:2011-02-21 來(lái)源:網(wǎng)絡(luò) 收藏
字符和圖形的顯示,在各種智能設(shè)備或系統(tǒng)中是常常用到的,如實(shí)現(xiàn)人機(jī)對(duì)話的功能菜單提示液晶屏,或是以輸出文字信息為主要功能的大型LED廣告屏等。本文通過(guò)利用LED點(diǎn)陣模塊實(shí)現(xiàn)活動(dòng)字符顯示的控制電路,向大家介紹片內(nèi)RAM的使用、累加器循環(huán)移位等字符的字模設(shè)計(jì)原理指令。
  一、電路功能及顯示內(nèi)容
  本電路由AT89C51通過(guò)P0口和P2口與由VD1-1至VD8-8等64只發(fā)光二極管組成的顯示點(diǎn)陣模塊相連接而組成,通過(guò)相應(yīng)的行列電位控制,上電后,使點(diǎn)陣模塊依次顯示出“OK”、“ST”、“JC”和“之二”字樣,并周而復(fù)始地循環(huán)。
  二、電路原理
  整個(gè)電路由AT89C51、顯示模塊及驅(qū)動(dòng)三極管VT1至VT8等構(gòu)成,電路原理見(jiàn)圖1。
  圖1虛線內(nèi)VD1-1至VD8-8共64只發(fā)光二極管構(gòu)成了顯示字符的點(diǎn)陣模塊,這種模塊是專(zhuān)門(mén)用于LED顯示屏的。型號(hào)是TOM-2088BE-B,這種點(diǎn)陣模塊有16條引腳。點(diǎn)陣模塊正面點(diǎn)陣布局如圖2所示,背面引腳排列如圖3所示。在圖1中,虛線外邊與IC1相連接的行列線所標(biāo)序號(hào)為模塊引腳號(hào)。整個(gè)顯示點(diǎn)陣連接成行列控制的形式,8條行線分別與P0口的8條I/O線相連接,8條列線分別與受P2口8條口線控制的8只驅(qū)動(dòng)三極管相連接。這樣,當(dāng)我們向P2口送入一個(gè)控制字#80H,P2.7呈高電位,而P2.6至P2.0皆呈低電位,因此,P2.7的高電位通過(guò)R17使VT1導(dǎo)通,VD1-1至VD1-8的8只發(fā)光二極管的負(fù)極皆與地相接,這就為VD1-1至VD1-8組成的第1列發(fā)光二極管的導(dǎo)通提供了使能條件。此時(shí)我們?cè)傧騊0口送入字模數(shù)據(jù),相應(yīng)的二極管就被點(diǎn)亮,點(diǎn)陣像素就會(huì)被顯示出來(lái)。比如我們向P0口送入數(shù)據(jù)#7EH,VD1-2至VD1-7就被點(diǎn)亮。模塊最左邊一列呈現(xiàn)的圖形如圖2中左邊第1列所示。如果我們將P2口的高電位依次向右循環(huán)移動(dòng),VT1至VT8就會(huì)依次導(dǎo)通,使能條件就會(huì)從第1列依次轉(zhuǎn)換至第8列。在VT1至VT8導(dǎo)通時(shí)我們依次向P0口送入數(shù)據(jù)#7EH、#42H、#7EH、#00H、#FFH、#28H、#44H、#82H,點(diǎn)陣模塊顯示的圖形則如圖2所示,即呈現(xiàn)出字符“OK”,這就實(shí)現(xiàn)了字符的顯示。VT1至VT8依次導(dǎo)通,使第1列至第8列的二極管依次得到發(fā)光使能條件的過(guò)程,就是通常所說(shuō)的掃描。由于點(diǎn)陣模塊中的發(fā)光二極管發(fā)光不存在余輝,斷電就會(huì)熄滅,如果不進(jìn)行這種掃描,要么只能顯示1列像素,要么就使幾列或所有列都顯示相同的像素。所以,只有不斷地通過(guò)P0口送出字符或圖形的點(diǎn)陣數(shù)據(jù),再在P2口的控制下使各列依次顯示一定的時(shí)間,才能使模塊將整幅圖形的像素完整地顯示出來(lái)。因此,只有系統(tǒng)周而復(fù)始地掃描,才會(huì)使點(diǎn)陣模塊顯示出穩(wěn)定的字符與圖形。
  三、片內(nèi)RAM的使用及字符活動(dòng)原理
  由于本系統(tǒng)要顯示的字符是活動(dòng)的,所有字符的數(shù)據(jù)在存儲(chǔ)空間的位置順序是要不斷變化的。因此,僅將要顯示的點(diǎn)陣數(shù)據(jù)存在程序存儲(chǔ)區(qū)是無(wú)法進(jìn)行變化處理的,因?yàn)槌绦虼鎯?chǔ)器是只讀存儲(chǔ)器,在應(yīng)用系統(tǒng)中是無(wú)法改寫(xiě)的,而內(nèi)的RAM,是可讀可寫(xiě)的靜態(tài)存儲(chǔ)器,存取時(shí)間極短,專(zhuān)門(mén)存放需頻繁改寫(xiě)處理的數(shù)據(jù),所以,只有將本系統(tǒng)要顯示的活動(dòng)字符的所有點(diǎn)陣代碼存放在片內(nèi)RAM中,在程序的控制下,根據(jù)當(dāng)前顯示的需要,進(jìn)行相應(yīng)的變化處理,再通過(guò)P0口送出,才能使點(diǎn)陣模塊中顯示的字符活動(dòng)起來(lái)。
  我們講過(guò),AT89C51片內(nèi)有128字節(jié)RAM,地址空間為00H至7FH。其中00H至2FH具有特殊功能,所以我們可以將要顯示字符的字模數(shù)據(jù)從30H開(kāi)始存放。如圖4所示,“OK”、“ST”、“JC”和“之二”字模數(shù)據(jù)共56個(gè)字節(jié),我們把它存儲(chǔ)在30H至67H單元之內(nèi)。在圖4中,數(shù)據(jù)為“1”的位被涂色,為“0”的位為空白,要顯示的字符圖形與字模數(shù)據(jù)的對(duì)應(yīng)關(guān)系就被清楚地表示出來(lái)。在前述的掃描過(guò)程中,當(dāng)掃描第一列,也就是向P2口送出控制字#80H,P2.7呈高電位時(shí),CPU將RAM中67H單元內(nèi)的內(nèi)容送至P0口,于是,67H中字模數(shù)據(jù)的含義就在LED點(diǎn)陣模塊的最左一列被以亮暗不同的點(diǎn)表達(dá)出來(lái),完成字模數(shù)據(jù)與圖像的對(duì)應(yīng)轉(zhuǎn)換。之后,P2.7的高電位向P2.0逐步移動(dòng),依次掃描,CPU便將RAM區(qū)66H至60H中的內(nèi)容依次通過(guò)P0口送至點(diǎn)陣模塊的第2列至第8列顯示出來(lái)。至此,一幀完整的圖形顯示即告完成。然后可重返67H取字模數(shù)據(jù)進(jìn)行下一幀掃描。由于67H至60H中數(shù)據(jù)的每一位與點(diǎn)陣模塊中的VD1-1至VD8-8是一一對(duì)應(yīng)的,因此,67H至60H的這8個(gè)存儲(chǔ)單元即為字符顯示緩存區(qū)。在RAM內(nèi)30H至67H的整個(gè)數(shù)據(jù)塊中,只有處在60H至67H之間的數(shù)據(jù)才會(huì)被送到點(diǎn)陣模塊中顯示出來(lái)。如果顯示點(diǎn)陣好比電影的屏幕,整個(gè)數(shù)據(jù)塊就是膠片。30H至67H這個(gè)區(qū)間就是電影放映機(jī)的鏡頭,所有的數(shù)據(jù)只有到達(dá)這個(gè)區(qū)間,也就是顯示緩存區(qū)以后,其代表的圖形信息才會(huì)在點(diǎn)陣模塊中“放映”出來(lái)。因此,若想將“OK”以后的“ST”、“JC”、“之二”等字符顯示出來(lái),只要將自5FH至30H內(nèi)的數(shù)據(jù)逐字節(jié)向上移動(dòng)即可實(shí)現(xiàn)。具體過(guò)程是,首先將67H的內(nèi)容送至68H之中,空出67H單元,以后將下面的字節(jié)逐個(gè)上移,直至移動(dòng)56個(gè)字節(jié),30H中的內(nèi)容就被移到了31H之中,至此整個(gè)數(shù)據(jù)塊上移了一個(gè)地址空間,點(diǎn)陣模塊中的字形“OK”也便左移了一列,字符開(kāi)始“活動(dòng)”起來(lái)。當(dāng)整個(gè)數(shù)據(jù)塊上移一個(gè)地址空間之后,必須將移至68H中的數(shù)據(jù)再移至30H,因?yàn)?,只有這樣才能保證整個(gè)字模數(shù)據(jù)不至于在以后的移動(dòng)中因被覆蓋而丟失,才能保證數(shù)據(jù)塊的完整和連續(xù)性。如此,不斷地重復(fù)上述數(shù)據(jù)上移過(guò)程,整個(gè)數(shù)據(jù)塊就會(huì)連續(xù)地通過(guò)60H至67H組成的顯示緩存區(qū),所有的字符就會(huì)在點(diǎn)陣模塊中滾動(dòng)經(jīng)過(guò),這就實(shí)現(xiàn)了字符的移動(dòng)顯示。
  四、程序設(shè)計(jì)及主要指令
  本例程序的設(shè)計(jì)思路是:上電后,首先向P0口和P2口送#00H,關(guān)閉顯示完成初始化。然后調(diào)入所有字符的字模數(shù)據(jù),進(jìn)行掃描顯示。連續(xù)掃描0.5s以后,將數(shù)據(jù)塊上移一字節(jié),再返回掃描程序和數(shù)據(jù)塊移動(dòng)程序,周而復(fù)始。連續(xù)掃描時(shí)間在主程序中設(shè)定。
  1.字模數(shù)據(jù)的調(diào)入及查表指令
  利用查表指令構(gòu)成查表子程序,可以使字模數(shù)據(jù)從程序存儲(chǔ)器調(diào)入片內(nèi)RAM的程序更簡(jiǎn)短,并可以使字模數(shù)據(jù)在程序存儲(chǔ)空間中集中存放。
  由前述可知,全部字模數(shù)據(jù)為56個(gè)字節(jié),如果用普通的數(shù)據(jù)傳送指令MOV direct,#data,每送1字節(jié)數(shù)據(jù)需3個(gè)字節(jié)的程序代碼才能完成。比如將“OK”字形的第1列字模數(shù)據(jù)#7EH送入片內(nèi)RAM的67H空間,指令是MOV 67H,#7EH;機(jī)器碼是75677EH,這樣,傳送完56個(gè)字節(jié)的字模數(shù)據(jù)的程序需168個(gè)字節(jié)的程序代碼,占用空間較大。而用查表指令來(lái)完成上述56個(gè)字節(jié)的字模數(shù)據(jù)的調(diào)入,所有程序代碼只用76個(gè)字節(jié)就完成了,比利用一般數(shù)據(jù)傳輸指令少用了92個(gè)字節(jié),既節(jié)約了程序存儲(chǔ)空間,又使程序設(shè)計(jì)變得簡(jiǎn)單。
  查表指令MOVC A,@A+PC,機(jī)器代碼是83H。執(zhí)行結(jié)果是將累加器A中的內(nèi)容與程序地址寄存器PC中的值相加得到一個(gè)被查找的程序存儲(chǔ)空間的單元地址(數(shù)據(jù)表格的地址),然后將該單元的內(nèi)容送入累加器A中,其中PC是用來(lái)存放下一條指令的地址。例如,如果我們先將立即數(shù)#01H存入RAM的69H單元中,當(dāng)執(zhí)行完程序存儲(chǔ)器中地址為0078H處的MOV A,69H指令后,累加器A中的值就是#01H,若數(shù)據(jù)表格的起始地址是007CH,則執(zhí)行完下一條MOVC A,@A+PC指令后,就將007CH中的字模數(shù)據(jù)#7EH送到了累加器A中。因?yàn)楫?dāng)執(zhí)行完0078H處的MOV A,69H指令后,CPU的程序地址寄存器PC中的值為#007AH,CPU便直接到007AH中去取程序代碼來(lái)識(shí)別執(zhí)行。由于安放在007AH中的指令是一條專(zhuān)用的變址查表指令,執(zhí)行后,PC中的值不但會(huì)自動(dòng)加1,變成#007BH,而且還會(huì)將A中的值與PC中的值相加得到一個(gè)地址,指向所取數(shù)據(jù)的存儲(chǔ)單元。由于A中的值是#01H,所以,CPU就會(huì)到007C中將立即數(shù)#7EH取出存于A中,然后再執(zhí)行007BH處的指令。上述也是查表子程序的執(zhí)行過(guò)程。從查表子程序返回主程序后,在主程序的控制下,將A中的字模數(shù)據(jù)再存于片內(nèi)RAM的67H之中。由上述不難理解,我們每取一次數(shù)之后將69H中的內(nèi)容加1,這樣,不斷地調(diào)用查表子程序,CPU就會(huì)將字模數(shù)據(jù)表中的所有字模數(shù)據(jù)逐字節(jié)調(diào)到片內(nèi)RAM之中。
  2.掃描程序及累加器循環(huán)移位指令
  掃描程序能使在向P0口送出數(shù)據(jù)之后,不斷改變P2口各口線的高低電位,使VT1至VT8依次導(dǎo)通,完成整幅字符或圖形的顯示。而利用累加器循環(huán)移位指令來(lái)實(shí)現(xiàn)P2口各口線的電位改變是最為簡(jiǎn)捷的辦法。
  根據(jù)如前所述的掃描顯示過(guò)程,我們采用累加器循環(huán)移位指令來(lái)完成P2口中的高電位移動(dòng)是極其方便的。累加器A是單片機(jī)中使用最頻繁的具有特殊功能的寄存器。RR A指令能使A中的內(nèi)容向右循環(huán)移位,該指令代碼是03H。執(zhí)行該指令的結(jié)果是(An+1)→(An),(A0)→(A7)。如圖5所示。假如在A中裝入的數(shù)據(jù)為#80H,也就是1000 0000B,執(zhí)行RR A后,A中的數(shù)據(jù)則是#40H,也就是0100 0000B,所有數(shù)據(jù)皆向右移動(dòng)了一位,而原來(lái)的最低位則轉(zhuǎn)移到最高位,其中唯一的一位高電位也便右移了一位。因此,要使P2口僅有一條口線呈高電位,并向右循環(huán)移動(dòng),首先執(zhí)行MOV A #80H,再執(zhí)行MOV P2,A,將#80H送入P2口,然后執(zhí)行RR A完成一次循環(huán),再執(zhí)行MOV P2,A,將循環(huán)后的控制字送至P2口即可。向A中裝入立即數(shù)#80H,經(jīng)過(guò)8次上述操作過(guò)程,P2口自P2.7至P2.0就會(huì)依次呈現(xiàn)高電位,完成前述的掃描任務(wù)。
  3.數(shù)據(jù)塊移動(dòng)程序及寄存器間接尋址數(shù)據(jù)傳送指令
  數(shù)據(jù)塊移動(dòng)程序能使片內(nèi)RAM中的字模數(shù)據(jù)塊整體向上移動(dòng),當(dāng)主程序持續(xù)運(yùn)行,就會(huì)使所有的字模數(shù)據(jù)從RAM的60H至67H之間通過(guò),使系統(tǒng)顯示的字符以“拉幕”的形式在點(diǎn)陣模塊中依次顯示出來(lái)。
  我們先分別向R0和R1中送入立即數(shù)#68H和#67H,再執(zhí)行MOV A,@R1和MOV @R0,A,這是兩條寄存器間接尋址數(shù)據(jù)傳送指令。其結(jié)果是先將以R1中的內(nèi)容為地址的存儲(chǔ)單元內(nèi)的數(shù)據(jù)送入累加器A,再將A中的內(nèi)容送入以R0中的內(nèi)容為地址的存儲(chǔ)單元內(nèi),這就將片內(nèi)RAM 67H中的字模數(shù)據(jù)送到了68H之中。然后將R0和R1中的內(nèi)容減1,使R0中的內(nèi)容變?yōu)椋?7H,使R1中的內(nèi)容變?yōu)椋?6H,重復(fù)前面的過(guò)程,又將66H中的字模數(shù)據(jù)送到了67H之中了。依次類(lèi)推,將上述過(guò)程重復(fù)56次,片內(nèi)RAM 30H中的字模數(shù)據(jù)就被送到了31H之中,至此,整個(gè)字模數(shù)據(jù)塊便整體向上移動(dòng)了一個(gè)地址空間。之后,還必須執(zhí)行MOV 30H,68H,將68H中的字模數(shù)據(jù)送入30H之中,實(shí)現(xiàn)字模數(shù)據(jù)塊的首尾相接。
  4.短轉(zhuǎn)移指令
  為了實(shí)現(xiàn)連續(xù)滾動(dòng)顯示,當(dāng)完成調(diào)入字模數(shù)據(jù)、掃描顯示和數(shù)據(jù)上移之后,需要CPU再返回掃描顯示處循環(huán)執(zhí)行掃描和數(shù)據(jù)塊上移的程序,所以在數(shù)據(jù)塊移動(dòng)程序的最后還要安放一條短轉(zhuǎn)移指令SJMP(指令的機(jī)器碼是80H)。執(zhí)行此指令后,程序就轉(zhuǎn)移至掃描程序的入口處,開(kāi)始又一次的掃描和數(shù)據(jù)塊上移操作。例如:SJMP 0051H,即程序轉(zhuǎn)移至程序存儲(chǔ)器中地址為0051H處,執(zhí)行該處程序。指令SJMP rel的轉(zhuǎn)移范圍為-128至+127。
  五、本文涉及的其他指令
  算術(shù)操作類(lèi)指令:
  INC Rn:執(zhí)行結(jié)果是將寄存器Rn中的內(nèi)容加1。
  DEC Rn:執(zhí)行結(jié)果是將寄存器Rn中的內(nèi)容減1。
  六、程序清單

 

地址

機(jī)器碼

指令

 

注釋

0000

02003B

AJMP

003BH

;轉(zhuǎn)至主程序

003B

758000

MOV

P0,#00H

;初始化

003E

75A000

MOV

P2,#00H

;關(guān)閉顯示

0041

7938

MOV

R1,#38H

;調(diào)入字模數(shù)據(jù)

0043

7867

MOV

R0,#67H

;設(shè)字模存放起始地址

0045

756901

MOV

69H,#01H

;送字模數(shù)據(jù)表起始地址

0048

120078

LCALL

0078H

;調(diào)查表子程序

004B

F6

MOV

@R0,A

;字模送入RAM

004C

18

DEC

R0

004D

0569

INC

69H

;

004F

D9F7

DJNZ

R1

;未完,返回

0051

7D18

MOV

R5,#18H

;置掃描時(shí)間常數(shù)

0053

7EFF

MOV

R6, #FFH

;

0055

7F08

MOV

R7,#08H

;置掃描列數(shù)

0057

7860

MOV

R0,#60H

;設(shè)顯示緩沖區(qū)低地址

0059

7480

MOV

A, #80H

;送列掃描起始控制字

005B

8680

MOV

P0,@R0

;字模數(shù)據(jù)輸出至顯示屏

005D

F5A0

MOV

P2,A

;輸出列控制字至顯示屏

005F

08

INC

R0

;準(zhǔn)備字模的下一字節(jié)

0060

03

RR

A

;準(zhǔn)備掃描下一列

0061

DFF8

DJNZ

JNZ
 

;未完返回

0063

DEF0

DJNZ

R6

;

0065

DDEC

DJNZ

R5

;

0067

7F38

MOV

R7,#38H

;置字模數(shù)據(jù)移動(dòng)總字節(jié)數(shù)

0069

7868

MOV

R0,#68H

;設(shè)塊移動(dòng)暫存單元地址

006B

7967

MOV

R1,#67H

;設(shè)移動(dòng)塊超始地址

006D

E7

MOV

A,@R1

;

006E

F6

MOV

@R0,A

;向上移動(dòng)一個(gè)地址

006F

18

DEC

R0

;轉(zhuǎn)向下一個(gè)字節(jié)

0070

19

DEC

R1

;

0071

DFFA

DJNZ

R7

;不足56個(gè)字節(jié)繼續(xù)移動(dòng)

0073

856830

MOV

30H,68H

;首尾相接

0076

80D9

SJMP

0051H

;跳轉(zhuǎn)至0051H

0078

E569

MOV

A,69H

;取查表增址值

007A

83

MOVC

A,@A+PC

;取字模數(shù)據(jù)

007B

22

RET

;子程序返回

 

007C

7E 42

7E 00

FF 28 44

82 字模數(shù)據(jù)表

 

00 00

4C 92

92 92 64

00

 

00 06

02 FE

FE 02 06

00

 

00 00

04 85

FD 04 00

00

 

7C FE

82 82

82 46 00

00

 

40 44

A4 A5

96 8C 84

80

 

00 20

24 24

24 24 24

20

led顯示器相關(guān)文章:led顯示器原理




評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉