;多字移動
;一個字占32個字節,1K可以存放1K=1024字節/32=32個字,C51=4K=128個字,C52=8K=256個字。
;但程序占用160個字節(相當于5個字的空間),最終可以顯示的字為C51=123個字,C52=251個字。
;超過后單片機將存儲不下。 ORG 000H
JMP MIAN ORG 030H
MIAN:MOV P3,#00 ;關閉端口
MOV P1,#0FFH
MOV P0,#00
MOV P2,#00 CALL DELAY ;延時1ms MOV R5,#2 ;移動列的數量(列數乘2) MOV A,#151 ;顯示幾個字
MOV B,#32 ;一個字=32個碼
MUL AB
MOV 22H,A ;存放1~8個字的數量
MOV 23H,B ;存放8的倍數個字的數量
;如50個字:50×32=1600=0640H,則DPH處為06H=6,DPL處為40H=64
;簡單算法:50÷8=6余2,6為DPH處數,余的2×32=64為DPL數 MOV DPTR,#TABLE1 ;賦查表初址
MOV R0,DPL ;保存DPTR初值,R0、R1記錄取碼進度
MOV R1,DPH
MOV 20H,DPL ;20H、21H保持DPTR初值不變
MOV 21H,DPH LOOP: MOV R7,#5 ;每屏停留時間 L1: MOV R6,#16 ;每屏16個碼
MOV R4,#00 ;掃描指針清零
MOV DPL,R0 ;取碼指針存入DPL
MOV DPH,R1 L16: MOV A,R4 ;掃描指針存入A
MOV P1,A ;掃描輸出
INC R4 ;掃描指針加1 CLR A ;A清零
MOVC A,@A+DPTR ;查表送A
MOV P0,A ;送P0口顯示
INC DPTR ;取碼指針加1 CLR A ;A清零
MOVC A,@A+DPTR ;查表送A
MOV P2,A ;送P2口顯示
INC DPTR ;取碼指針加1 CALL DELAY ;掃描延時1ms MOV P0,#00 ;清除屏幕
MOV P2,#00 DJNZ R6,L16 ;1屏是否完成?
DJNZ R7,L1 ;每屏停留時間是否到了? ; MOV R0,DPL ;如字不需移動,用該指令
; MOV R1,DPH MOV A,R0 ;如字需移動,用該指令
ADD A,R5 ;如大于256,C=1
MOV R0,A
JNC DP
INC R1
DP: MOV A,20H ;DPL初值
ADD A,22H ;如大于256,C=1。因DPL初值在90H以上,顯示4個字后DPH將加1,導致判斷失誤
MOV A,DPH
SUBB A,21H ;已顯示字的數量(乘8)
CJNE A,23H,LOOP ;DPH中的字是否完成? CLR C
MOV A,DPL
SUBB A,20H ;已顯示字的數量
CJNE A,22H,LOOP ;DPL中的字是否完成? JMP MIAN DELAY:MOV R2,#2 ;延時1ms
D1 :MOV R3,#248
DJNZ R3,$
DJNZ R2,D1
RET
TABLE1:
;至拾字時為100個字,共150個字,用于測試。 ;(a3b1H)(1)(8001)
DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H
DB 00H, 00H, 10H, 02H, 20H, 02H, 7fH,0feH
DB 00H, 02H, 00H, 02H, 00H, 00H, 00H, 00H
DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ... ... END |