16×16LED点阵滚动显示屏
一、硬件原理图
二、汇编程序:
;多字移动
;一个字占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
;(a3b2H)(2)(8002)
DB 00H, 00H, 00H, 00H, 00H, 00H, 18H, 1eH
DB 20H, 22H, 40H, 42H, 40H, 82H, 40H, 82H
DB 41H, 02H, 41H, 02H, 21H, 02H, 1eH, 0eH
DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H
;(a3b3H)(3)(8003)
DB 00H, 00H, 00H, 00H, 00H, 00H, 30H, 0cH
DB 40H, 02H, 40H, 02H, 40H, 02H, 41H, 02H
DB 41H, 0
16×16LED点阵滚动显示屏 来自淘豆网m.daumloan.com转载请标明出处.