📄 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 ;初始化列选择板1端口
MOV DPTR,#0EF00H
MOVX @DPTR,A ;初始化列选择板1端口
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,#0450H ;加载转换码表地址指针
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,#0500H ;加载显示字库地址指针
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 ;加载行置位端口地址
MOVX @DPTR,A ;行置位数据送行置位口
MOV DPTR,#0F700H ;加载第2块列驱动板地址
MOV A,R1 ;列指针内容送A
MOVX @DPTR,A ;选中相应的列选择线
LCALL DELAY ;延时5ms
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,#0F700H ;加载第2块列驱动板地址
MOV A,R1
MOVX @DPTR,A ;选中列驱动线
LCALL DELAY ;延时5ms
MOV A,#0FFH ;送无效字
MOVX @DPTR,A ;关闭列译码器
MOV A,#0
MOV DPTR,#0FD00H ;加载行复位端口地址
MOVX @DPTR,A ;行置位口清零
LCALL DELAY
INC R1 ;修改列驱动选择指针
INC R0 ;修改显示缓存指针
CJNE R1,#20,BLO2 ;不满二十列则继续刷新
RET ;返回主程序
BLOCK3: MOV R1,#0 ;列选择线指针置零,从第0列开始刷新
BLO3: MOV A,@R0 ;取一列的行点阵显示数据
PUSH A ;保护行置位数据
MOV DPTR,#0FE00H ;加载行置位端口地址
MOVX @DPTR,A ;行置位数据送行置位口
MOV DPTR,#0EF00H ;加载第3块列驱动板地址
MOV A,R1 ;列指针内容送A
MOVX @DPTR,A ;选中相应的列选择线
LCALL DELAY ;延时5ms
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,#0EF00H ;加载第3块列驱动板地址
MOV A,R1
MOVX @DPTR,A ;选中列驱动线
LCALL DELAY ;延时5ms
MOV A,#0FFH ;送无效字
MOVX @DPTR,A ;关闭列译码器
MOV A,#0
MOV DPTR,#0FD00H ;加载行复位端口地址
MOVX @DPTR,A ;行置位口清零
LCALL DELAY
INC R1 ;修改列驱动选择指针
INC R0 ;修改显示缓存指针
CJNE R1,#20,BLO3 ;不满二十列则继续刷新
RET ;返回主程序
DELAY: MOV R7,#10 ;1ms延时子程序(12MHz)
DEL1: MOV R6,#50
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET
DELAY1s:MOV R7,#15 ;延时1S子程序
DEL1S1: MOV R6,#200
DEL1S2: MOV R5,#125
DEL1S3: DJNZ R5,DEL1S3
DJNZ R6,DEL1S2
DJNZ R7,DEL1S1
RET
DELAY5S:MOV R7,#100 ;延时5S子程序
DEL5S1: MOV R6,#200
DEL5S2: MOV R5,#125
DEL5S3: DJNZ R5,DEL5S3
DJNZ R6,DEL5S2
DJNZ R7,DEL5S1
RET
ORG 0400H ;开机画面存储区
DB 3FH,40H,40H,40H,3FH
DB 3FH,40H,40H,40H,3FH
DB 7CH,12H,11H,12H,7CH
DB 18H,14H,12H,7FH,10H
DB 0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H
DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
ORG 0450H ;ASCII转换码表
DB 24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H
DB 24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H
DB 24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,24H,2DH,24H,24H
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,2CH,24H,24H,24H,24H,24H
DB 24H,0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13H,14H,15H,16H,17H,18H
DB 19H,1AH,1BH,1CH,1DH,1EH,1FH,20H,21H,22H,23H,24H,24H,24H,24H,24H
DB 24H,0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13H,14H,15H,16H,17H,18H
DB 19H,1AH,1BH,1CH,1DH,1EH,1FH,20H,21H,22H,23H,24H,24H,24H,24H,24H
DB 24H,25H,26H,27H,28H,29H,2AH,2BH
ORG 0500H
DB 3EH,51H,49H,45H,3EH ;数字“0”的字库编码
DB 00H,42H,7FH,40H,00H ;数字“1”的字库编码
DB 42H,61H,51H,49H,46H ;数字“2”的字库编码
DB 22H,49H,49H,49H,36H ;数字“3”的字库编码
DB 18H,14H,12H,7FH,10H ;数字“4”的字库编码
DB 2FH,49H,49H,49H,31H ;数字“5”的字库编码
DB 3EH,49H,49H,49H,32H ;数字“6”的字库编码
DB 01H,01H,79H,05H,03H ;数字“7”的字库编码
DB 36H,49H,49H,49H,36H ;数字“8”的字库编码
DB 26H,49H,49H,49H,3EH ;数字“9”的字库编码
DB 7CH,12H,11H,12H,7CH ;英文“A”的字库编码
DB 7FH,49H,49H,49H,36H ;英文“B”的字库编码
DB 3EH,41H,41H,41H,22H ;英文“C”的字库编码
DB 41H,7FH,41H,41H,3EH ;英文“D”的字库编码
DB 7FH,49H,49H,49H,41H ;英文“E”的字库编码
DB 7FH,09H,09H,09H,01H ;英文“F”的字库编码
DB 3EH,41H,41H,51H,32H ;英文“G”的字库编码
DB 7FH,08H,08H,08H,7FH ;英文“H”的字库编码
DB 00H,41H,7FH,41H,00H ;英文“I”的字库编码
DB 20H,40H,40H,40H,3FH ;英文“J”的字库编码
DB 7FH,08H,14H,22H,41H ;英文“K”的字库编码
DB 7FH,40H,40H,40H,40H ;英文“L”的字库编码
DB 7FH,02H,04H,02H,7FH ;英文“M”的字库编码
DB 7FH,04H,08H,10H,7FH ;英文“N”的字库编码
DB 3EH,41H,41H,41H,3EH ;英文“O”的字库编码
DB 7FH,09H,09H,09H,06H ;英文“P”的字库编码
DB 3EH,41H,51H,61H,3EH ;英文“Q”的字库编码
DB 7FH,09H,19H,29H,46H ;英文“R”的字库编码
DB 26H,49H,49H,49H,32H ;英文“S”的字库编码
DB 01H,01H,7FH,01H,01H ;英文“T”的字库编码
DB 3FH,40H,40H,40H,3FH ;英文“U”的字库编码
DB 1FH,20H,40H,20H,1FH ;英文“V”的字库编码
DB 3FH,40H,38H,40H,3FH ;英文“W”的字库编码
DB 63H,14H,08H,14H,63H ;英文“X”的字库编码
DB 03H,04H,78H,04H,03H ;英文“Y”的字库编码
DB 61H,51H,49H,45H,43H ;英文“Z”的字库编码
DB 00H,00H,00H,00H,00H ;渐近条形图亮“0”条
DB 01H,01H,01H,01H,01H ;渐近条形图亮“1”条
DB 03H,03H,03H,03H,03H ;渐近条形图亮“2”条
DB 07H,07H,07H,07H,07H ;渐近条形图亮“3”条
DB 0FH,0FH,0FH,0FH,0FH ;渐近条形图亮“4”条
DB 1FH,1FH,1FH,1FH,1FH ;渐近条形图亮“5”条
DB 3FH,3FH,3FH,3FH,3FH ;渐近条形图亮“6”条
DB 7FH,7FH,7FH,7FH,7FH ;渐近条形图亮“7”条
DB 00H,00H,22H,00H,00H ;冒号“:”字库编码
DB 08H,08H,08H,08H,08H ;短横线“-”字库编码
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -