📄 hz12864.asm
字号:
XPOS EQU 20H ;列方向地址指针
YPOS EQU 21H ;行方向地址指针
CS2 EQU 0200H ;P2.1
CS1 EQU 0400H ;P2.2
CS EQU 8000H ;P2.7
RW EQU 0800H ;P2.3
RS EQU 0100H ;P2.0
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#60H
MAIN: CALL LCDRESET ;复位
MOV A,#00H
CALL LCDFILL ;空格填充整屏
MOV XPOS,#00H ;设置页
MOV YPOS,#00H ;设置列
MOV DPTR,#STRING1 ;字符串首地址
MAIN1: CALL PUTSTR
JMP MAIN1
;*****************************************************************************
; /* 显示字符子程序 */
;*****************************************************************************
PUTSTR: CALL LCDRESET ;复位
CALL DELAY ;延时
CALL GETADDR ;取要显示字符的地址
PUSH DPL
PUSH DPH
JNB B.7,PSRE ;判断是中文还是英文
CALL HZKPOS
CALL PUTCHARDOT ;显示中文
CALL PUTCHARDOT
JMP PSR1
PSRE: CALL HZKPOS ;显示英文
CALL PUTCHARDOT
PSR1: POP DPH
POP DPL
RET
;*****************************************************************************
; /* 计算字符在库中的地址 */
;*****************************************************************************
HZKPOS: MOV R2,#5 ;32字节
HZKPOS1: CLR C
RLC A
MOV R0,A
MOV A,B
RLC A
MOV B,A
MOV A,R0
DJNZ R2,HZKPOS1
MOV DPTR,#HZKDOT
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
RET
;*****************************************************************************
; /* 显示半个中文或一个英文子程序 */
;*****************************************************************************
PUTCHARDOT: MOV R7,#8
PAC_PA: CLR A
MOVC A,@A+DPTR ;取出字符
CALL LCDWRITE ;显示字符(上半段)
INC YPOS
INC DPTR
CLR A
MOVC A,@A+DPTR ;取出字符
CALL LCDWRITE ;显示字符(下半段)
DEC YPOS
INC DPTR
CALL CUSORNEXT
MOV A,XPOS
JNZ PAC_LAX
INC YPOS
PAC_LAX: DJNZ R7,PAC_PA
RET
;*****************************************************************************
; /* 调整行列指针 */
;*****************************************************************************
CUSORNEXT: ANL YPOS,#7
INC XPOS
MOV A,XPOS
JNB ACC.7,CNT_LAX
MOV XPOS,#0 ;满128列列指针赋初值
INC YPOS ;行指针加1
MOV A,YPOS
ANL A,#0F8H
JZ CNT_LAX
MOV YPOS,#0 ;满8行行指针赋初值
CNT_LAX: RET
;*****************************************************************************
; /* 取字符的地址 */
;*****************************************************************************
GETADDR: CLR A
MOVC A,@A+DPTR
INC DPTR
MOV B,A
INC A
JZ GETADDR1 ;取出的数据的为00转并清零标志位
CLR A
MOVC A,@A+DPTR
CJNE A,#0FFH,GETADDR2 ;检查是否是最后一个字符
CALL DELAY400MS
CALL DELAY400MS
CALL DELAY400MS
GETADDR1: AJMP START ;若是最后一个字符转到开始
GETADDR2: INC DPTR
RET
;*****************************************************************************
; /* 定位并写数据子程序 */
;*****************************************************************************
LCDWRITE: CALL LCDPOS ;内部写数指针定位
CALL LCDWD ;写数据
RET
;*****************************************************************************
; /* 内部写数指针定位子程序*/
;*****************************************************************************
LCDPOS: PUSH ACC
MOV A,XPOS
JB ACC.6,LPOS1
MOV A,YPOS ;XPOS列方向小于64则对CS1操作
ANL A,#07H
ADD A,#0B8H
CALL LCDWC1 ;设页码
MOV A,XPOS
ANL A,#3FH
ADD A,#40H
CALL LCDWC1 ;设列码
AJMP LPOS2
LPOS1: MOV A,YPOS ;XPOS列方向大于等于64则对CS2操作
ANL A,#07H
ADD A,#0B8H
CALL LCDWC2 ;设页码
MOV A,XPOS
ANL A,#3FH
ORL A,#40H
CALL LCDWC2 ;设列码
LPOS2: POP ACC
RET
;*****************************************************************************
; /* 送数据子程序 */
;*****************************************************************************
LCDWD: MOV B,A
MOV A,XPOS
JB ACC.6,LWD1
MOV A,B ;XPOS列方向小于64则对CS1操作
CALL LCDWD1
JMP LWD2
LWD1: MOV A,B ;XPOS列方向大于等于64则对CS2操作
CALL LCDWD2
LWD2: RET
;*****************************************************************************
; /* LCD整屏显示A的内容 */
;*****************************************************************************
LCDFILL: MOV R7,A
MOV YPOS,#00H
LCDFILL1: MOV XPOS,#00H
LCDFILL2: MOV A,R7
CALL LCDWRITE ;定位并写数据
INC XPOS
MOV A,XPOS
CJNE A,#128,LCDFILL2 ;XPOS<128则循环(128列)
INC YPOS
MOV A,YPOS
CJNE A,#8,LCDFILL1 ;YPOS<8则循环(8页)
MOV XPOS,#0
MOV YPOS,#0
RET
;*****************************************************************************
; /* LCD控制器复位 */
;*****************************************************************************
LCDRESET: MOV A,#3FH ;打开LCD显示
CALL LCDWC1
CALL LCDWC2
MOV A,#0C0H ;设显示起始行
CALL LCDWC1
CALL LCDWC2
RET
;*****************************************************************************
; /* 送控制字子程序 */
;*****************************************************************************
LCDWC1: PUSH DPH
PUSH DPL
CALL WAITIDLE1
MOV DPTR,#CS+CS1 ;E=1 CS1=1 RS=0
MOVX @DPTR,A
POP DPL
POP DPH
RET
LCDWC2: PUSH DPH
PUSH DPL
CALL WAITIDLE2
MOV DPTR,#CS+CS2 ;E=1 CS2=1 RS=0
MOVX @DPTR,A
POP DPL
POP DPH
RET
;*****************************************************************************
; /* 写数据子程序 */
;*****************************************************************************
LCDWD1: PUSH DPH
PUSH DPL
CALL WAITIDLE1
MOV DPTR,#CS+CS1+RS ;E=1 CS1=1 RS=1
MOVX @DPTR,A
POP DPL
POP DPH
RET
LCDWD2: PUSH DPH
PUSH DPL
CALL WAITIDLE2
MOV DPTR,#CS+CS2+RS ;E=1 CS2=1 RS=1
MOVX @DPTR,A
POP DPL
POP DPH
RET
;*****************************************************************************
; /* 读数据子程序 */
;*****************************************************************************
LCDRD1: PUSH DPH
PUSH DPL
CALL WAITIDLE1
MOV DPTR,#CS+CS1+RS+RW ;E=1 CS1=1 RS=1
MOVX A,@DPTR
POP DPL
POP DPH
RET
LCDRD2: PUSH DPH
PUSH DPL
CALL WAITIDLE2
MOV DPTR,#CS+CS2+RS+RW ;E=1 CS2=1 RS=1
MOVX A,@DPTR
POP DPL
POP DPH
RET
;*****************************************************************************
; /* 检忙子程序 */
;*****************************************************************************
WAITIDLE1: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#CS+CS1+RW ;E=1 CS2=1 RS=1
WT1_PA: MOVX A,@DPTR
JB ACC.7,WT1_PA
POP ACC
POP DPL
POP DPH
RET
WAITIDLE2: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#CS+CS2+RW ;E=1 CS2=1 RS=1
WT2_PA: MOVX A,@DPTR
JB ACC.7,WT2_PA
POP ACC
POP DPL
POP DPH
RET
;*****************************************************************************
; /* 延时子程序 */
;*****************************************************************************
DELAY400MS: MOV R7,#20 ;400MS
DL4_PA: MOV R6,#100
DL4_PB: MOV R5,#100
DJNZ R5,$
DJNZ R6,DL4_PB
DJNZ R7,DL4_PA
RET
DELAY: MOV R6,#2
DLY_PA: MOV R5,#0
DLY_PB: MOV R4,#0
DJNZ R4,$
DJNZ R5,DLY_PB
DJNZ R6,DLY_PA
RET
STRING1: DB 80H,00H,80H,01H,80H,02H,80H,03H,80H,04H,80H,05H
DB 80H,06H,80H,07H,80H,08H,80H,09H,00H,1CH,00H,0AH
DB 00H,0BH,00H,0CH,00H,0DH,00H,0EH,00H,0FH,00H,1CH
DB 00H,1DH,00H,10H,00H,0DH,00H,11H,00H,12H,00H,13H
DB 00H,14H,00H,15H,00H,16H,00H,1CH,00H,17H,00H,0EH
DB 00H,18H,00H,14H,00H,0BH,00H,14H,00H,13H,00H,14H
DB 00H,15H,00H,1CH,00H,1CH,00H,19H,00H,19H,00H,19H
DB 00H,1EH,00H,1AH,00H,14H,00H,1BH,00H,1EH,00H,10H
DB 00H,0DH,00H,11H,00H,1EH,00H,10H,00H,0EH,00H,0FFH
HZKDOT:
;启CC6F4(00)
DW 0040H,0020H,0018H,0F807H,4800H,487EH,4822H,4922H
DW 4E22H,4A22H,4822H,4822H,4822H,787EH,0000H,0000H
;东CB6AB(01)
DW 0000H,0400H,0420H,0C418H,0B40EH,8C04H,8720H,8440H
DW 0F4FFH,8400H,8402H,8404H,8418H,0430H,0000H,0000H
;市CCAD0(02)
DW 0400H,0400H,0400H,0E43FH,2400H,2500H,2500H,0FEFFH
DW 2400H,2400H,2410H,2420H,0E41FH,0400H,0400H,0000H
;微CCEA2(03)
DW 1001H,8800H,0F7FFH,2240H,5C20H,501FH,5F01H,5001H
DW 5CBFH,2050H,0F821H,1716H,1208H,0F0F7H,1040H,0000H
;机CBBFA(04)
DW 0804H,0803H,0C800H,0FFFFH,4800H,8841H,0830H,000CH
DW 0FE03H,0200H,0200H,0200H,0FE3FH,0040H,0078H,0000H
;应CD3A6(05)
DW 0040H,0038H,0FC07H,4420H,8420H,042FH,1424H,2520H
DW 0C623H,8430H,042CH,0423H,0E420H,4422H,0020H,0000H
;用CD3C3(06)
DW 0080H,0040H,0030H,0FE0FH,2202H,2202H,2202H,2202H
DW 0FEFFH,2202H,2202H,2242H,2282H,0FE7FH,0000H,0000H
;研CD1D0(07)
DW 0201H,0C200H,0F23FH,4E10H,0C29FH,0240H,4020H,4218H
DW 0FE07H,4200H,4200H,4200H,0FEFFH,4200H,4200H,0000H
;究CBEBF(08)
DW 0000H,4C00H,2440H,9420H,8410H,840CH,0F503H,8600H
DW 8400H,843FH,1440H,2440H,4440H,0C40H,0478H,0000H
;所CCBF9(09)
DW 0040H,0FE3FH,1201H,1201H,1181H,0F141H,0130H,000CH
DW 0FE03H,2200H,2200H,2100H,0E1FFH,2100H,2100H,0000H
;Q(0A)
DW 0E00FH,1018H,0824H,0824H,0838H,1050H,0E04FH,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;I(0B)
DW 0000H,8020H,9820H,983FH,0020H,0020H,0000H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;D(0C)
DW 0000H,000EH,0011H,8020H,8020H,8810H,0F83FH,0020H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;O(0D)
DW 0000H,001FH,8020H,8020H,8020H,8020H,001FH,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;N(0E)
DW 8020H,803FH,0021H,8000H,8000H,8020H,003FH,0020H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;G(0F)
DW 0000H,006BH,8094H,8094H,8094H,8093H,8060H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;C(10)
DW 0000H,000EH,0011H,8020H,8020H,8020H,0011H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;M(11)
DW 8020H,803FH,8020H,8000H,803FH,8020H,8000H,003FH
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;P(12)
DW 8080H,80FFH,00A1H,8020H,8020H,0011H,000EH,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;U(13)
DW 8000H,801FH,0020H,0020H,0020H,8010H,803FH,0020H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;T(14)
DW 0000H,8000H,8000H,0E01FH,8020H,8020H,0000H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;E(15)
DW 0000H,001FH,8022H,8022H,8022H,8022H,0013H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;R(16)
DW 8020H,8020H,803FH,0021H,8020H,8000H,8001H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;I(17)
DW 0000H,0820H,0820H,0F83FH,0820H,0820H,0000H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;S(18)
DW 0000H,0033H,8024H,8024H,8024H,8024H,8019H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;W(19)
DW 0800FH,8030H,000CH,8003H,000CH,8030H,800FH,8000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;Q(1A)
DW 0000H,000EH,0011H,8020H,8020H,80A0H,80FFH,0080H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;H(1B)
DW 0820H,0F83FH,0021H,8000H,8000H,8020H,003FH,0020H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;空格(1C)
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;μ(1D)
DW 0F87FH,0004H,0008H,0008H,0004H,0F807H,0008H,0004H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
;.(1E)
DW 0000H,0000H,0030H,0030H,0000H,0000H,0000H,0000H
DW 0000H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -