📄 12684.asm
字号:
**************************************************************************************************
表二 片选信号组合(除HG192641外)
/CSA /CSB 19264 12864
0 0 左 禁用
0 1 中 左
1 0 右 右
1 1 禁止 禁止
备注:具体每款液晶的片选CS1,CS2 H/L电平有效(可能不同于上面所述),请参照每款液晶详细资料。
**************************************************************************************************
第五章 液晶模块指令系统
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。现分别介绍如下。
1、显示开/关指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 1 1 1 1 1/0
当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。
00 3E ;关闭显示
00 3F ;LCD显示RAM中的内容
2、显示起始行(ROW)设置指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 1 显示起始行(0~63)
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。
00 C0 ;显示第0行
00 C1 ;显示第1行
00 .....
00 FF ;显示第63行
3、页(PAGE)设置指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 0 1 1 1 页号(0~7)
显示RAM共64行,分8页,每页8行。
00 B8 ;设置为第0页
00 B9 ;设置为第0页
00 .....
00 BF ;设置为第7页
4、列地址(Y Address)设置指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 1 显示列地址(0~63)
00 40 ;设置为第0列
00 41 ;设置为第1列
00 .....
00 7F ;设置为第63列
设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以用读、
指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 BUSY 0 ON/OFF REST 0 0 0 0
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY: 1-内部在工作 0-正常状态
ON/OFF: 1-显示关闭 0-显示打开
RESET: 1-复位状态 0-正常状态
在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。
在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
6、写数据指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 1 写 数 据
7、读数据指令
R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 1 读 显 示 数 据
读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,
紧接着再读才会读出所要读的单元中的数据。
**************************************************************************************************
一、直接访问方式驱动子程序
A11=/CSB,A10=/CSA,A9=R/W,A8=D/I(RS)
COM EQU 20H ;指令寄存器
DAT EQU 21H ;数据寄存器
CWADD1 EQU 0000H ;写指令代码地址(左)
CRADD1 EQU 0200H ;读状态字地址(左)
DWADD1 EQU 0100H ;写显示数据地址(左)
DRADD1 EQU 0300H ;读显示数据地址(左)
CWADD3 EQU 0400H ;写指令代码地址(右)
CRADD3 EQU 0600H ;读状态字地址(右)
DWADD3 EQU 0500H ;写显示数据地址(右)
DRADD3 EQU 0700H ;读显示数据地址(右)
E1 EQU P3.6/7 ; 使能信号
CSB EQU P2.3 ; 片选/CSB(左)
CSA EQU P2.2 ; 片选/CSA(右)
RW EQU P2.1 ; 读/写 选择信号
RS EQU P2.0 ; 寄存器选择信号
三、初始化子程序
INT: MOV COM,#0C0H ;设置显示起始行为第一行
LCALL PRL0
LCALL PRM0
LCALL PRR0
MOV COM,#3FH ;开显示设置
LCALL PRL0
LCALL PRM0
LCALL PRR0
RET
1、写指令代码子程序(左)
PRL0: PUSH DPL ;片选设置为"00"
PUSH DPH
MOV DPTR,#CRADD1 ;设置读状态字地址
PRL01: MOVX A,@DPTR ;读状态字
JB ACC.7,PRL01 ;判"忙"标志为"0"否,否再读
MOV DPTR,#CWADD1 ;设置写指令代码地址
MOV A,COM ;取指令代码
MOVX @DPTR,A ;写指令代码
POP DPH
POP DPL
RET
RB,7~RB,0 DB7~DB0
RC,5 E ;RW=“L”,E信号下降沿锁存DB7∽DB0;RW=“H”,E=“H”DDRAM数据读到DB7∽DB0
RC,3 CS2 ;H:选择芯片(左半屏)信号
RC,2 CS1 ;H:选择芯片(右半屏)信号
RC,1 RW ;RW=“H”,E=“H”,数据被读到DB7∽DB0;RW=“L”,E=“H→L”数据被写到“指令寄存器(IR)”或“数据寄存器(DR)”
RC,0 RS ;RS=“H”,表示DB7∽DB0为显示数据;RS=“L”,表示DB7∽DB0为显示指令数据
CWAD1 EQU ;写指令代码寄存器(左)
CRAD1 EQU ;读状态字寄存器(左)
DWAD1 EQU ;写显示数据寄存器(左)
DRAD1 EQU ;读显示数据寄存器(左)
COM EQU ;指令寄存器
DAT EQU ;数据寄存器
1、写指令代码子程序(左)
PRL0 BSF RC,3 ;选择芯片(左半屏)信号
BCF RC,2
BSF RC,1 ;RW=“H”,读数据
BCF RC,0 ;RS=“L”,表示DB7∽DB0为显示指令数据
BSF RC,5 ;E=“H”,数据被读到DB7∽DB0
PRL01 MOVFW RB ;读状态字(左)
MOVWF CRAD1
BTFSC CRAD1,7 ;判"忙"标志为"0"否,否再读
GOTO PRL01
BSF RC,3 ;选择芯片(左半屏)信号
BCF RC,2
BCF RC,1 ;RW=“L”,E=“H→L”数据被写到“指令寄存器(IR)”或“数据寄存器(DR)”
BCF RC,0 ;RS=“L”,表示DB7∽DB0为显示指令数据
MOVFW COM ;指令送到RB口
MOVWF RB
BCF RC,5 ;E=“H→L”,写到“指令寄存器(IR)”
NOP
BSF RC,5 ;E拉高返回
RETLW 0
2、写显示数据子程序(左)
PRL1: PUSH DPL ;片选设置为"00"
PUSH DPH
MOV DPTR,#CRADD1 ;设置读状态字地址
PRL11: MOVX A,@DPTR ;读状态字
JB ACC.7,PRL11 ;判"忙"标志为"0"否,否再读
MOV DPTR,#DWADD1 ;设置写显示数据地址
MOV A,DAT ;取数据
MOVX @DPTR,A ;写数据
POP DPH
POP DPL
RET
2、写显示数据子程序(左)
PRL1 BSF RC,3 ;选择芯片(左半屏)信号
BCF RC,2
BSF RC,1 ;RW=“H”,读数据
BCF RC,0 ;RS=“L”,表示DB7∽DB0为显示指令数据
BSF RC,5 ;E=“H”,数据被读到DB7∽DB0
PRL11 MOVFW RB ;读状态字(左)
MOVWF CRAD1
BTFSC CRAD1,7 ;判"忙"标志为"0"否,否再读
GOTO PRL01
BSF RC,3 ;选择芯片(左半屏)信号
BCF RC,2
BCF RC,1 ;RW=“L”,E=“H→L”数据被写到“指令寄存器(IR)”或“数据寄存器(DR)”
BSF RC,0 ;RS=“H”,表示DB7∽DB0为显示数据
MOVFW COM ;数据送到RB口
MOVWF RB
BCF RC,5 ;E=“H→L”,写到“数据寄存器(DR)”
NOP
BSF RC,5 ;E拉高返回
RETLW 0
3、读显示数据子程序(左)
PRL2: PUSH DPL ;片选设置为"00"
PUSH DPH
MOV DPTR,#CRADD1 ;设置读状态字地址
PRL21: MOVX A,@DPTR ;读状态字
JB ACC.7,PRL21 ;判"忙"标志为"0"否,否再读
MOV DPTR,#DRADD1 ;设置读显示数据地址
MOVX A,@DPTR ;读数据
MOV DAT,A ;存数据
POP DPH
POP DPL
RET
3、读显示数据子程序(左)
PRL2 BSF RC,3 ;选择芯片(左半屏)信号
BCF RC,2
BSF RC,1 ;RW=“H”,读数据
BCF RC,0 ;RS=“L”,表示DB7∽DB0为显示指令数据
BSF RC,5 ;E=“H”,数据被读到DB7∽DB0
PRL21 MOVFW RB ;读状态字(左)
MOVWF CRAD1
BTFSC CRAD1,7 ;判"忙"标志为"0"否,否再读
GOTO PRL01
BSF RC,3 ;选择芯片(左半屏)信号
BCF RC,2
BSF RC,1 ;RW=“H”,E=“H”,数据被读到DB7∽DB0
BSF RC,0 ;RS=“H”,表示DB7∽DB0为显示数据
BSF RC,5 ;E=“H”,数据被读到DB7∽DB0
MOVFW RB ;数据送到RB口
MOVWF DAT
RETLW 0
4、写指令代码子程序(中)
PRM0: PUSH DPL ;片选设置为"01"
PUSH DPH
MOV DPTR,#CRADD2 ;设置读状态字地址
PRM01: MOVX A,@DPTR ;读状态字
JB ACC.7,PRM01 ;判"忙"标志为"0"否,否再读
MOV DPTR,#CWADD2 ;设置写指令代码地址
MOV A,COM ;取指令代码
MOVX @DPTR,A ;写指令代码
POP DPH
POP DPL
RET
5、写显示数据子程序(中)
PRM1: PUSH DPL ;片选设置为"01"
PUSH DPH
MOV DPTR,#CRADD2 ;设置读状态字地址
PRM11: MOVX A,@DPTR ;读状态字
JB ACC.7,PRM11 ;判"忙"标志为"0"否,否再读
MOV DPTR,#DWADD2 ;设置写显示数据地址
MOV A,DAT ;取数据
MOVX @DPTR,A ;写数据
POP DPH
POP DPL
RET
6、读显示数据子程序(中)
PRM2: PUSH DPL ;片选设置为"01"
PUSH DPH
MOV DPTR,#CRADD2 ;设置读状态字地址
PRM21: MOVX A,@DPTR ;读状态字
JB ACC.7,PRM21 ;判"忙"标志为"0"否,否再读
MOV DPTR,#DRADD2 ;设置读显示数据地址
MOVX A,@DPTR ;读数据
MOV DAT,A ;存数据
POP DPH
POP DPL
RET
7、写指令代码子程序(右)
PRR0: PUSH DPL ;片选设置为"10"
PUSH DPH
MOV DPTR,#CRADD3 ;设置读状态字地址
PRR01:MOVX A,@DPTR ;读状态字
JB ACC.7,PRR01 ;判"忙"标志为"0"否,否再读
MOV DPTR,#CWADD3 ;设置写指令代码地址
MOV A,COM ;取指令代码
MOVX @DPTR,A ;写指令代码
POP DPH
POP DPL
RET
8、写显示数据子程序(右)
PRR1: PUSH DPL ;片选设置为"10"
PUSH DPH
MOV DPTR,#CRADD3 ;设置读状态字地址
PRR11:MOVX A,@DPTR ;读状态字
JB ACC.7,PRR11 ;判"忙"标志为"0"否,否再读
MOV DPTR,#DWADD3 ;设置写显示数据地址
MOV A,DAT ;取数据
MOVX @DPTR,A ;写数据
POP DPH
POP DPL
RET
9、读显示数据子程序(右)
PRR2: PUSH DPL ;片选设置为"10"
PUSH DPH
MOV DPTR,#CRADD3 ;设置读状态字地址
PRR21: MOVX A,@DPTR ;读状态字
JB ACC.7,PRR21 ;判"忙"标志为"0"否,否再读
MOV DPTR,#DRADD3 ;设置读显示数据地址
MOVX A,@DPTR ;读数据
MOV DAT,A ;存数据
POP DPH
POP DPL
RET
**************************************************************************************************
**************************************************************************************************
三、初始化子程序
INT: MOV COM,#0C0H ;设置显示起始行为第一行
LCALL PRL0
LCALL PRM0
LCALL PRR0
MOV COM,#3FH ;开显示设置
LCALL PRL0
LCALL PRM0
LCALL PRR0
RET
**************************************************************************************************
四、测试程序
在使用该程序之前应根据使用的系统调用相应的驱动子程序,修改口地址,若使用于128*64规格的液晶显示模块,则将(左)PRLi驱动子程序屏蔽。
MAIN: MOV R6,#50H
MOV R7,#00H
DELY1: NOP
DJNZ R7,DELY1
DJNZ R6,DELY1 ;上电延时
TEST: MOV SP,#60H
ANL P3,#0E0H ;间接方式用
LCALL INT
MOV R4,#00H ;页面地址暂存器设置
TEST1: MOV A,R4
ORL A,#0B8H ;"或"页面地址设置代码
MOV COM,A ;页面地址设置
LCALL PRL0
LCALL PRM0
LCALL PRR0
MOV COM,#40H ;列地址设置为"0"
LCALL PRL0
LCALL PRM0
LCALL PRR0
MOV R3,#40H ;一页清64个字节
TEST2: MOV DAT,#00H ;显示数据为"0"
LCALL PRL1
LCALL PRM1
LCALL PRR1
DJNZ R3,TEST2 ;页内字节清零循环
INC R4 ;页地址暂存器加1
CJNE R4,#08H,TEST1 ;RAM区清零循环
SJMP $
**************************************************************************************************
第七章 液晶模块的应用经验
下面是清达光电的开发和技术服务人员在内部调试和协助用户调试过程中积累的一些经验,希望能对您做调试工作有所帮助,
同时希望能与您共享您的调试经验。
1.MPU到液晶模块接口的连线尽可能短,最好5厘米之内,如果系统要求必须超过5厘米,就要考虑加驱动,
例如MPU信号线上接74LS245。
2.在VDD、V0/VEE对地(VSS)间接0.1u(104)左右电容去耦,接10u或20u电容滤波。
3.对于一些不好找干扰源的系统,可以考虑用软件“掩饰”显示不正常的问题,即定时初始化控制器,刷新数据。
4.液晶显示模块的上电复位过程将迟于MPU的复位时间,在程序上电执行液晶模块初始化程序之前先运行一段延时程序。
5.将D/I、R/W、CS、E这些功能信号线置于地址线高位(例如8031的P2口)。
6.间接控制方式驱动程序的编制要求E信号独立指令操作,不要与其它信号合成操作。
7.时序改造芯片选择TTL电平的,不要选择CMOS电平的,例如我们上面举例的电路就要选74LS00,而不要选74HC00,更不能选4000系列。
8.如果选用的MPU为高速器件,或者它的总线读写指令周期小于1μs,建议采用间接方式,即模拟液晶控制器时序的方式与液晶控制器通信。
9.如果用在临界时序时,出现有时显示正常有时显示不正常的现象,或者上批显示正常,这批显示不正常,应该首先检查转换电路的结构
和驱动软件(间接方式时),如不易修改电路结构可以在E、R/W、D/I信号处分别对地接0.001μ(102)的电容试试,即调整这三个信号的
相对时间间隔看看。
10.对于128×64的液晶显示模块,当/CSA=1,/CSB=1时,液晶模块的通信禁止,/CSA=0,/CSB=0时,左右两片可能都被选通,所以,当不
需要对液晶模块进行读写时,应使/CSA=1,/CSB=1。尤其是用在替代其它品牌的时候必须注意。
11.用C语言编程时地址变量要定义为无符号整型(unsigned int)。
**************************************************************************************************
**************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -