📄 20-0 lcd12864.asm
字号:
;***************************************************************************
;连线图: *LCM---8031* *LCM---8031* *LCM------------8031* *LCM----------8031*
; *DB0---P0.0* *DB4---P0.4* *D/I------------P1.0* *CS1----------P1.3*
; *DB1---P0.1* *DB5---P0.5* *R/W------------P1.1* *CS2----------P1.4*
; *DB2---P0.2* *DB6---P0.6* *E--------------P1.2
; *DB3---P0.3* *DB7---P0.7* */RST-----------VDD (详见说明书)
;注:8031的晶振频率为12MHz
;**************************************************************************
XPOS EQU 20H ;列方向地址指针(用于LCDPOS子程序)
YPOS EQU 21H ;行方向地址指针(用于LCDPOS子程序)
ww EQU 22H ;数据个数 原来的 CODE 改成了WW 2005.11.07
RSPIN EQU P1.0 ;
RWPIN EQU P1.1 ;
EPIN EQU P1.2 ;
CS1PIN EQU P1.3 ;
CS2PIN EQU P1.4
ORG 0000H
LJMP MAIN
MAIN: MOV SP,#60H
LCALL LCDRESET ;控制器复位!
LOOP: MOV A,#00H
LCALL LCDFILL ;控制器清屏!
MOV DPTR,#TU_TAB ;128*64的图片数据
LCALL DIS_TU ;显示
LCALL DELAY1S ;延时7S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
MOV A,#00H
LCALL LCDFILL ;清屏
LCALL DSPLAYS ;显示浙江天煌
LCALL DELAY1S ;延时8S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LCALL DELAY1S
LJMP LOOP ;大循环
;========================================================================
DELAY1S:
MOV R0,#20 ;延时子程序(400MS)
DL4_PA: MOV R1,#100
DL4_PB: MOV R2,#100
DJNZ R2,$
DJNZ R1,DL4_PB
DJNZ R0,DL4_PA
RET
;=========================================================================
DSPLAYS: MOV DPTR,#HZKDOT ;汉字库首地址
MOV XPOS,#0
MOV YPOS,#2
MOV ww,#0
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS ;第2个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS1 ;第3个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS2 ;第4个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS3 ;第5个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS4 ;第6个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS5 ;第7个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS6 ;第8个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS7 ;第9个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS8 ;第10个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS9 ;第11个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
MOV DPTR,#BBS10 ;第12个汉字
LCALL PUTCHARDOT ;显示一个汉字
LCALL PUTCHARDOT ;
RET
PUTCHARDOT:
MOV R7,#8
PAC_PA:
MOV A,#0
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
;=========================================================================
LCDFILL: ;LCD整屏显示A的内容
MOV R7,A
MOV YPOS,#0
LFL_PB: MOV XPOS,#0
LFL_PA: MOV A,R7
LCALL LCDWRITE ;定位并写数据
LCALL CUSORNEXT ;加行或者列
MOV A,XPOS;列
JNZ LFL_PA ;XPOS<128则循环(128列)
MOV A,YPOS
JNZ LFL_PB;行 ;YPOS<8则循环(8页)
RET
DIS_TU: MOV YPOS,#0 ;从0行开始
LFL_PB1: MOV XPOS,#0 ;从0列开始
LFL_PA1: MOV A,#00h
movc a,@a+dptr
LCALL LCDWRITE ;定位并写数据
LCALL CUSORNEXT ;行或者列加一
INC DPTR
MOV A,XPOS ;
JNZ LFL_PA1 ;XPOS<128则循环(128列)
MOV A,YPOS
JNZ LFL_PB1 ;YPOS<8则循环(8页)
RET
;======================================================================
LCDWRITE: ;定位并写数据子程序
CALL LCDPOS ;内部写数指针定位
CALL LCDWD ;写数据/分左右屏
RET
;======================================================================
CUSORNEXT:
ANL YPOS,#7 ;页码
INC XPOS ;列码
MOV A,XPOS
JNB ACC.7,CNT_LAX ;小于128
MOV XPOS,#0 ;清列码
INC YPOS ;加一行
MOV A,YPOS
ANL A,#0F8H ;大于8则结束
JZ CNT_LAX
MOV YPOS,#0
CNT_LAX:
RET
;======================================================================
LCDPOS: ;内部写数指针定位子程序
PUSH ACC ;保存要写的数据
MOV A,XPOS ;列数据
JB ACC.6,LPS_LAY ;列大于64则跳转
MOV A,YPOS ;XPOS列方向小于64则对CS1操作
ANL A,#07H ;页码
ADD A,#0B8H ;固定码,芯片要求的
LCALL LCDWC1 ;设页码,在第几行?
MOV A,XPOS
ANL A,#3FH ;小于63
ORL A,#40H ;固定码,见说明书
CALL LCDWC1 ;设列码
JMP LPS_LAX
LPS_LAY: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 ;设列码
LPS_LAX:POP ACC
RET
;========================================================================
LCDWD: ;送数据子程序
MOV B,A
MOV A,XPOS
JB ACC.6,LWD_LAY
MOV A,B ;XPOS列方向小于64则对CS1操作
CALL LCDWD1
JMP LWD_LAX
LWD_LAY:MOV A,B ;XPOS列方向大于等于64则对CS2操作
CALL LCDWD2
LWD_LAX:
RET
;==========================================
LCDRESET: ;LCD控制器复位
MOV A,#3FH ;打开LCD显示
CALL LCDWC1
CALL LCDWC2
MOV A,#0C0H ;设显示起始行
CALL LCDWC1
CALL LCDWC2
RET
LCDWC1: ;送片1控制字子程序
CALL WAITIDLE1 ;判断液晶是否忙?
MOV P0,A
CLR RSPIN ;RS=0 RW=0 CS1=1 E=高脉冲
CLR RWPIN
SETB CS1PIN
SETB EPIN
NOP
CLR EPIN
CLR CS1PIN
RET
LCDWC2: ;送片2控制字子程序
CALL WAITIDLE2
MOV P0,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -