本文是在上一篇文章基础上的延伸,如果你还不懂单片机控制led的基本原理的话请先看看上一篇文章
https://blog.csdn.net/haohulala/article/details/91372488
有了上一步的基础,我们现在就可以很轻松地开始写滚动显示的程序啦,为了方便起见,我们就写左移显示吧。
part1 如何实现滚动
我们以向左滚动为例,实际上仔细观察后就会发现,想要实现向左滚动就是需要将字形码的起始地址向右偏移,这样汉字左边的部分就会消失,后面的汉字由于偏移就会出现出来。更直观一点说,你可以把屏幕想象成一个窗口,字向左滚动就相当于屏幕向右滚动,也就是起始指针向右偏移。
part2 主程序
;==========
;初始化程序
;==========
MAIN: MOV SP, #5FH ;初始化堆栈指针
MOV IE, #82H ;1000 0010B,表示开总中断和EX1外部中断1
M1: MOV R7, #4H ;****这里控制要显示的字数****
MOV R6, #00H ;这是DPTR的偏移量,这个值不需要修改
M2: ACALL DISPLAY
DJNZ R7, M2
SJMP M1
主程序比step多了一个R6寄存器,用来存放字形码偏移量,赋初值为0
part3 显示程序
;===============================
;显示主程序
;显存为30H开始的32个内存单元
;P0口控制低8位字形码
;P1口控制高8位字形码
;P2口控制字位码
;P2.7口为高电平的时候不选通任何一列
;先送字形码,后送字位码
;然后调用延时子程序后再显示下一列
;显示完一个字后
;================================
DISPLAY:
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
MOV R5, #10H ;一个字显示16次能显示完,每次都向左偏移一个单位
D3: ACALL GET ;先将下一帧送入显存
MOV R4, #10H ;****这里控制循环次数,也就是一个字显示多久****
;初始化部分
D1: MOV R0, #30H ;用作上半部分显示内容指针
MOV R1, #30H+10H;用作下半部分显示内容指针
MOV R2, #10H ;进行显示内容控制
MOV R3, #00H ;用作字位码
CLR A
MOV P0, A
MOV P1, A
SETB P2.7
;显示部分
D2: MOV P0, @R0 ;将低8位字形码送入P0口
MOV P1, @R1 ;将高8位字形码送入P1口
MOV P2, R3 ;将字位码送入P2口
CLR P2.7 ;将P2.7口置0表示可以显示
ACALL DELAY5 ;延时0.5ms
SETB P2.7 ;关闭显示
INC R0
INC R1
INC R3
DJNZ R2, D2
DJNZ R4, D1
DJNZ R5, D3 ;控制一个字显示16次,每次偏移一个单位
POP 05H
POP 04H
POP 03H
POP 02H