用AT89C51控制活動字符顯示屏
一、電路功能及顯示內(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顯示器原理
評論