24064液晶显示(T6963芯片)
;这是一款并口扩展内置T6963C控制器的LCD实用显示子程序
;本程序可直接嵌入内藏T6963C控制器的LCD模块应用系统软件使用
;------------------------------------------
ORG 0000H
LJMP RETUN
ORG 0050H
RETUN: ;ACALL DL10MS
ACALL DISP ;执行本子程序
AJMP $
;------------------------------------------
DISP:; LCALL CDSET ;LCD初始化
; MOV DPTR,#HZTAB ;取字码表
; LCALL HZXSR ;送显
MOV DPTR,#ASCTB ;取字码表
LCALL HZXSR ;送显
ACALL CDSET ;清屏
MOV DPTR,#DIANYA ;取字码表
LCALL HZXSR ;送显
MOV DPTR,#XIAXIAN ;取字码表
LCALL HZXSR ;送显
MOV DPTR,#DIANLIOUS
LCALL HZXSR
MOV DPTR,#DIANLIOUX
LCALL HZXSR
MOV DPTR,#BAOHU
LCALL HZXSR
MOV DPTR,#QIDONG
LCALL HZXSR
MOV DPTR,#ZHONGS
LCALL HZXSR
MOV DPTR,#ZHONGX
LCALL HZXSR
ACALL XSASC1
RET
;---------------------------------------------------------------------
;---------------------------------------------------------
XSASC1: MOV A,#10H ;ASC字符显示
;CLR C ;ASC字符显示
;SUBB A,#20H
; MOV B,#10H
MOV DPTR,#ASCDD
LCALL HADNX ;计算当前字码的字模表首址→DPTR
MOV A,#50H
PUSH ACC
MOV A,#30H
PUSH ACC
MOV R6,#10H
XSDLP1: LCALL XSDCN ;送出一个数据显示
MOV B,#1EH
LCALL HADRX ;计算显示坐标(R2,R3)
DJNZ R6,XSDLP1 ;发送完一组(16行*8列一个字符)
POP ACC
MOV R3,A
POP ACC
MOV R2,A
MOV B,#01H
LCALL HADRX ;计算显示首址坐标(R2,R3)
RET
;---------------------------------------------------------------------
DL1S: MOV R2,#10H
DL_1: LCALL DL10MS
DJNZ R2,DL_1
RET
DL10MS: MOV R0,#0FFH
ZJ: MOV R1,#0FFH
DJNZ R1,$
DJNZ R0,ZJ
RET
;------------------------------------------
CDSET: ACALL CDCLR ;清屏 // LCD初始化
MOV R2,#00H
MOV R3,#00H
MOV R4,#42H
ACALL CDCM1 ;图形区首址(0000H)
MOV R2,#30
MOV R3,#00H
MOV R4,#43H
ACALL CDCM1 ;图形区宽度(30字节/行)
MOV R2,#00H
MOV R3,#10H
MOV R4,#40H
ACALL CDCM1 ;文本区首址(1000H)
MOV R2,#1EH
MOV R3,#00H
MOV R4,#41H
ACALL CDCM1 ;文本区宽度(30字节/行)
MOV R4,#0A7H
ACALL CDCM3 ;光标形状(8列*7行)
MOV R2,#00H
MOV R3,#00H
MOV R4,#24H
ACALL CDCM1 ;置地址指针位置(显示缓冲区RAM 0000H)
MOV R4,#80H
ACALL CDCM3 ;字符发生器为CGRAM,显示方式为逻辑“或”
MOV R4,#9BH
ACALL CDCM3 ;启用图形显示,光标闪烁
MOV R2,#00H
MOV R3,#00H
MOV R4,#21H
ACALL CDCM1 ;光标指针(00,00)
RET
;---------------------------------------------------------
CDCLR: PUSH ACC ;清屏子程序
MOV R2,#00H
MOV R3,#00H
MOV R4,#24H
ACALL CDCM1 ;置地址指针位置(显示缓冲区RAM 0000H)
MOV R4,#0B0H
ACALL CDCM3 ;设置LCD为自动写入状态
MOV R2,#20H
CDCR1: MOV R3,#00H
CDCR2: ACALL LCDS3 ;连续写过程每次写都要确认STA3=1
CLR A
ACALL CDWDT ;将(A)写入LCD状态字=清屏
DJNZ R3,CDCR2
DJNZ R2,CDCR1
MOV R4,#0B2H
ACALL CDCM3 ;结束自动写状态
POP ACC
RET
;---------------------------------------------------------
CDCM1: MOV A,R2 ;将R2/R3/R4依此写入LCD状态字
ACALL CDWDT ;将(A)写入LCD状态字
MOV A,R3
ACALL CDWDT ;将(A)写入LCD状态字
ACALL CDCM3 ;将(R4)写入LCD状态字
RET
;---------------------------------------------------------
CDCM3: PUSH DPH ;将(R4)写入LCD状态字
PUSH DPL
ACALL CDTTS ;判STA0/STA1
MOV A,R4
MOV DPTR,#0100H
MOVX @DPTR,A
POP DPL
POP DPH
RET
;---------------------------------------------------------
CDWDT: PUSH DPH ;将(A)写入LCD状态字
PUSH DPL
PUSH ACC
ACALL CDTTS ;判STA0/STA1
MOV DPTR,#0000H
POP ACC
MOVX @DPTR,A
POP DPL
POP DPH
RET
;---------------------------------------------------------
CDTTS: MOV B,#40H ;判别STA0\\STA1状态位子程序
CDDEP: MOV DPTR,#0100H ;读标志字
MOVX A,@DPTR
JNB ACC.0,CDDDP ;判别STA0
JB ACC.1,WCDTU ;判别STA1
CDDDP: DJNZ B,CDDEP ;在写指令的读写数据前,这两个标志位必须同时为1
WCDTU: RET
;---------------------------------------------------------
LCDS3: PUSH DPH ;连续写过程每次写都要确认STA3=1
PUSH DPL
PUSH ACC
PUSH B
MOV B,#20H
CDFWP: MOV DPTR,#0100H
MOVX A,@DPTR ;读出状态字
JB ACC.3,LCDTT ;判断自动写标志位STA3
DJNZ B,CDFWP
LCDTT: POP B
POP ACC
POP DPL
POP DPH
RET
;---------------------------------------------------------
HZXSR: CLR A ;依此取字码输出LCD,0FFH结束
MOVC A,@A+DPTR
CPL A
JNZ HZXSG ;将有效字码送显
RET ;0FFH则结束
;---------------------------------------------------------
HZXSG: CPL A ;分析字码表取出的数据是命令/ASC/汉字?转相应处理
MOV R0,A
CLR C
SUBB A,#20H ;命令?字符?
JC DDCOM ;转命令码处理
MOV A,R0
CLR C
SUBB A,#80H ;ASC?汉字?
JNC HZDXS ;转汉字处理
MOV A,R0
PUSH DPH
PUSH DPL
LCALL XSASC ;转ASC处理
POP DPL
POP DPH
INC DPTR
AJMP HZXSR ;处理下一个字码显示
;---------------------------------------------------------
DDCOM: MOV A,R0 ;命令码分析&发送
XRL A,#0AH
JZ NXXSD ;0AH命令处理(无效)
MOV A,R0
XRL A,#0DH
JZ NXXSD ;0DH命令处理(无效)
MOV A,R0
XRL A,#1BH
JZ XSADD ;1BH命令处理
NXXSD: INC DPTR
AJMP HZXSR ;处理下一个字码显示
;---------------------------------------------------------
HZDXS: MOV A,R0 ;汉字码显示
PUSH DPH
PUSH DPL
LCALL XSHZF ;取相应字模送显
POP DPL
POP DPH
INC DPTR
AJMP HZXSR
;---------------------------------------------------------
XSASC: CLR C ;ASC字符显示
SUBB A,#20H
MOV B,#10H
MOV DPTR,#ASCDD
LCALL HADNX ;计算当前字码的字模表首址→DPTR
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV R6,#10H
XSDLP: LCALL XSDCN ;送出一个数据显示
MOV B,#1EH
LCALL HADRX ;计算显示坐标(R2,R3)
DJNZ R6,XSDLP ;发送完一组(16行*8列一个字符)
POP ACC
MOV R3,A
POP ACC
MOV R2,A
MOV B,#01H
LCALL HADRX ;计算显示首址坐标(R2,R3)
RET
;--------------------------------------------------------
XSADD: INC DPTR ;1BH命令处理 //地址指针设置
CLR A
MOVC A,@A+DPTR
MOV B,#1EH
MUL AB
MOV R2,A
MOV R3,B
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV B,#08H
DIV AB
MOV B,A
LCALL HADRX ;计算显示首址坐标(R2,R3)
MOV R4,#24H
LCALL CDCM1 ;将计算好的显示位置写LCD
INC DPTR
AJMP HZXSR ;下一数据处理
;---------------------------------------------------------
HADRX: MOV A,R2 ;计算显示首址坐标(R2列,R3行)
ADD A,B
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
RET
;---------------------------------------------------------
HADNX: PUSH ACC ;计算当前字码的字模表首址→DPTR
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
POP ACC
RET
;---------------------------------------------------------
XSDCN: MOV R4,#24H ;送出一个数据显示
LCALL CDCM1 ;设置当前送显地址
MOV A,R3
PUSH ACC
CLR A
MOVC A,@A+DPTR
MOV R3,A
MOV R4,#0C4H
LCALL CDCM2 ;将R3写LCD,地址不变
INC DPTR
POP ACC
MOV R3,A
RET
;---------------------------------------------------------
CDCM2: MOV A,R3 ;将(R3)写LCD,地址不变
ACALL CDWDT ;将(A)写入LCD状态字
ACALL CDCM3 ;将(R4)写入LCD状态字
RET
;---------------------------------------------------------
XSHZF: CLR C ;汉字送显示
SUBB A,#80H
MOV B,#32
MOV DPTR,#HZKDD
LCALL HADNX ;计算当前字码的字模表首址→DPTR
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV R6,#10H
HZPXS: LCALL XSDCN ;送出一个数据显示
MOV B,#01H
LCALL HADRX ;计算显示首址坐标(R2,R3)
LCALL XSDCN ;送出一个数据显示
MOV B,#29
LCALL HADRX ;计算显示首址坐标(R2,R3)
DJNZ R6,HZPXS ;发完一组(一个汉字16*16)
POP ACC
MOV R3,A
POP ACC
MOV R2,A
MOV B,#02H
LCALL HADRX ;计算显示首址坐标(R2,R3)
RET
因篇幅问题不能全部显示,请点此查看更多更全内容