用AT89C51控制活動字符顯示屏
一、電路功能及顯示內容
本電路由AT89C51通過P0口和P2口與由VD1-1至VD8-8等64只發光二極管組成的顯示點陣模塊相連接而組成,通過相應的行列電位控制,上電后,使點陣模塊依次顯示出“OK”、“ST”、“JC”和“之二”字樣,并周而復始地循環。
二、電路原理
整個電路由AT89C51、顯示模塊及驅動三極管VT1至VT8等構成,電路原理見圖1。
圖1虛線內VD1-1至VD8-8共64只發光二極管構成了顯示字符的點陣模塊,這種模塊是專門用于LED顯示屏的。型號是TOM-2088BE-B,這種點陣模塊有16條引腳。點陣模塊正面點陣布局如圖2所示,背面引腳排列如圖3所示。在圖1中,虛線外邊與IC1相連接的行列線所標序號為模塊引腳號。整個顯示點陣連接成行列控制的形式,8條行線分別與P0口的8條I/O線相連接,8條列線分別與受P2口8條口線控制的8只驅動三極管相連接。這樣,當我們向P2口送入一個控制字#80H,P2.7呈高電位,而P2.6至P2.0皆呈低電位,因此,P2.7的高電位通過R17使VT1導通,VD1-1至VD1-8的8只發光二極管的負極皆與地相接,這就為VD1-1至VD1-8組成的第1列發光二極管的導通提供了使能條件。此時我們再向P0口送入字模數據,相應的二極管就被點亮,點陣像素就會被顯示出來。比如我們向P0口送入數據#7EH,VD1-2至VD1-7就被點亮。模塊最左邊一列呈現的圖形如圖2中左邊第1列所示。如果我們將P2口的高電位依次向右循環移動,VT1至VT8就會依次導通,使能條件就會從第1列依次轉換至第8列。在VT1至VT8導通時我們依次向P0口送入數據#7EH、#42H、#7EH、#00H、#FFH、#28H、#44H、#82H,點陣模塊顯示的圖形則如圖2所示,即呈現出字符“OK”,這就實現了字符的顯示。VT1至VT8依次導通,使第1列至第8列的二極管依次得到發光使能條件的過程,就是通常所說的掃描。由于點陣模塊中的發光二極管發光不存在余輝,斷電就會熄滅,如果不進行這種掃描,要么只能顯示1列像素,要么就使幾列或所有列都顯示相同的像素。所以,只有不斷地通過P0口送出字符或圖形的點陣數據,再在P2口的控制下使各列依次顯示一定的時間,才能使模塊將整幅圖形的像素完整地顯示出來。因此,只有系統周而復始地掃描,才會使點陣模塊顯示出穩定的字符與圖形。
三、片內RAM的使用及字符活動原理
由于本系統要顯示的字符是活動的,所有字符的數據在存儲空間的位置順序是要不斷變化的。因此,僅將要顯示的點陣數據存在程序存儲區是無法進行變化處理的,因為程序存儲器是只讀存儲器,在應用系統中是無法改寫的,而單片機內的RAM,是可讀可寫的靜態存儲器,存取時間極短,專門存放需頻繁改寫處理的數據,所以,只有將本系統要顯示的活動字符的所有點陣代碼存放在片內RAM中,在程序的控制下,根據當前顯示的需要,進行相應的變化處理,再通過P0口送出,才能使點陣模塊中顯示的字符活動起來。
我們講過,AT89C51片內有128字節RAM,地址空間為00H至7FH。其中00H至2FH具有特殊功能,所以我們可以將要顯示字符的字模數據從30H開始存放。如圖4所示,“OK”、“ST”、“JC”和“之二”字模數據共56個字節,我們把它存儲在30H至67H單元之內。在圖4中,數據為“1”的位被涂色,為“0”的位為空白,要顯示的字符圖形與字模數據的對應關系就被清楚地表示出來。在前述的掃描過程中,當掃描第一列,也就是向P2口送出控制字#80H,P2.7呈高電位時,CPU將RAM中67H單元內的內容送至P0口,于是,67H中字模數據的含義就在LED點陣模塊的最左一列被以亮暗不同的點表達出來,完成字模數據與圖像的對應轉換。之后,P2.7的高電位向P2.0逐步移動,依次掃描,CPU便將RAM區66H至60H中的內容依次通過P0口送至點陣模塊的第2列至第8列顯示出來。至此,一幀完整的圖形顯示即告完成。然后可重返67H取字模數據進行下一幀掃描。由于67H至60H中數據的每一位與點陣模塊中的VD1-1至VD8-8是一一對應的,因此,67H至60H的這8個存儲單元即為字符顯示緩存區。在RAM內30H至67H的整個數據塊中,只有處在60H至67H之間的數據才會被送到點陣模塊中顯示出來。如果顯示點陣好比電影的屏幕,整個數據塊就是膠片。30H至67H這個區間就是電影放映機的鏡頭,所有的數據只有到達這個區間,也就是顯示緩存區以后,其代表的圖形信息才會在點陣模塊中“放映”出來。因此,若想將“OK”以后的“ST”、“JC”、“之二”等字符顯示出來,只要將自5FH至30H內的數據逐字節向上移動即可實現。具體過程是,首先將67H的內容送至68H之中,空出67H單元,以后將下面的字節逐個上移,直至移動56個字節,30H中的內容就被移到了31H之中,至此整個數據塊上移了一個地址空間,點陣模塊中的字形“OK”也便左移了一列,字符開始“活動”起來。當整個數據塊上移一個地址空間之后,必須將移至68H中的數據再移至30H,因為,只有這樣才能保證整個字模數據不至于在以后的移動中因被覆蓋而丟失,才能保證數據塊的完整和連續性。如此,不斷地重復上述數據上移過程,整個數據塊就會連續地通過60H至67H組成的顯示緩存區,所有的字符就會在點陣模塊中滾動經過,這就實現了字符的移動顯示。
四、程序設計及主要指令
本例程序的設計思路是:上電后,首先向P0口和P2口送#00H,關閉顯示完成初始化。然后調入所有字符的字模數據,進行掃描顯示。連續掃描0.5s以后,將數據塊上移一字節,再返回掃描程序和數據塊移動程序,周而復始。連續掃描時間在主程序中設定。
1.字模數據的調入及查表指令
利用查表指令構成查表子程序,可以使字模數據從程序存儲器調入片內RAM的程序更簡短,并可以使字模數據在程序存儲空間中集中存放。
由前述可知,全部字模數據為56個字節,如果用普通的數據傳送指令MOV direct,#data,每送1字節數據需3個字節的程序代碼才能完成。比如將“OK”字形的第1列字模數據#7EH送入片內RAM的67H空間,指令是MOV 67H,#7EH;機器碼是75677EH,這樣,傳送完56個字節的字模數據的程序需168個字節的程序代碼,占用空間較大。而用查表指令來完成上述56個字節的字模數據的調入,所有程序代碼只用76個字節就完成了,比利用一般數據傳輸指令少用了92個字節,既節約了程序存儲空間,又使程序設計變得簡單。
查表指令MOVC A,@A+PC,機器代碼是83H。執行結果是將累加器A中的內容與程序地址寄存器PC中的值相加得到一個被查找的程序存儲空間的單元地址(數據表格的地址),然后將該單元的內容送入累加器A中,其中PC是用來存放下一條指令的地址。例如,如果我們先將立即數#01H存入RAM的69H單元中,當執行完程序存儲器中地址為0078H處的MOV A,69H指令后,累加器A中的值就是#01H,若數據表格的起始地址是007CH,則執行完下一條MOVC A,@A+PC指令后,就將007CH中的字模數據#7EH送到了累加器A中。因為當執行完0078H處的MOV A,69H指令后,CPU的程序地址寄存器PC中的值為#007AH,CPU便直接到007AH中去取程序代碼來識別執行。由于安放在007AH中的指令是一條專用的變址查表指令,執行后,PC中的值不但會自動加1,變成#007BH,而且還會將A中的值與PC中的值相加得到一個地址,指向所取數據的存儲單元。由于A中的值是#01H,所以,CPU就會到007C中將立即數#7EH取出存于A中,然后再執行007BH處的指令。上述也是查表子程序的執行過程。從查表子程序返回主程序后,在主程序的控制下,將A中的字模數據再存于片內RAM的67H之中。由上述不難理解,我們每取一次數之后將69H中的內容加1,這樣,不斷地調用查表子程序,CPU就會將字模數據表中的所有字模數據逐字節調到片內RAM之中。
2.掃描程序及累加器循環移位指令
掃描程序能使單片機在向P0口送出數據之后,不斷改變P2口各口線的高低電位,使VT1至VT8依次導通,完成整幅字符或圖形的顯示。而利用累加器循環移位指令來實現P2口各口線的電位改變是最為簡捷的辦法。
根據如前所述的掃描顯示過程,我們采用累加器循環移位指令來完成P2口中的高電位移動是極其方便的。累加器A是單片機中使用最頻繁的具有特殊功能的寄存器。RR A指令能使A中的內容向右循環移位,該指令代碼是03H。執行該指令的結果是(An+1)→(An),(A0)→(A7)。如圖5所示。假如在A中裝入的數據為#80H,也就是1000 0000B,執行RR A后,A中的數據則是#40H,也就是0100 0000B,所有數據皆向右移動了一位,而原來的最低位則轉移到最高位,其中唯一的一位高電位也便右移了一位。因此,要使P2口僅有一條口線呈高電位,并向右循環移動,首先執行MOV A #80H,再執行MOV P2,A,將#80H送入P2口,然后執行RR A完成一次循環,再執行MOV P2,A,將循環后的控制字送至P2口即可。向A中裝入立即數#80H,經過8次上述操作過程,P2口自P2.7至P2.0就會依次呈現高電位,完成前述的掃描任務。
3.數據塊移動程序及寄存器間接尋址數據傳送指令
數據塊移動程序能使片內RAM中的字模數據塊整體向上移動,當主程序持續運行,就會使所有的字模數據從RAM的60H至67H之間通過,使系統顯示的字符以“拉幕”的形式在點陣模塊中依次顯示出來。
我們先分別向R0和R1中送入立即數#68H和#67H,再執行MOV A,@R1和MOV @R0,A,這是兩條寄存器間接尋址數據傳送指令。其結果是先將以R1中的內容為地址的存儲單元內的數據送入累加器A,再將A中的內容送入以R0中的內容為地址的存儲單元內,這就將片內RAM 67H中的字模數據送到了68H之中。然后將R0和R1中的內容減1,使R0中的內容變為#67H,使R1中的內容變為#66H,重復前面的過程,又將66H中的字模數據送到了67H之中了。依次類推,將上述過程重復56次,片內RAM 30H中的字模數據就被送到了31H之中,至此,整個字模數據塊便整體向上移動了一個地址空間。之后,還必須執行MOV 30H,68H,將68H中的字模數據送入30H之中,實現字模數據塊的首尾相接。
4.短轉移指令
為了實現連續滾動顯示,當完成調入字模數據、掃描顯示和數據上移之后,需要CPU再返回掃描顯示處循環執行掃描和數據塊上移的程序,所以在數據塊移動程序的最后還要安放一條短轉移指令SJMP(指令的機器碼是80H)。執行此指令后,程序就轉移至掃描程序的入口處,開始又一次的掃描和數據塊上移操作。例如:SJMP 0051H,即程序轉移至程序存儲器中地址為0051H處,執行該處程序。指令SJMP rel的轉移范圍為-128至+127。
五、本文涉及的其他指令
算術操作類指令:
INC Rn:執行結果是將寄存器Rn中的內容加1。
DEC Rn:執行結果是將寄存器Rn中的內容減1。
六、程序清單
地址 | 機器碼 | 指令 | 注釋 | |
0000 | 02003B | AJMP | 003BH | ;轉至主程序 |
003B | 758000 | MOV | P0,#00H | ;初始化 |
003E | 75A000 | MOV | P2,#00H | ;關閉顯示 |
0041 | 7938 | MOV | R1,#38H | ;調入字模數據 |
0043 | 7867 | MOV | R0,#67H | ;設字模存放起始地址 |
0045 | 756901 | MOV | 69H,#01H | ;送字模數據表起始地址 |
0048 | 120078 | LCALL | 0078H | ;調查表子程序 |
004B | F6 | MOV | @R0,A | ;字模送入RAM |
004C | 18 | DEC | R0 | ; |
004D | 0569 | INC | 69H | ; |
004F | D9F7 | DJNZ | R1 | ;未完,返回 |
0051 | 7D18 | MOV | R5,#18H | ;置掃描時間常數 |
0053 | 7EFF | MOV | R6, #FFH | ; |
0055 | 7F08 | MOV | R7,#08H | ;置掃描列數 |
0057 | 7860 | MOV | R0,#60H | ;設顯示緩沖區低地址 |
0059 | 7480 | MOV | A, #80H | ;送列掃描起始控制字 |
005B | 8680 | MOV | P0,@R0 | ;字模數據輸出至顯示屏 |
005D | F5A0 | MOV | P2,A | ;輸出列控制字至顯示屏 |
005F | 08 | INC | R0 | ;準備字模的下一字節 |
0060 | 03 | RR | A | ;準備掃描下一列 |
0061 | DFF8 | DJNZ JNZ | ;未完返回 | |
0063 | DEF0 | DJNZ | R6 | ; |
0065 | DDEC | DJNZ | R5 | ; |
0067 | 7F38 | MOV | R7,#38H | ;置字模數據移動總字節數 |
0069 | 7868 | MOV | R0,#68H | ;設塊移動暫存單元地址 |
006B | 7967 | MOV | R1,#67H | ;設移動塊超始地址 |
006D | E7 | MOV | A,@R1 | ; |
006E | F6 | MOV | @R0,A | ;向上移動一個地址 |
006F | 18 | DEC | R0 | ;轉向下一個字節 |
0070 | 19 | DEC | R1 | ; |
0071 | DFFA | DJNZ | R7 | ;不足56個字節繼續移動 |
0073 | 856830 | MOV | 30H,68H | ;首尾相接 |
0076 | 80D9 | SJMP | 0051H | ;跳轉至0051H |
0078 | E569 | MOV | A,69H | ;取查表增址值 |
007A | 83 | MOVC | A,@A+PC | ;取字模數據 |
007B | 22 | RET | ;子程序返回 |
007C | 7E 42 | 7E 00 | FF 28 44 | 82 字模數據表 |
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顯示器相關文章:led顯示器原理
評論