新聞中心

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

用AT89C51控制活動字符顯示屏

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

 

地址

機器碼

指令

 

注釋

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ù)

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ù)移動總字節(jié)數(shù)

0069

7868

MOV

R0,#68H

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

006B

7967

MOV

R1,#67H

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

006D

E7

MOV

A,@R1

;

006E

F6

MOV

@R0,A

;向上移動一個地址

006F

18

DEC

R0

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

0070

19

DEC

R1

;

0071

DFFA

DJNZ

R7

;不足56個字節(jié)繼續(xù)移動

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顯示器原理




評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉