实验要求再16x16点阵上循环显示至少三个汉字,这里并没有规定循环方式,字符串可以在尾部到达边界时恢复原状再继续移动,也可以在头部超出边界后,超出部分从对边显示出来,本程序采用第二种循环方式,个人认为看起来比较平滑, 也可以应用在实际工作中。
循环显示的主要思想是一个虚拟的视窗,可以把所有要显示的字符看作一个16xN的数组,而这个虚拟的视窗大小为16x16(即点阵的大小,视窗从数组的左端开始向右滑动,每次把视窗内的数位输出到点阵中,若视窗内的数位超出了数组的右端,则超出的数位从左端开始计算。
如图所示,这样就可以实现汉字的循环显示
ORG 0000H
LJMP START
ORG 000BH
LJMP T0IN
ORG 0040H
CHINA:
DB 00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H
DB 08H,08H,10H,0a0H,02H,20H
DB 04H,08H,08H,0a0H,04H,20H
DB 7fH,0c8H,00H,0a0H,0bH,0feH
DB 20H,88H,3bH,0f8H,10H,20H
DB 11H,28H,08H,0a0H,29H,0fcH
DB 0aH,28H,08H,0a0H,48H,20H
DB 04H,28H,0bH,0f8H,08H,20H
DB 0aH,28H,08H,0a0H,0bH,0feH
DB 11H,08H,08H,0a0H,08H,22H
DB 20H,0a8H,14H,0a2H,08H,2aH
DB 40H,58H,23H,0fcH,08H,26H
DB 00H,08H,00H,00H,08H,22H
DB 00H,00H,00H,00H,08H,20H
DB 00H,00H,00H,00H,00H,00H
START:
ROWBLN EQU 48
ROWLEN EQU 6
DISLEN EQU 16
TIMLEN EQU 2
X_DAT EQU P0.0
Y_DAT EQU P0.3
X_DCLK EQU P0.1
Y_DCLK EQU P0.5
X_BCLK EQU P0.2
Y_BCLK EQU P0.6
X_EBLE EQU P0.7
Y_EBLE EQU P0.4
MOV SP,#30H
MOV TMOD,#01H
MOV IE,#82H
MOV IP,#02H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TCON,#10H
MOV R0,#00H//SHIFT
MOV R1,#0FH//DISOFFSET
MOV R2,#00H//ROW
MOV R4,#TIMLEN//TIMER
MOV DPTR,#CHINA
FLUSH:
CLR X_BCLK
CLR Y_BCLK
CLR X_EBLE
CLR Y_EBLE
OUTPUT:
CLR X_DCLK
CLR Y_DCLK
MOV A,R2
MOV B,#ROWLEN
MUL AB
MOV R3,A
MOV A,R0
ADD A,R1
MOV B,#ROWBLN
DIV AB
MOV A,B
MOV B,#8
DIV AB
ADD A,R3
MOVC A,@A+DPTR
MOV R3,B
CJNE R3,#00H,FINDBIT
JMP COLSET
FINDBIT:
RL A
DJNZ R3,FINDBIT
COLSET:
RLC A
MOV X_DAT,C
CLR C
MOV A,#15
SUBB A,R2
CJNE A,01H,ROW_OFF
CLR Y_DAT
JMP UPJMP
ROW_OFF:
SETB Y_DAT
UPJMP:
SETB X_DCLK
SETB Y_DCLK
DEC R1
CJNE R1,#0FFH,OUTPUT
SETB X_BCLK
SETB Y_BCLK
SETB X_EBLE
SETB Y_EBLE
MOV R1,#0FH
INC R2
CJNE R2,#10H,FLUSH
MOV R2,#00H
JMP FLUSH
T0IN:
MOV TCON,#00H
DJNZ R4,T0END
MOV R4,#TIMLEN
INC R0
CJNE R0,#ROWBLN,T0END
MOV R0,#00H
T0END:
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TCON,#10H
RETI
END
隔了一个假期,自己的代码也有点生疏了,有问题的欢迎留言(转载请注明)