📄 tg19264a接口程序.txt
字号:
; TG19264A接口程序(MCS51模拟方式)
;液晶模块供应商:广州市盛宝电子有限公司 Tel:020-87592491 Fax:87541571
;Email: tinsharp@public.guangzhou.gd.cn
;***************************************************************************
;连线图:
;*LCM---89C52* *LCM---89C52* *LCM-------89C52* *LCM----------89C52* *
;*DB0---P0.0* *DB4---P0.4* *D/I-------P2.6* *CS1----------P2.4* *
;*DB1---P0.1* *DB5---P0.5* *R/W-------P2.7* *CS2----------P2.5* *
;*DB2---P0.2* *DB6---P0.6* */RST-------VCC* *CS3----------P3.2* *
;*DB3---P0.3* *DB7---P0.7* *E---------P2.3* *
;注:89C52的晶振频率为12MHz *
;***************************************************************************
;接口引脚定义:
ELCM EQU P2.3
CS1 EQU P2.4
CS2 EQU P2.5
CS3 EQU P3.2
DI EQU P2.6
RW EQU P2.7
DATA_LCM EQU P0
;内存RAM分配
XPOS EQU 30H ;X坐标
YPOS EQU 31H ;Y坐标
;液晶片分区参数
PD1 EQU 40H ;每一个分区宽64点
;主程序开始
ORG 0000H
JMP START
org 0023h
LJMP RS232
START: MOV SP,#60H ; void main() {
MAIN: LCALL DELAY400MS ; void delay(void);
CALL LCDRESET ; void lcdreset(void);
MOV A,#55H
CALL LCDFILL ; void lcdfill( uchar a );
MOV DPTR,#STRING1 ; uchar *p = *string1;
CALL PUTSTR ; void putstr( uchar *p);
MOV YPOS,#2
MOV XPOS,#0
CALL PUTSTR ; void putatr( uchar *p);
M1: AJMP M1 ; whil(1);
; }
;****************************************************************
; 长延时程序,主要用于初始化之前,CPU等待LCM准备好(400MS)
;****************************************************************
DELAY400MS:
MOV R0,#20
DL4_PA: MOV R1,#100
DL4_PB: MOV R2,#100
DJNZ R2,$
DJNZ R1,DL4_PB
DJNZ R0,DL4_PA
RET
;****************************************************************
; 短延时程序,主要用于显示演示速度
;****************************************************************
DELAY:
MOV R5,#4
DLY_PA: MOV R4,#0
DJNZ R4,$
DJNZ R5,DLY_PA
RET
;****************************************************************
;获取字串内字符编码,C=0显示结束,字符串以0FFH结尾作为结束标志
;以两字节组成一个字符:前一字节表示是全角(>=80H)还是半角(<80H)
; 后一字节字符点阵表内偏移量“内码”
;****************************************************************
GETSTRCHAR:
GSC_PA:
CLR A
MOVC A,@A+DPTR ;先读取字头
INC DPTR
MOV B,A
INC A
CLR C ;置程序出口标志(表示已经结束)
JZ GSC_LAX ;如果是结束码(0ffh+1=00h)
CLR A
MOVC A,@A+DPTR ;真正读取“内码”
INC DPTR
SETB C ;编码有效
GSC_LAX:
RET
;****************************************************************
;字符数据输出
;****************************************************************
PUTSTR:
; CALL DELAY
CALL GETSTRCHAR ;取字符串中的字符码
PUSH DPL
PUSH DPH
JNC PSR_LAX ;显示结束
JNB B.7,PSR_LBY ;编码<128,英文
;CHINESE: ;汉字输出16*16=8*16 + 8*16
CALL HZKPOS ;点阵码偏移量换算
CALL PUTCWDOT ;16*16点阵输出
JMP PSR_LBX
PSR_LBY:
;ENGLISH: ;英文(数字)半角字符输出
CALL EZKPOS ;点阵码偏移量换算
CALL PUTCHARDOT ;8*16点阵输出
PSR_LBX:
POP DPH
POP DPL
JMP PUTSTR ;继续下一位
PSR_LAX:POP DPH
POP DPL
RET
;****************************************************************
;全角字符数据输出,16*16点阵
;****************************************************************
PUTCWDOT:
PUSH XPOS
MOV R7,#16
PCW_PA: ;上半个字符
CLR A
MOVC A,@A+DPTR ;获取点阵码
CALL LCDWRITE ;写入LCM(上半个字部分)
INC XPOS ;X坐标加1
INC DPTR ;指向下一个点阵码
DJNZ R7,PCW_PA
INC YPOS
POP XPOS
MOV R7,#16
PCW_PB: ;下半个字符
CLR A ;
MOVC A,@A+DPTR ;再取一个点阵码
CALL LCDWRITE ;输出
INC DPTR ;指向下一个点阵码
INC XPOS ;指向下一列
DJNZ R7,PCW_PB
DEC XPOS
CALL CUSORNEXT ;坐标指针自动移位计算(指向下一列)
MOV A,XPOS ;判断是否换行?
JNZ PCW_PC
INC YPOS
PCW_PC: DEC YPOS ;返回上半个字部分
RET
;****************************************************************
;半角字符数据输出,8*16点阵
;****************************************************************
PUTCHARDOT:
PUSH XPOS
MOV R7,#8
PAC_PA: ;上半个字符
CLR A
MOVC A,@A+DPTR ;获取点阵码
CALL LCDWRITE ;写入LCM(上半个字部分)
INC DPTR ;指向下一个点阵码
INC XPOS
DJNZ R7,PAC_PA
INC YPOS
POP XPOS
MOV R7,#8
PAC_PB: ;下半个字符
CLR A ;
MOVC A,@A+DPTR ;再取一个点阵码
CALL LCDWRITE ;输出
INC DPTR ;指向下一个点阵码
INC XPOS
DJNZ R7,PAC_PB
DEC XPOS
CALL CUSORNEXT ;坐标指针自动移位计算(指向下一列)
MOV A,XPOS ;判断是否换行?
JNZ PAC_LA2
INC YPOS
PAC_LA2:
DEC YPOS ;返回上半个字部分
RET
;****************************************************************
; 汉字库实际指针换算,结果置入DPTR
;****************************************************************
HZKPOS:
MOV B,#32
MUL AB
MOV DPTR,#HZKDOT
AJMP ZKPOS
;****************************************************************
; 英文字母数字实际指针换算,结果置入DPTR
;****************************************************************
EZKPOS:
MOV B,#16
MUL AB
MOV DPTR,#EZKDOT ;修改数据指针,指向所选字母
ZKPOS: ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
RET
;****************************************************************
;全屏填充程序,填充内容在调用前设定于A中
;****************************************************************
LCDFILL: ;LCD整屏显示A的内容
MOV R7,A
MOV YPOS,#0
LFL_PB: MOV XPOS,#0
LFL_PA: MOV A,R7
CALL LCDWRITE ;定位并写数据
CALL CUSORNEXT
MOV A,XPOS
JNZ LFL_PA
MOV A,YPOS
JNZ LFL_PB
RET
;****************************************************************
;按给定的XY坐标定位,并写数据子程序
;****************************************************************
LCDWRITE:
CALL LCDPOS ;坐标指针定位
CALL LCDWD ;写数据
RET
;****************************************************************
; 连续输出时的坐标指针换算,自动指向下一个可写入地址
;****************************************************************
CUSORNEXT:
ANL YPOS,#7
INC XPOS
MOV A,XPOS
CJNE A,#192,CNT_LAX
MOV XPOS,#0
INC YPOS
MOV A,YPOS
ANL A,#0F8H
JZ CNT_LAX
MOV YPOS,#0
CNT_LAX:
RET
;****************************************************************
;一字节数据输出
;****************************************************************
LCDWD: MOV B,A
MOV A,XPOS
CJNE A,#64,$+3
JNC LWD_LA1
MOV A,B
CALL LCDWD1
JMP LWD_LA3
LWD_LA1:CJNE A,#128,$+3
JNC LWD_LA2
MOV A,B
CALL LCDWD2
JMP LWD_LA3
LWD_LA2:CJNE A,#192,$+3
JNC LWD_LA3
MOV A,B
CALL LCDWD3
LWD_LA3:
RET
;****************************************************************
; X,Y坐标定位处理
;****************************************************************
LCDPOS:
PUSH ACC
MOV A,YPOS ;取Y座标
ANL A,#7 ;保留低三位
ADD A,#0B8H ;光标定位指令
MOV B,A ;暂存Y坐标
CLR C
MOV A,XPOS ;取X坐标值
SUBB A,#PD1 ;左区边界
JNC LPS_LA1 ;如果不在左区
MOV A,XPOS ;重新取X坐标值
ANL A,#3FH ;左边部分(CS1)
ORL A,#40H ;X方向定位指令
CALL LCDWC1 ;X定位
MOV A,B ;Y定位
CALL LCDWC1
JMP LPS_LA3 ;返回
LPS_LA1:CLR C
MOV A,XPOS
SUBB A,#PD1*2 ;中间区右边界
JNC LPS_LA2 ;如果不在中间区
MOV A,XPOS
ANL A,#3FH ;中间部分(CS2)
ORL A,#40H ;X方向定位指令
CALL LCDWC2 ;X定位
MOV A,B
CALL LCDWC2 ;Y坐标定位
JMP LPS_LA3 ;返回
LPS_LA2:CLR C
MOV A,XPOS
SUBB A,#PD1*3 ;右边区域边界
JNC LPS_LA3 ;如果还出界则不予定位
MOV A,XPOS
ANL A,#3FH ;右边部分(CS3)
ORL A,#40H ;X方向定位指令
CALL LCDWC3
MOV A,B
CALL LCDWC3 ;Y方向定位
LPS_LA3:
POP ACC
RET
;****************************************************************
; LCM系统复位
;****************************************************************
LCDRESET:
MOV A,#3EH ;关LCD显示
CALL LCDWC1
CALL LCDWC2
CALL LCDWC3
MOV A,#3FH ;打开LCD显示
CALL LCDWC1
CALL LCDWC2
CALL LCDWC3
MOV A,#0C0H ;设首址
CALL LCDWC1
CALL LCDWC2
CALL LCDWC3
RET
;****************************************************************
; 控制命令输出
;****************************************************************
LCDWC1: CALL WAITIDLE1
SJMP WCCOM
LCDWC2: CALL WAITIDLE2
SJMP WCCOM
LCDWC3: CALL WAITIDLE3
WCCOM: CLR DI
CLR RW
MOV DATA_LCM,A ;E=1 D/I=0 R/W=0
SETB ELCM
NOP
CLR ELCM
RET
;****************************************************************
;数据写输出(分为左中右3个程序)
;****************************************************************
LCDWD1: ;片1写数据子程序
CALL WAITIDLE1 ; BUSY ?
SJMP WDCOM
LCDWD2: ;片2写数据子程序
CALL WAITIDLE2
SJMP WDCOM
LCDWD3: ;片3写数据子程序
CALL WAITIDLE3
WDCOM: SETB DI ; D/I=1 R/W=0
CLR RW
MOV DATA_LCM,A
SETB ELCM ; e = 1;
NOP ; _nop_()
CLR ELCM ; e = 0;
RET
RET
;****************************************************************
; BUSY状态等待
;****************************************************************
WAITIDLE1:
PUSH ACC
MOV DATA_LCM,#0FFH ; E=1 CS1=0 CS2=1 CS3=1 D/I=0 R/W=1
CLR CS1
SETB CS2
SETB CS3
AJMP WT_COM
WAITIDLE2:
PUSH ACC
MOV DATA_LCM,#0FFH ; E=1 CS1=1 CS2=0 CS3=1 D/I=0 R/W=1
SETB CS1
CLR CS2
SETB CS3
AJMP WT_COM
WAITIDLE3:
PUSH ACC
MOV DATA_LCM,#0FFH ; E=1 CS1=1 CS2=1 CS3=0 D/I=0 R/W=1
SETB CS1
SETB CS2
CLR CS3
WT_COM: CLR DI
SETB RW
SETB ELCM
WT_PA: MOV A,DATA_LCM
JB ACC.7,WT_PA
CLR ELCM
POP ACC
RET
HZKDOT:
;茂 C3515 0
DB 004H,004H,0C4H,044H,05FH,044H,044H,0F4H
DB 044H,04FH,054H,064H,044H,046H,004H,000H
DB 080H,040H,03FH,000H,040H,040H,020H,020H
DB 013H,00CH,018H,024H,043H,080H,0E0H,000H
;兴 C4843 1
DB 000H,0FEH,04AH,04AH,000H,0FEH,0EAH,0AAH
DB 0AAH,0FEH,000H,04AH,04AH,0FEH,000H,000H
DB 002H,083H,042H,022H,012H,01BH,002H,002H
DB 002H,00BH,012H,022H,062H,0C3H,002H,000H
;国 C2590 2
DB 000H,0FEH,002H,0D2H,052H,052H,0D2H,03EH
DB 0D2H,016H,01AH,012H,0FFH,002H,000H,000H
DB 000H,0FFH,050H,053H,052H,04AH,06BH,050H
DB 04FH,054H,07BH,040H,0FFH,000H,000H,000H
;际 C2842 3
DB 000H,0FEH,022H,0D2H,00EH,020H,0B8H,04FH
DB 0B2H,09EH,080H,09FH,072H,08AH,006H,000H
DB 000H,0FFH,004H,008H,007H,021H,012H,00AH
DB 046H,082H,07EH,006H,00AH,012H,031H,000H
;( C0308 4
DB 000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,0C0H,030H,008H,004H,002H,000H,000H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -