⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12684.asm

📁 清达光电的开发和技术服务人员在内部调试和协助用户调试过程中积累的一些经验
💻 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 + -