|
Re: 单片机系统中的汉字显示
LCDCOM EQU 7FF9H
LCDDAT EQU 7FF8H
;显示1行汉字子程序
;汉字语句位置编号DPTR;行号:R6 PRHZ:MOV 24H,DPH
MOV 25H,DPL
PUSH DPH
PUSH DPL
MOV A,DPH ;计算页号
RR A
RR A
ADD A,#9;从第9区开始存放每行字符的机内码
ORL A,#0F0H
MOV P1,A
LCALL RL245 ;行号乘以32(每行32个字符)
SETB 24H,7 ;数据地址位于8000H~0FFFFH
MOV DPH,24H
MOV DPL,25H
MOV R0,#0E0H
MOV R7,#30 ;连续取出30个字符至0E0H内部数据存储器
PRHZ3:MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,PRHZ3
MOV 1DH,#30 ;显示0E0H后的一行字符(共30个)
MOV R5,#0 ;当前列R5
MOV R0,#0E0H
MOV A,#7FH ;是否为ASCII码?
CLR C
SUBB A,@R0
JC DPHZ1
MOV 26H,@R0
INC R0
MOV 24H,R6 ;ASCII码显示
MOV 25H,R5
LCALL PRASCII
SJMP PRHZ4
DPHZ1:MOV 24H,@R0 ;是汉字则将机内码送24H25H
INC R0
MOV 25H,@R0
INC R0
MOV A,25H
CLR C
SUBB A,#0A1H ;机内码转换为二进制的区码和位码
MOV 25H,A
MOV A,24H
CLR C
SUBB A,#0A1H
LCALLDPONHZ ;显示1个汉字
DEC 1DH
INC R5
PRHZ4:INC R5
DJNZ 1DH,PRHZ5
POP DPL
POP DPH
RET
PR0:MOV DPTR,#LCDCOM ;读状态
MOVX A,@DPTR
RET
PR01:LCALLPR0 ;读、写一数据前
JNB ACC.0,PR01
JNB ACC.1,PR01
RET
PR02:LCALL PR0 ;连续读前
JNB ACC.2,PR02
RET
PR03:LCALL PR0 ;连续写前
JNB ACC.3,PR02
RET
PR1:LCALL PR01 ;双字节参数R2,R3
MOV A,R2
LCALL PR14
PR11:LCALL PR01 ;单字节参数R3
MOV A,R3
LCALL PR14
PR12:LCALL PR01 ;无参数指令R4
MOV A,R4
SJMP PR15
PR14:MOV DPTR,#LCDDAT
PR15:MOVX @DPTR,A
RET
RL245:MOV R7,#5 ;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
;行位置R6(0~7),列位置R5(0~29),汉字区别24H,位码25H
DPONHZ:MOV A,24H ;显示1个汉字
MOV B,#94 ;每区94个汉字
MUL AB
ADD A,25H
MOV 25H,A
CLR A
ADDC A,B
MOV 24H,A
RR A ;获得32KB为1页的页号
RR A
ORL A,#0F0H
MOV P1,A ;页号送P1口
LCALL RL245 ;汉字序号乘以32
SETB 24H,7 ;因为存储器位于单片机系统的7FFFH~0FFFFH
MOV DPH,24H
MOV DPL,25H
MOV R2,#32 ;在该位置连续取出32个字节
MOV R1,#0C0H
DPHZ2:MOVX A,@DPTR
INC DPTR
MOV @R1,A
INC R1
DJNZ R2,DPHZ2
MOV R1,#0C0H
MOV A,R6 ;根据行列位置计算LCD指针
MOV B,#16
MUL AB
MUL B,#30
MUL AB
ADD A,R5
MOV 25H,A
MOV R2,A
CLR A
ADDC A,B
MOV 24H,A
MOV R3,A
MOV 26H,#16 ;将取出的点阵送LCD显示
PRHZ6:MOV R4,#24H
LCALL PR1 ;双字节参数R2,R3
MOV A,@R1
MOV R3,A
INC R1
MOV R4,#0C0H
LCALL PR11 ;单字节参数R3
MOV A,@R1
MOV R3,A
INC R1
MOV R4,#0C0H
LCALL PR11
MOV A,#30
ADD A,25H
MOV R2,A
CLR A
ADDC A,24H
MOV R3,A
MOV 24H,A
DJNZ 26H,PRHZ6
RET
注:由于以上程序直接引自下面的应用实例,调用以上程序时请让寄存器组位于第2区,即R0对应10H。 |
|