📄 display.asm
字号:
ORG 0000H
LJMP 0100H ;开机或复位后,跳转至100H单元执行程序
ORG 0100H
INIT: MOV A,#0
MOV DPTR,#0DF00H ;ACK标志清零
MOVX @DPTR,A
MOV DPTR,#0FD00H ;初始化行复位端口
MOVX @DPTR,A
MOV DPTR,#0FE00H ;初始化行置位端口
MOVX @DPTR,A
MOV A,#0FFH
MOV DPTR,#0FB00H
MOVX @DPTR,A ;初始化列选择板1端口
MOV DPTR,#0F700H
MOVX @DPTR,A ;初始化列选择板2端口
MOV DPTR,#0EF00H
MOVX @DPTR,A ;初始化列选择板3端口
LOGO: MOV R0,#40H ;加载显示缓存区指针
MOV R1,#0 ;R1是显示数据指针
MOV R2,#60 ;开机画面存储区有60字节
LOG1: MOV A,R1
MOV DPTR,#400H ;加载开机画面存储区起始地址
MOVC A,@A+DPTR ;查表法得到显示点阵数据
XRL A,#0101010B ;此项由磁翻转显示器特性决定
MOV @R0,A ;送点阵数据至显示缓存区
INC R0 ;显示缓存指针增1
INC R1 ;显示数据指针增1
DJNZ R2,LOG1 ;若R2不为0,则继续读取显示点阵数据
MOV R0,#40H ;加载显示缓存指针供刷新显示
LCALL BLOCK1 ;转显示驱动程序
LCALL BLOCK2
LCALL BLOCK3
TEST: MOV DPTR,#0BF00H ;加载DATA标志端口地址
TES1: MOVX A,@DPTR ;读DATA标志
ANL A,#01H ;屏蔽A寄存器的高7位
JZ TES1 ;若DATA标志为低,再读DATA标志
MOV A,#0FFH
MOV P1,A ;P1口读入数据时先置全“1”
MOV A,P1 ;读P1口数据
CJNE A,#0F0H,TES1 ;若读入数据不为F0H,则等待
MOV DPTR,#0DF00H ;加载ACK标志端口地址
MOV A,#01H ;
MOVX @DPTR,A ;将ACK标志置高
CALL DELAY1S ;延时1秒
MOV A,#0
MOVX @DPTR,A ;将ACK清零
MAIN: MOV R0,#30H ;加载接受缓存区起始地址
MAI1: MOV DPTR,#0BF00H ;加载DATA标志端口地址
MAI2: MOVX A,@DPTR ;读入主控制器数据标志
ANL A,#01H ;屏蔽A高7位
JZ MAI2 ;查询DATA信号是否为高
MOV A,#0FFH
MOV P1,A ;P1口要读入数据,先置全“1”
MOV A,P1 ;读入P1口的数据
PUSH A ;压入最新接收的数据
MOV @R0,A ;将接收数据写入接收数据缓冲区
INC R0 ;指向下一个缓冲存储单元
MOV A,#01H
MOV DPTR,#0DF00H ;加载ACK端口地址
MOVX @DPTR,A ;ACK端口置高
MOV DPTR,#0BF00H ;加载DATA标志端口地址
MAI3: MOVX A,@DPTR
ANL A,#01H ;屏蔽高7位数据
JNZ MAI3 ;若DATA未变低,等待
MOV A,#0
MOV DPTR,#0DF00H ;加载ACK端口地址
MOVX @DPTR,A ;ACK端口置低
POP A ;弹出读入的数据
CJNE A,#0FFH,MAI1 ;若不是0FFH结束符,读下一数据
CONVERT:MOV DPTR,#0500H ;加载转换码表地址指针
MOV R0,#30H ;加载接收缓存地址指针
CONV1: INC R0 ;接受缓存指针加1
MOV A,@R0 ;取一个接受缓存中的数据
CJNE A,#0FFH,CONV2 ;不是0FFH结束符,则继续转换
LJMP DECODE ;若已经结束,转显示译码
CONV2: MOVC A,@A+DPTR ;取转换码表数据
MOV @R0,A ;将转换后的数据送回接受缓存
LJMP CONV1 ;继续接受缓存下一字节转换
DECODE: MOV DPTR,#0600H ;加载显示字库地址指针
MOV R0,#30H ;加载接收缓存地址指针
MOV R1,#40H ;加载显示缓存地址指针
DECO1: INC R0 ;接收缓存指针加1
MOV A,@R0 ;取一个接收缓存中的数据
CJNE A,#0FFH,DECO2 ;不是FFH结束符,则继续译码
LJMP MODE ;若为FFH结束符,转驱动显示
DECO2: MOV R2,#4 ;一个字符字库占用5字节
CAL: ADD A,@R0
DJNZ R2,CAL ;计算字库存储区偏移量
MOV R2,#5 ;一个字符字库占用5字节
GET: PUSH A ;保护偏移量
MOVC A,@A+DPTR ;取ROM字库中点阵显示数据
XRL A,#0101010B ;
MOV @R1,A ;保存点阵显示数据至显示缓冲区
POP A ;恢复偏移量
INC A ;取下一字节字库数据
INC R1 ;显示缓存指针加1
DJNZ R2,GET ;不到5字节,继续取字库数据
LJMP DECO1 ;开始下一字符译码
MODE: MOV R0,#40H ;加载显示缓存起始地址
MOV R1,#30H ;判断显示模式
MOV A,@R1
CJNE A,#0F1H,NEXT1
LJMP MODE1 ;F1H表示显示模式一
NEXT1: CJNE A,#0F2H,NEXT2 ;F2H表示显示模式二
LJMP MODE2
NEXT2: CJNE A,#0F3H,NEXT3 ;F3H表示显示模式三
LJMP MODE3
NEXT3: CJNE A,#0F4H,NEXT4
LJMP MODE4 ;F4H表示显示MODE4
NEXT4: LJMP MODE5 ;F5H-->MODE5
MODE1: LCALL BLOCK1 ;刷新第一块显示板
LJMP MAIN ;返回主程序
MODE2: LCALL BLOCK1 ;刷新第1块显示板
LCALL BLOCK2 ;刷新第2块显示板
LJMP MAIN ;返回主程序
MODE3: LCALL BLOCK1 ;刷新第1块显示板
LCALL BLOCK2 ;刷新第2块显示板
LCALL BLOCK3 ;刷新第3块显示板
LJMP MAIN ;返回主程序
MODE4: LCALL BLOCK3 ;单独刷新第3块显示板
LJMP MAIN ;返回主程序
MODE5: MOV R0,#68H ;
MOV R1,#80H
MOV R2,#20
MOD5A: MOV A,@R0
MOV @R1,A
MOV A,#0FFH
XRL A,#0101010B
MOV @R0,A
INC R0
INC R1
DJNZ R2,MOD5A
MOV R2,#40
MOD5B: MOV A,#0
XRL A,#0101010B
MOV @R1,A
INC R1
DJNZ R2,MOD5B
ALTER: MOV R0,#40H
LCALL BLOCK1
LCALL BLOCK2
LCALL BLOCK3
MOV DPTR,#0BF00H
MOVX A,@DPTR
ANL A,#01H
JNZ J2M
LCALL DELAY5S
MOV R0,#80H
LCALL BLOCK1
LCALL BLOCK2
LCALL BLOCK3
MOV DPTR,#0BF00H
MOVX A,@DPTR
ANL A,#01H
JNZ J2M
LCALL DELAY5S
LJMP ALTER
J2M: LJMP MAIN
BLOCK1: MOV R1,#0 ;列选择线指针置零,从第0列开始刷新
BLO1: MOV A,@R0 ;取一列的行点阵显示数据
PUSH A ;保护行置位数据
MOV DPTR,#0FE00H ;加载行置位端口地址
MOVX @DPTR,A ;行置位数据送行置位口
MOV DPTR,#0FB00H ;加载第1块列驱动板地址
MOV A,R1 ;列指针内容送A
MOVX @DPTR,A ;选中相应的列选择线
LCALL DELAY
MOV A,#0FFH ;送无效字
MOVX @DPTR,A ;以关闭列译码器
MOV A,#0
MOV DPTR,#0FE00H ;加载行置位端口地址
MOVX @DPTR,A ;行置位口清零
LCALL DELAY
POP A ;恢复行置位数据
CPL A ;取反得到行复位数据
MOV DPTR,#0FD00H ;加载行复位端口地址
MOVX @DPTR,A ;送行复位数据
MOV DPTR,#0FB00H ;加载第1块列驱动板地址
MOV A,R1
MOVX @DPTR,A ;选中列驱动线
LCALL DELAY
MOV A,#0FFH ;送无效字
MOVX @DPTR,A ;关闭列译码器
MOV A,#0
MOV DPTR,#0FD00H ;加载行复位端口地址
MOVX @DPTR,A ;行置位口清零
LCALL DELAY ;
INC R1 ;修改列驱动选择指针
INC R0 ;修改显示缓存指针
CJNE R1,#20,BLO1 ;不满二十列则继续刷新
RET ;返回主程序
BLOCK2: MOV R1,#0 ;列选择线指针置零,从第0列开始刷新
BLO2: MOV A,@R0 ;取一列的行点阵显示数据
PUSH A ;保护行置位数据
MOV DPTR,#0FE00H ;加载行置位端口地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -