;多字移動(dòng)
;一個(gè)字占32個(gè)字節(jié),1K可以存放1K=1024字節(jié)/32=32個(gè)字,C51=4K=128個(gè)字,C52=8K=256個(gè)字。
;但程序占用160個(gè)字節(jié)(相當(dāng)于5個(gè)字的空間),最終可以顯示的字為C51=123個(gè)字,C52=251個(gè)字。
;超過(guò)后單片機(jī)將存儲(chǔ)不下。 ORG 000H
JMP MIAN ORG 030H
MIAN:MOV P3,#00 ;關(guān)閉端口
MOV P1,#0FFH
MOV P0,#00
MOV P2,#00 CALL DELAY ;延時(shí)1ms MOV R5,#2 ;移動(dòng)列的數(shù)量(列數(shù)乘2) MOV A,#151 ;顯示幾個(gè)字
MOV B,#32 ;一個(gè)字=32個(gè)碼
MUL AB
MOV 22H,A ;存放1~8個(gè)字的數(shù)量
MOV 23H,B ;存放8的倍數(shù)個(gè)字的數(shù)量
;如50個(gè)字:50×32=1600=0640H,則DPH處為06H=6,DPL處為40H=64
;簡(jiǎn)單算法:50÷8=6余2,6為DPH處數(shù),余的2×32=64為DPL數(shù) MOV DPTR,#TABLE1 ;賦查表初址
MOV R0,DPL ;保存DPTR初值,R0、R1記錄取碼進(jìn)度
MOV R1,DPH
MOV 20H,DPL ;20H、21H保持DPTR初值不變
MOV 21H,DPH LOOP: MOV R7,#5 ;每屏停留時(shí)間 L1: MOV R6,#16 ;每屏16個(gè)碼
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 ;掃描延時(shí)1ms MOV P0,#00 ;清除屏幕
MOV P2,#00 DJNZ R6,L16 ;1屏是否完成?
DJNZ R7,L1 ;每屏停留時(shí)間是否到了? ; MOV R0,DPL ;如字不需移動(dòng),用該指令
; MOV R1,DPH MOV A,R0 ;如字需移動(dòng),用該指令
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個(gè)字后DPH將加1,導(dǎo)致判斷失誤
MOV A,DPH
SUBB A,21H ;已顯示字的數(shù)量(乘8)
CJNE A,23H,LOOP ;DPH中的字是否完成? CLR C
MOV A,DPL
SUBB A,20H ;已顯示字的數(shù)量
CJNE A,22H,LOOP ;DPL中的字是否完成? JMP MIAN DELAY:MOV R2,#2 ;延時(shí)1ms
D1 :MOV R3,#248
DJNZ R3,$
DJNZ R2,D1
RET
TABLE1:
;至拾字時(shí)為100個(gè)字,共150個(gè)字,用于測(cè)試。 ;(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 |