?? 8x8.txt
字號:
LED點陣顯示仿真之由淺入深--8X8,16X16,24X24LED點陣流動顯示
一直以來,對LED點陣顯示很感興趣,特別是流動點陣顯示。論壇里有不少例子,可是不知為什么, 在我的電腦上大多無法正常運行。有的一運行就S機,能運行的,也是字符不清。于是,只好自己動手。 先試作了8X8點陣。由于8X8的點太少,只好做數字顯示, 從0 ~9流動,效果還不錯。有了8X8的經驗,對流動顯示的原理已經了解,又試了16X16的,覺得也不難。但16X16的點仍嫌少了,緊接著又做了個24X24的。效果不錯,顯示很流暢。下面就談談我的學習體會,還請高手多多指導。
一、8X8
初學點陣仿真,常點不亮LED 。首先,要保證點陣的極性應有正確的接線。下面的簡單方法可判斷點陣的邏輯引腳。
運行proteus,在編輯區里放上一個8X8LED,如MATRIX-8x8-GREEN。在某些引腳上接上電源和地,試試能不能點亮。8X8默認是這樣的,如圖:按習慣接法,上面接電源,下面接地,不亮。垂直翻轉,再接上電源和地,就可以點亮了,如圖:如果是做左移顯示,可再左旋90°,顯示90即可。如圖,這里很明顯地看出,左邊引腳是行控制,右邊引腳是列控制。畫線路圖時,點陣就保持這個方向。
然后就可以畫線路圖了。
由于點陣引線較多,特別是以后做24X24點陣,所以布線方式不用連線,而用終端加上網絡標號,這樣可以使畫面簡潔明了。
連續標號的快捷畫法,我以前有帖子介紹過。這里還是再說說。
proteus有一個很好用的PAT(Property Assignment Tool),即屬性分配工具。可以用來做快捷標注,當然還可以用作其它操作。
如下動畫:
這樣,一個線路圖很快就可以作好。
下面,就可以寫程序的源文件了。
點擊菜單\Source,下拉菜單第一條Add/Remove Source Files,按鍵New,在跳出的對話框里寫上新文件名,如8X8.asm,打開。提示這個文件不存在,要創建嗎?是。 然后點Code Gereration tool小箭頭, 選ASM51 ,點OK。然后,菜單\Source,看到多了個8X8.asm,點擊,出現proteus自帶的匯編編輯器,就可以在里面寫代碼了。如下:
;8X8LED點陣流動顯示
;逐列、逆向(低位開始)掃描
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV DPTR,#TAB ;字碼表初址賦值
MOV R1,#0FEH ;列控制碼
MOV R3,#8 ;列數
MOV R4,#88 ;移動“ ”及“0~9”11個字符,共88列
CM: MOV R5,#10 ;每屏反復顯示10次
MOV R3,#8 ;列數
C1: MOV R2,#0 ;取碼指針
C8: MOV P3,#0FFH ;關顯示
MOV A,R2 ;
MOVC A,@A+DPTR ;取當前列的顯示字碼的一個字節
MOV P0,A ;送1~8行控制口
INC R2
MOV A,R1
MOV P3,A ;送列控制碼
ACALL D5MS ;顯示5MS
RL A ;列控制碼左移,顯示下一列
MOV R1,A
DJNZ R3,C8 ;未顯示8 列,繼續
DJNZ R5,C1 ;未顯示10次,繼續
INC DPL ;一屏反復顯示10次完,字碼表初值加1
DJNZ R4,CM ;88列未移動完,繼續
AJMP MAIN ;88列顯示完,返回,重新從“ ”開始顯示
D5MS: MOV R6,#10
MOV R7,#248
DJNZ R7,$
DJNZ R6,$-4
RET
TAB: DB 00H,00H,00H,00H,00H,00H,00H,00H ;
DB 00H,00H,00H,7EH,81H,81H,81H,7EH ;0
DB 00H,00H,00H,00H,00H,82H,0FFH,80H ;1
DB 00h,00h,00h,0C6H,0A1H,91H,89H,0C6H ;2
DB 00H,00H,00H,42H,81H,81H,99H,66H ;3
DB 00H,00H,00H,1FH,10H,0FFH,10H,10H ;4
DB 00H,00H,00H,4FH,89H,89H,89H,79H ;5
DB 00H,00H,00H,7EH,89H,89H,89H,72H ;6
DB 00H,00H,00H,01H,01H,0F9H,05H,03H ;7
DB 00H,00H,00H,76H,89H,89H,89H,76H ;8
DB 00H,00H,00H,4EH,91H,91H,91H,7EH ;9
END
程序的基本原理:P0口送1~8行掃描碼,P3口送列控制碼。顯示完一列,列控制碼左移,顯示第2列。一直到8 列顯示完,即顯示了一屏。重新從1~8列,反復顯示10次,以免字符一閃而過。接著顯示下一屏,下一屏的取字指針的地址加1,(INC DPL)即該屏第1 列是上屏的第2 列,也就是相當于左移一列。直到11個字符( 包括“ ”字符)全部顯示后,再從新開始。這樣,就實現了移動顯示。
接著再繼續說說,怎么將ASM文件轉換成HEX文件。
上面在編輯器里寫好ASM文件后,菜單\Source\Define Code Gereration Tools,按對話框填寫,點OK。菜單\Source\Build All,點擊,編譯完成。接著,左鍵再右鍵,在原理圖內的單片機屬性里加載HEX文件,。不過也可以不用左鍵再右鍵。可以這樣,鼠標箭頭移到單片機,按CTRL+E,也會跳出那個對話框的。
當然proteus自帶的編輯器也有不少遺憾,首先它只支持匯編,不支持C。 另外,有朋友發現它不支持一些特殊的指令,象程序中的DJNZ R7,$ ,它就不識別$,還有其它不識別的。不過,不知為什么,現在我編譯時很正常,都沒沒發現什么問題。所以,很久都不用keil了。連調試也不用keil,可參考我以前的帖子。
二、16X16
16X16點陣,是用4 個8*8組成。繼續畫線路。
為了實現左移,仍用逐列掃描。與8X8 不同的是,16X16點陣是先顯示1~8列(左半部上下2 個8X8LED)再顯示9~16列(右半部上下2個8X8LED),這樣,左上下的列接COL0~7,右上下列接COL8~15,即左(右)半上下列的8 個引腳并聯。而左(右)半的行引腳分別接ROW0~15,即左右行引腳并聯。
先在編輯區放置一個8X8,加上終端,接好終端和各引腳。再復制3 個8X8(包括終端、連線),成16X16 點陣。用PAT工具分別給各個終端加上網絡標號。動畫如下: 16X16LED點陣做好 。
程序與8X8不同的是,因為每個顯示碼只有8 位,而點陣是16位,所以先送第1 列上半的顯示碼,取碼指針加1,再送第1 列下半顯示碼,取碼指針再加1 。而一屏(16X16點陣)顯示完后,字碼表初值應加2,使本屏相當于上一屏左移一列,實現向左流動。
程序如下 :
;16X16LED點陣流動顯示
;逐列、逆向(低位開始)掃描
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV DPTR,#TAB ;字碼表初址賦值
MOV R1,#00H ;列控制碼
MOV R3,#16 ;列數
MOV R4,#96 ;移動“ ”及“單片機仿真”6個字符,共96列
CM: MOV R5,#5 ;每屏反復顯示5次
MOV R3,#16 ;列數
C1: MOV R2,#0 ;取碼指針
C16: MOV P0,#00H
MOV P2,#00H ;關顯示
CLR P3.0
MOV A,R2
MOVC A,@A+DPTR ;取當前列顯示字碼的第一個字節
MOV P0,A ;送1~8行控制口
INC R2
MOV A,R2
MOVC A,@A+DPTR ;取當前列的顯示字碼的第二個字節
MOV P2,A ;送9~15行控制口
INC R2
MOV P1,R1 ;送列控制碼
INC R1
ACALL D1MS ;顯示1MS
ACALL D1MS
DJNZ R3,C16
MOV R3,#16
DJNZ R5,C1 ;未顯示5次,繼續
INC DPTR ;一屏反復顯示5次完,字碼表初值加2
INC DPTR
DJNZ R4,CM ;96列未移動完,繼續
AJMP MAIN ;96列移動完,返回,重新從“ ”開始顯示
D1MS: MOV R6,#2
MOV R7,#248
DJNZ R7,$
DJNZ R6,$-4
RET
TAB: DB 000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ;
DB 000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ;" ",
DB 000H ,000H ,000H ,008H ,000H ,008H ,0E0H ,008H ,0F4H ,00DH ,054H ,005H ,0F4H ,07FH ,0F8H ,07FH ;
DB 01EH ,005H ,0FEH ,005H ,0FAH ,006H ,010H ,002H ,000H ,006H ,000H ,004H ,000H ,000H ,000H ,000H ;"單",0
DB 000H ,000H ,000H ,000H ,000H ,010H ,000H ,01CH ,0FCH ,00FH ,0FCH ,003H ,040H ,002H ,040H ,002H ;
DB 07EH ,07FH ,03EH ,07FH ,020H ,000H ,020H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ,000H ;"片",1
DB 000H ,008H ,040H ,00CH ,040H ,006H ,0DCH ,03FH ,0FEH ,03FH ,022H ,011H ,020H ,01DH ,0F0H ,00FH ;
DB 0F0H ,003H ,0F0H ,00FH ,0F0H ,01FH ,010H ,010H ,000H ,01CH ,000H ,01CH ,000H ,010H ,000H ,000H ;"機",2
DB 000H ,001H ,080H ,001H ,0C0H ,000H ,0F0H ,03FH ,0FCH ,03FH ,04CH ,018H ,040H ,00CH ,040H ,027H ;
DB 0CCH ,063H ,0ECH ,079H ,028H ,01FH ,020H ,007H ,020H ,000H ,020H ,000H ,000H ,000H ,000H ,000H ;"仿",3
DB 000H ,000H ,000H ,010H ,000H ,098H ,000H ,0C8H ,0E8H ,06FH ,0E8H ,03FH ,07CH ,01BH ,07EH ,00AH ;
DB 0E6H ,03FH ,0E4H ,07FH ,004H ,06CH ,000H ,004H ,000H ,004H ,000H ,000H ,000H ,000H ,000H ,000H ;"真",4
END
三、24X24
24X24點陣是由9個8X8LED點陣組成,組成方法同16點陣。
掃描原理仍采用逐列掃描。由于24行、24列,硬件有所不同。為了方便,由P0、P2和P3口逐列輸出本列的行掃描控制碼,共24位。列控制由138三八譯碼器輸出。具體如何實現,這里就不再贅述,大家可參考上傳附件中的設計文件和匯編文件。
文中三個點陣仿真均由proteus6.9SP4通過,上傳附件包括三個仿真的DSN、ASM及HEX文件。
另外,說明一點,8X8點陣字模是我自己作的。而漢字字模是根據 朋友的帖子 里下載的軟件作成。點陣格式:陰碼,取模方式:逐列式,取模走向:逆向。軟件非常好用, 這里再次感謝 的提供。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -