📄 中文显示.asm
字号:
;*******************************************************************
;* 中文显示广告牌程序 *
;* amygse *
;* 2004.6.5 *
;*******************************************************************
;21H~26H--显示内容存储单元
;B -----每次移入内存单元的数据要左移的次数
;27H------寻址偏址
;28H-----每次移入内存单元的数据要左移的次数临时值
;29H-----扫描还剩几行寄存
;2AH-----左移速度
;2CH-----应该选通那一行寄存
;30H,31H-----延时同步修正寄存器
;堆栈入口40H
;*******************************************************************
SHOW1 EQU 21H ;第1位| ;显示内容存储单元(左边数起)本电
SHOW2 EQU 22H ;第2位| ;路为显示5个字符(即两个半字)的,
SHOW3 EQU 23H ;第3位| ;所以需要6个字节的显存。
SHOW4 EQU 24H ;第4位|
SHOW5 EQU 25H ;第5位|
SHOW6 EQU 26H ;第6位|
;*******************************************************************
MODE EQU 20H ;模式选择:1(红)、2(绿)、3(橙)、4(红+绿)、5(绿+红)
SPEED EQU 28H ;左移速度
TIME EQU 29H ;每次移入内存单元的数据要左移的次数
TIME_TEMP EQU 2AH ;每次移入内存单元的数据要左移的次数临时值
DPTR_PZ EQU 2BH ;寻址偏址
REMAIN EQU 2CH ;扫描帧还剩几行寄存
CH_LINE EQU 2DH ;应该选通那一行寄存
STR_MN EQU 2EH ;字符个数N的M倍存放单元
STR_N EQU 2FH ;字符个数N存放单元
;*******************************************************************
BIT1 BIT P1.0
BIT2 BIT P1.1
BIT3 BIT P1.2
BIT4 BIT P1.3
RXD1 BIT P1.4 ;红色串行内容发送
TXD1 BIT P1.5 ;红色串行CP端
RXD2 BIT P1.6 ;绿色串行内容发送
TXD2 BIT P1.7 ;绿色串行CP端
EN BIT P3.7 ;EN为高电平,关闭显示端口;EN为低电平时,开放显示端口
;********************************************************************
;*********中断入口程序****************
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
;***************主程序****************
START: MOV MODE,#1 ;设开始为模式1
MAIN: SETB EN ;关显示端口
MOV SP,#40H ;堆栈首址
MOV R0,#SHOW1 ;初使化寄存显示单元
MOV R1,#16 ;21H~2DH单元清零
CLR A
LOOP0: MOV @R0,A
INC R0
DJNZ R1,LOOP0
LCALL STRING
MOV A,MODE ;指向下一种模式
RL A
MOV MODE,A
JB ACC.3,START ;模式的选择,有5种,红,绿,橙,绿+红,红+绿,现选前4种。
LJMP MAIN ;4种模式显示完,重新循环显示内容
;*****左移显示汉字程序************
STRING: MOV DPTR,#TAB ;赋查表初址
MOV STR_MN,#1
LOOP2: MOV STR_N,#12 ;共有多少个字符,一个汉字等于两个字符,个数值为实际字符个数减5
LOOP1: LCALL PLAY ;运行PLAY一次后,内容左移显示八次,寻址偏址不变.
CLR C
MOV A,DPL ;字符表格地址加10H,指向下一个字符
ADD A,#10H
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A
DJNZ STR_N,LOOP1
DJNZ STR_MN,LOOP2
RET
;*********左移一个字符程序**************
PLAY: MOV TIME, #01H ;每次移入内存单元的数据要左移次数次值
NLINE: MOV SPEED,#01H ;左移速度
GG: LCALL LINE16 ;扫描显示1帧
DJNZ SPEED,GG
MOV A,TIME ;扫描完一帧,显示下一帧左移的次数要加1
INC A
MOV TIME,A
CJNE A,#9,NLINE ;如果TIME中的数等于9就完成1个字符的显示,否则继续循环.
RET
;*********扫描显示1帧行子程序******************
;运行完该子程序后寻址偏址不变
LINE16: MOV REMAIN,#10H ;扫描的行数
FF: LCALL LINE1 ;扫描显示1行子程序
DJNZ REMAIN,FF
MOV A,DPTR_PZ
; CLR C
SUBB A,#10H ;寻址偏址减10使之退出应该子程序后偏址不变
MOV DPTR_PZ,A
RET
;*********扫描显示一行子程序******************
LINE1: MOV TIME_TEMP,TIME ;显示内容要左移几次TIME重赋值给TIME_TEMP临时单元
LCALL SEND ;发送串行口子程序
LCALL XH ;选通行子程序
CLR EN ;开显示端口,显示延时开始
LCALL DL800US ;延时显示1ms
LCALL MSTR ;将显示内容移入内存单元21H~26H ,跳出后27H加1
EE: LCALL ZY ;左移一行子程序
DJNZ TIME_TEMP,EE ;要左移(TIME)次
LCALL ZYXZ ;左移速度同步修正
SETB EN ;关显示端口,显示延时结束
RET
;***********左移速度同步修正子程序********--
;总时间=(显示一次的时间)+(9-左移次数) X (修正时间)
;如果这一行要左移2次,那么修正延时就在调用7次
;该修正程序目的是使字体左移速度匀速
ZYXZ: MOV R0,TIME
MOV A,#09H
SUBB A,R0
MOV R0,A
AA: LCALL DL22US
DJNZ R0 ,AA
RET
;*******显示内容移入内存单元子程序*********
MSTR: MOV R0,#SHOW1
MOV R4,#06H
MOV A, DPTR_PZ
BB: MOVC A, @A+DPTR
MOV @R0,A
MOV A,DPTR_PZ
ADD A,#10H
MOV DPTR_PZ,A
INC R0
DJNZ R4,BB
MOV A,DPTR_PZ
SUBB A,#5FH
MOV DPTR_PZ,A
RET
;**********左移一位子程序**************
;21H~26H存入显示内容,
;R0为显示未址,R2为移出高位个数
ZY: MOV R0, #SHOW6 ;显示单元未址
MOV R2, #6H ;移出高位个数
CLR C
CC: MOV A, @R0
RLC A ;将后一字节的最高位移到C里,再移到前一字节的最低位
MOV @R0, A
DEC R0
DJNZ R2, CC
CLR C
RET
;**********发送数据到串口子程序***************
SEND: MOV R0,#SHOW5
MOV R5,#5H
LOOP: MOV R2,#08H
MOV A,@R0
LCALL DD
DEC R0
DJNZ R5,LOOP
CLR C
RET
DD: MOV A,MODE
JB ACC.1,DD1
JB ACC.2,DD2
JB ACC.3,DD3
JB ACC.4,DD4
JB ACC.5,DD5
RET
DD1: CLR TXD1
SETB TXD2
RRC A
MOV RXD1,C
SETB TXD1
SETB TXD2
DJNZ R2,DD1
RET
DD2: CLR TXD2
SETB TXD1
RRC A
MOV RXD2,C
SETB TXD2
SETB TXD1
DJNZ R2,DD2
RET
DD3: CLR TXD1
CLR TXD2
RRC A
MOV RXD1,C
MOV RXD2,C
SETB TXD1
SETB TXD2
DJNZ R2,DD3
RET
DD4: CLR TXD1
CLR TXD2
RRC A
MOV RXD1,C
CPL C
MOV RXD2,C
SETB TXD1
SETB TXD2
DJNZ R2,DD4
RET
DD5: CLR TXD1
CLR TXD2
RRC A
MOV RXD2,C
CPL C
MOV RXD1,C
SETB TXD1
SETB TXD2
DJNZ R2,DD5
RET
;*******选通行子程序*****************
XH: MOV CH_LINE,REMAIN ;REMAIN存运行剩几行数值
MOV A,#0FH
; CLR C
SUBB A,CH_LINE ;16列减剩余行数得现在应该扫描行
MOV P1,A ;送P1口
RET
;******800US延时子程序*****************
DL800US: MOV R6,#1dH
DL1: MOV R5,#18H
DL2: DJNZ R5,DL2
DJNZ R6,DL1
RET
;******22US延时子程序*****************
DL22US: MOV R6,#19
DL3: DJNZ R6,DL3
NOP
RET
TAB:
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -