📄 16x16_164.asm
字号:
ZISHU EQU 30H ;字数
SHOWTIME EQU 31H ;一个字重复扫描的次数
SAOMIAO EQU 32H ;扫描指针
QUMA EQU 33H ;取码指针
DIS_BUF_C EQU 34H ;缓冲区字数,这里是2
OFFSET EQU 35H ;取码指针偏移量
;********************************************
DIS_BUFL EQU 40H ;显示缓冲低字节区(40H~60H攻32字节)
DIS_BUFH EQU 60H ;显示缓冲高字节区(60H~80H攻32字节)
LOD_BUFL EQU 80H ;加载缓冲低字节区(80H~90H)
LOD_BUFH EQU 90H ;加载缓冲高字节区(90H~A0H)
ORG 0000H
LJMP START
ORG 0100H
START:
MOV SCON,#00H ;串行口初始化为方式0
MOV ZISHU,#14
LCALL CLRBUF ;把显示缓冲区清零
MOV DPTR,#TABLE
MOV R2,ZISHU
NEXT: MOV R0,#LOD_BUFL
MOV R1,#LOD_BUFH
LCALL LOADING ;把字型码加载到加载缓冲区
MOV R3,#16 ;这个字是否每一行都移动了?
LOOP3: LCALL SHIFT ;把显示缓冲区内的字型移位
MOV SHOWTIME,#10
LOOP2: MOV R4,#16 ;一个字需要扫描的16次行
MOV SAOMIAO,#80H ;扫描指针清零,p1.7=1,译码器无效
MOV QUMA,#0H ;取码指针清零
LOOP1: MOV A,SAOMIAO
MOV P1,A ;扫描指针输入
INC SAOMIAO ;扫描指针+1
MOV DIS_BUF_C,#2H ;缓冲区有2个字
LCALL DIS_LINE
CLR P1.7
INC QUMA ;取码指针+1
LCALL DELAY1
SETB P1.7
DJNZ R4,LOOP1 ;一个字需要扫描的16次行
DJNZ SHOWTIME,LOOP2 ;一个字的显示时间是否完成?
DJNZ R3,LOOP3 ;是否一个字的每一行的移动了
DJNZ R2,NEXT
LJMP $
;****************************************************************************
DIS_LINE: ;输入一行子程序,入口参数DIS_BUF_C,与缓冲区字数相等
PUSH PSW
PUSH ACC
MOV OFFSET,#0H ;取码指针偏移量,多一个字就多+16
NE1: MOV R0,#DIS_BUFL
MOV A,R0
ADD A,QUMA
ADD A,OFFSET
MOV R0,A
MOV A,@R0
CLR TI
MOV SBUF,A
JNB TI,$
CLR TI ;清发送完标志
MOV R0,#DIS_BUFH
MOV A,R0
ADD A,QUMA
ADD A,OFFSET
MOV R0,A
MOV A,@R0
CLR TI
MOV SBUF,A
JNB TI,$
CLR TI ;清发送完标志
MOV A,OFFSET
ADD A,#16 ;取下一个字需要加16的偏移量
MOV OFFSET,A
DJNZ DIS_BUF_C,NE1
POP ACC
POP PSW
RET
;**********************************************************************************
;把显示缓冲区清零
CLRBUF:
MOV R0,#DIS_BUFL
L1: MOV @R0,#0
INC R0
CJNE R0,#80H,L1
RET
;**********************************************************************************
;把字型码加载到加载缓冲区
LOADING:
PUSH 02h ;push r2
MOV R2,#16
L2:
MOV A,#0
MOVC A,@A+DPTR
MOV @R0,A ;把偶数个数字码存放在R0开始的缓冲区,共可以存放16个字码
INC R0
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV @R1,A ;把奇数个数字码存放在R1开始的缓冲区,共可以存放16个字码
INC R1
INC DPTR
DJNZ R2,L2
POP 02h ;pop r2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHIFT:
PUSH PSW
PUSH ACC
SETB RS1 ;选择另外一组工作寄存器
MOV R3,#00H ;偏移量
MOV R4,#16
LOOPS:
CLR C ;清进位标志C
MOV A,#LOD_BUFH
ADD A,R3
MOV R0,A
MOV A,@R0
RLC A ;带进位左移,高字节的最高位移进Cy
MOV @R0,A ;移位后放回缓冲区
MOV A,#LOD_BUFL
PUSH PSW ;保护Cy,避免ADD进位影响
ADD A,R3
MOV R0,A
MOV A,@R0
POP PSW
RLC A ;高字节最高位移进低字节最低位 低字节高位进入Cy
MOV @R0,A
MOV A,#DIS_BUFH
PUSH PSW
ADD A,R3
ADD A,#16 ;取下一个字的高字节需要+16的偏移量
MOV R0,A
MOV A,@R0
POP PSW
RLC A
MOV @R0,A
MOV A,#DIS_BUFL
PUSH PSW
ADD A,R3
ADD A,#16
MOV R0,A
MOV A,@R0
POP PSW
RLC A
MOV @R0,A
MOV A,#DIS_BUFH ;显示缓冲区地址送A
PUSH PSW
ADD A,R3
MOV R0,A
MOV A,@R0
POP PSW
RLC A ;上缓冲区低字节的高位进入 这个缓冲区高字节低位,
MOV @R0,A
MOV A,#DIS_BUFL
PUSH PSW
ADD A,R3
MOV R0,A
MOV A,@R0
POP PSW
RLC A
MOV @R0,A
INC R3 ;偏移量+1,准备移下一对字节(下一行)
DJNZ R4,LOOPS ;一个字的16行是否都移动了?
CLR RS1
POP ACC
POP PSW
LCALL DELAY2
RET
;***********************************************************************************
DELAY1:
SETB RS0
MOV R2,#100
J1: DJNZ R2,J1
CLR RS0
RET
DELAY2:
MOV R5,#5
J3: MOV R4,#200
J2: DJNZ R4,J2
DJNZ R5,J3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TABLE :
;今
DB 01H,00H,01H,00H,02H,80H,04H,40H
DB 08H,20H,12H,10H,21H,8EH,0C0H,84H
DB 00H,00H,1FH,0F0H,00H,10H,00H,20H
DB 00H,20H,00H,40H,00H,80H,01H,00H
;天
DB 00H,08H,7FH,0FCH,01H,00H,01H,00H
DB 01H,00H,01H,04H,0FFH,0FEH,01H,00H
DB 02H,80H,02H,80H,04H,40H,04H,40H
DB 08H,20H,10H,10H,20H,0EH,0C0H,04H
;是
DB 0FH,0E0H,08H,20H,08H,20H,0FH,0E0H
DB 08H,20H,08H,20H,0FH,0E0H,00H,04H
DB 0FFH,0FEH,01H,00H,09H,20H,09H,0F0H
DB 09H,00H,15H,00H,23H,00H,40H,0FEH
;年
DB 08H,00H,08H,08H,0FH,0FCH,11H,00H
DB 11H,00H,21H,10H,5FH,0F8H,11H,00H
DB 11H,00H,11H,04H,0FFH,0FEH,01H,00H
DB 01H,00H,01H,00H,01H,00H,01H,00H
;月
DB 00H,10H,0FH,0F8H,08H,10H,08H,10H
DB 08H,10H,0FH,0F0H,08H,10H,08H,10H
DB 08H,10H,0FH,0F0H,08H,10H,08H,10H
DB 10H,10H,10H,10H,20H,50H,40H,20H
;日
DB 00H,10H,1FH,0F8H,10H,10H,10H,10H
DB 10H,10H,10H,10H,10H,10H,1FH,0F0H
DB 10H,10H,10H,10H,10H,10H,10H,10H
DB 10H,10H,1FH,0F0H,10H,10H,00H,00H
;星
DB 00H,08H,3FH,0FCH,20H,08H,3FH,0F8H
DB 20H,08H,3FH,0F8H,01H,00H,21H,08H
DB 3FH,0FCH,21H,00H,41H,10H,0BFH,0F8H
DB 01H,00H,01H,04H,0FFH,0FEH,00H,00H
;期
DB 22H,04H,22H,7EH,22H,44H,7FH,44H
DB 22H,44H,3EH,7CH,22H,44H,3EH,44H
DB 22H,44H,22H,7CH,0FFH,0C4H,00H,44H
DB 24H,44H,22H,84H,41H,14H,82H,08H
;空格
db 00H,00H,00H,00H,00H,00H,00H,00H
db 00H,00H,00H,00H,00H,00H,00H,00H
db 00H,00H,00H,00H,00H,00H,00H,00H
db 00H,00H,00H,00H,00H,00H,00H,00H
;空格
db 00H,00H,00H,00H,00H,00H,00H,00H
db 00H,00H,00H,00H,00H,00H,00H,00H
db 00H,00H,00H,00H,00H,00H,00H,00H
db 00H,00H,00H,00H,00H,00H,00H,00H
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -