新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用AT89C51控制活動字符顯示屏

        用AT89C51控制活動字符顯示屏

        作者: 時間:2011-02-21 來源:網絡 收藏
        字符和圖形的顯示,在各種智能設備或系統中是常常用到的,如實現人機對話的功能菜單提示液晶屏,或是以輸出文字信息為主要功能的大型LED廣告屏等。本文通過利用LED點陣模塊實現活動字符顯示的控制電路,向大家介紹片內RAM的使用、累加器循環移位等字符的字模設計原理指令。
          一、電路功能及顯示內容
          本電路由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顯示器原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 福安市| 普安县| 哈巴河县| 益阳市| 德保县| 隆尧县| 石泉县| 区。| 灵川县| 桓仁| 明水县| 汝南县| 浪卡子县| 怀远县| 永泰县| 南阳市| 定边县| 大姚县| 陇南市| 宜兰市| 洮南市| 石林| 修文县| 德州市| 长海县| 南开区| 丹凤县| 怀集县| 正蓝旗| 金秀| 灌南县| 东城区| 陕西省| 沭阳县| 施秉县| 大港区| 泰兴市| 获嘉县| 隆安县| 喜德县| 石屏县|