硬件汉字库设计原理与应用
四显示原理与软件编制
在第一节中我们已经得出国字的区位码为195AH 换算成十进制为2590 ,即国字的点阵位
于第25 区的第90 个字的位置,相当于在文件HZK16 中的位置为32 [(25-1) 94 (90-1)] 75040B 以后的32 个字节为国的显示点阵。
在本系统中AT29C020 的A15 A17 分别连接到P1 口的P1.0 P1.1 和P1.2 作为页选择控制A0
A14 直接连接单片机的A0 A14 利用MOVX 指令连续取32 个字节送LCD 的相应位置就能实现正确的汉字显示。
由于240 128 点阵的LCD 显示器每行只能显示15 个汉字16 16 点阵汉字所以可以将需要显示的语句按15 个汉字为1 行进行编写标点符号要用全角不足15 个汉字的则补空格这就是下面软件中的MENG.ASM 中的内容
为方便读者将已经通过汇编的有关程序列出有关LCD 的具体使用方法请见文献[2]
主程序
C_ADD EQU 8001H 液晶命令地址
D_ADD EQU 8000H 液晶数据地址
DAT1 EQU 30H
DAT2 EQU 31H
COM EQU 32H
CODE1 EQU 33H
COUNT EQU 34H
O_Y EQU 35H
O_X EQU 36H
COUNT_X EQU 37H
ORG 0000H
SJMP START
ORG 0030H
START: MOV SP, #60H
ORL AUXR, #02H EXTRAM 位1 访问外部数据存储器
ANL AUXR1, #0FH ENBOOT=0 访问到FLASH
CLR P1.5 正显
LCALL INT 初始化设置子程序
LCALL CLEAR 清屏
MOV DPTR, #TABLE 科幻小说的开头
MOV O_Y, #00H
PUSH DPH
PUSH DPL
LOOP: POP DPL
POP DPH
MOV R0, #0E0H 字模数据暂存区
MOV R7, #30 每个汉字为2 字节每行15 个汉字需30 字节
PRHZ3: CLR A
MOVC A, @A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7, PRHZ3
PUSH DPH
PUSH DPL
MOV O_X, #00H
MOV R0, #0E0H
MOV COUNT_X, #15
LCD112: MOV 24H, @R0 24H 和25H 为暂存缓冲存内码
INC R0
MOV 25H, @R0
INC R0
MOV A, 24H
CLR C
SUBB A, #0A1H 转换为区位码
MOV 24H, A
MOV A, 25H
CLR C
SUBB A, #0A1H
MOV 25H, A
MOV A, R0
PUSH ACC
LCALL DPONHZ 取字模数据并存入0C0H 开始的寄存器
LCALL WRI_CC 送出显示
POP ACC
MOV R0, A
INC O_X
INC O_X
DJNZ COUNT_X,LCD112 1 行汉字送完跳转
MOV A, O_Y
ADD A, #10H
MOV O_Y, A
MOV A, O_Y
CJNE A, #80H,LOOP
MOV O_Y, #00H
LCALL DELAY 送完1 屏后延长时间以便于阅读
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
POP DPL
POP DPH
PUSH DPH
PUSH DPL
MOV A, DPH
SUBB A, #0DFH 小说结尾地址如果是结尾则复位重新开始
JNC RST1
JMP LOOP
RST1: MOV A, DPL
SUBB A, #2AH
JNC RST
JMP LOOP
RST: JMP START
DPONHZ: MOV A, 24H 取字模数据至0C0H 开始的内部存储区
MOV B, #94
MUL AB
ADD A, 25H
MOV 25H, A
CLR A
ADDC A, B
MOV 24H, A
CLR C
RRC A
CLR C
RRC A
MOV P1, A
LCALL RL245
CLR 24H.7
MOV DPH, 24H
MOV DPL, 25H
MOV R2, #32
MOV R1, #0C0H
DPHZ2: MOVX A, @DPTR
INC DPTR
MOV @R1, A
INC R1
DJNZ R2, DPHZ2
RET
RL245: MOV R7, #05 24H25H 左移5 位
RLL1: CLR C
MOV A, 25H
RLC A
MOV 25H,A
MOV A, 24H
RLC A
MOV 24H, A
DJNZ R7, RLL1
RET
R_ST: MOV DPTR, #C_ADD 读状态
MOVX A, @DPTR
RET
ST01: LCALL R_ST 读写一数据前
JNB ACC.0, ST01
JNB ACC.1, ST01
RET
ST2: LCALL R_ST 连续读前
JNB ACC.2, ST2
RET
ST3: LCALL R_ST 连续写前
JNB ACC.3, ST3
RET
ST6: LCALL R_ST
JB ACC.6, ERR
RET
ERR: LJMP ST6
PR1: LCALL ST01
MOV A, DAT1
LCALL PR13
PR11: LCALL ST01
MOV A, DAT2
LCALL PR13
PR12: LCALL ST01
MOV A, COM
LJMP PR14
PR13: MOV DPTR, #D_ADD
PR14: MOVX @DPTR, A
RET
PR2: LCALL ST01
MOV DPTR, #D_ADD
MOVX A, @DPTR
MOV DAT2, A
RET
INT: MOV DAT1, #00H 初始化设置子程序
MOV DAT2, #00H
MOV COM, #40H
LCALL PR1
MOV DAT1, #20H
MOV DAT2, #00H
MOV COM, #41H
LCALL PR1
MOV DAT1, #00H
MOV DAT2, #08H
MOV COM, #42H
LCALL PR1
MOV DAT1, #20H
MOV DAT2, #00H
评论