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

📄 z1602.src

📁 液晶z1602驱动程序(C语言)
💻 SRC
字号:
; Z1602.SRC generated from: Z1602.c

$NOMOD51

NAME	Z1602

P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
T0	BIT	0B0H.4
AC	BIT	0D0H.6
T1	BIT	0B0H.5
EA	BIT	0A8H.7
IE	DATA	0A8H
RD	BIT	0B0H.7
ES	BIT	0A8H.4
IP	DATA	0B8H
RI	BIT	098H.0
INT0	BIT	0B0H.2
CY	BIT	0D0H.7
TI	BIT	098H.1
INT1	BIT	0B0H.3
PS	BIT	0B8H.4
SP	DATA	081H
OV	BIT	0D0H.2
WR	BIT	0B0H.6
SBUF	DATA	099H
PCON	DATA	087H
SCON	DATA	098H
TMOD	DATA	089H
TCON	DATA	088H
IE0	BIT	088H.1
IE1	BIT	088H.3
B	DATA	0F0H
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
TF1	BIT	088H.7
RB8	BIT	098H.2
TH0	DATA	08CH
EX0	BIT	0A8H.0
IT0	BIT	088H.0
TH1	DATA	08DH
TB8	BIT	098H.3
EX1	BIT	0A8H.2
IT1	BIT	088H.2
P	BIT	0D0H.0
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
PT0	BIT	0B8H.1
PT1	BIT	0B8H.3
RS0	BIT	0D0H.3
TR0	BIT	088H.4
RS1	BIT	0D0H.4
TR1	BIT	088H.6
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
REN	BIT	098H.4
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?main?Z1602       SEGMENT CODE 
?DT?main?Z1602       SEGMENT DATA OVERLAYABLE 
?PR?_ePutstr?Z1602   SEGMENT CODE 
?DT?_ePutstr?Z1602   SEGMENT DATA OVERLAYABLE 
?PR?_Display?Z1602   SEGMENT CODE 
?DT?_Display?Z1602   SEGMENT DATA OVERLAYABLE 
?PR?_LocateXY?Z1602  SEGMENT CODE 
?PR?_DispOneChar?Z1602                   SEGMENT CODE 
?DT?_DispOneChar?Z1602                   SEGMENT DATA OVERLAYABLE 
?PR?LcdReset?Z1602   SEGMENT CODE 
?PR?_LcdWriteCommand?Z1602               SEGMENT CODE 
?PR?_LcdWriteData?Z1602                  SEGMENT CODE 
?PR?Delay5Ms?Z1602   SEGMENT CODE 
?PR?Delay400Ms?Z1602 SEGMENT CODE 
?CO?Z1602            SEGMENT CODE 
	EXTRN	CODE (?C_STARTUP)
	PUBLIC	Lcd1602WdataPort
	PUBLIC	Lcd1602CmdPort
	PUBLIC	Lcd1602StatusPort
	PUBLIC	exampl
	PUBLIC	Delay400Ms
	PUBLIC	Delay5Ms
	PUBLIC	_LcdWriteData
	PUBLIC	_LcdWriteCommand
	PUBLIC	LcdReset
	PUBLIC	_DispOneChar
	PUBLIC	_LocateXY
	PUBLIC	_Display
	PUBLIC	_ePutstr
	PUBLIC	main

	XSEG  AT  07DFFH
Lcd1602StatusPort:   DS   1

	XSEG  AT  07CFFH
 Lcd1602CmdPort:   DS   1

	XSEG  AT  07EFFH
Lcd1602WdataPort:   DS   1

	RSEG  ?DT?_DispOneChar?Z1602
?_DispOneChar?BYTE:
      Wdata?453:   DS   1

	RSEG  ?DT?main?Z1602
?main?BYTE:
       temp?040:   DS   1

	RSEG  ?DT?_Display?Z1602
?_Display?BYTE:
         dd?246:   DS   1
	ORG  1
          i?247:   DS   1

	RSEG  ?DT?_ePutstr?Z1602
?_ePutstr?BYTE:
          x?141:   DS   1
          y?142:   DS   1
        ptr?143:   DS   2
	ORG  4
          i?144:   DS   1
          l?145:   DS   1

	RSEG  ?CO?Z1602
exampl:
	DB  'F' ,'o' ,'r' ,' ' ,'a' ,'n' ,' ' ,'e' ,'x' ,'a' 
	DB  'm' ,'p' ,'l' ,'e' ,'.' ,' ' ,' ' ,' ' ,' ' ,' ' 
	DB  '-' ,' ' ,'B' ,'y' ,' ' ,'x' ,'i' ,'a' ,'o' ,'q' 
	DB  'i' ,00AH,000H


; /*===========================================================================
; 
; 			KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式         晓奇
; =============================================================================
; 连接线图:	LCM-------51 	LCM-------51 	LCM--------51
;         	DB0-----P0.0 	DB4-----P0.4 	RW-------P2.0
;         	DB1-----P0.1 	DB5-----P0.5 	RC-------P2.1
;         	DB2-----P0.2 	DB6-----P0.6 	E--------P2.7 =>74ls00+wr+rd
;         	DB3-----P0.3 	DB7-----P0.7 	VLCD接1K2电阻到GND
; 
; [注]:AT89C51的晶振频率为12MHz
; ============================================================================*/
; #pragma src								// 产生汇编文件
; #include <reg51.h>
; #include<intrins.h>
; 
; //========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
; #define	Uchar unsigned char
; #define Uint unsigned int
; 
; // ================= LCM1602A端口地址定义 =======================
; char xdata Lcd1602CmdPort _at_ 0x7cff;		//E=1 RS=0 RW=0
; char xdata Lcd1602WdataPort _at_ 0x7eff;	//E =1 RS=1 RW=0
; char xdata Lcd1602StatusPort _at_ 0x7dff;	//CS=1 RS=0 RW=1
; 
; #define Busy	0x80 						// 忙判别位
; 
; 
; code char exampl[]="For an example.     - By xiaoqi\n";
; 
; void Delay400Ms(void);
; void Delay5Ms(void);
; void LcdWriteData( char dataW );
; void LcdWriteCommand( Uchar CMD,Uchar AttribC );
; void LcdReset( void );
; void Display( Uchar dd );
; void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
; void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
; 
; //================ 随便写几句测试主程序 ================
; void main(void)

	RSEG  ?PR?main?Z1602
main:
	USING	0
			; SOURCE LINE # 41
; {
			; SOURCE LINE # 42
; 	Uchar temp;
; 	
; 	Delay400Ms();				// 启动时必须的延时,等待lcm进入工作状态
			; SOURCE LINE # 45
	LCALL	Delay400Ms
; 
; 	LcdReset();				    // 这也是必需的....初始化
			; SOURCE LINE # 47
	LCALL	LcdReset
; 	temp = 32;
			; SOURCE LINE # 48
	MOV  	temp?040,#020H
; 	ePutstr(0,0,exampl);		// 上面一行显示一个预定字符串
			; SOURCE LINE # 49
	MOV  	R2,#HIGH (exampl)
	MOV  	R3,#LOW (exampl)
	CLR  	A
	MOV  	R5,A
	MOV  	R7,A
	LCALL	_ePutstr
; 
; 	Delay400Ms();			    // 保留显示内容
			; SOURCE LINE # 51
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 52
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 53
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 54
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 55
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 56
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 57
	LCALL	Delay400Ms
; 	Delay400Ms();
			; SOURCE LINE # 58
	LCALL	Delay400Ms
?C0001:
; 
; 	while(1)
			; SOURCE LINE # 60
; 	{
			; SOURCE LINE # 61
; 		temp &= 0x7f;			// 只显示ASCII字符
			; SOURCE LINE # 62
	ANL  	temp?040,#07FH
; 
; 		if (temp<32)temp=32;	// 屏蔽控制字符,不予显示
			; SOURCE LINE # 64
	MOV  	A,temp?040
	CLR  	C
	SUBB 	A,#020H
	JNC  	?C0003
	MOV  	temp?040,#020H
?C0003:
; 		Display( temp++ );
			; SOURCE LINE # 65
	MOV  	R7,temp?040
	INC  	temp?040
	LCALL	_Display
; 		
; 		Delay400Ms();
			; SOURCE LINE # 67
	LCALL	Delay400Ms
; 	}
			; SOURCE LINE # 68
	SJMP 	?C0001
; END OF main

; }
; 
; /*=======================================================
;  显示字符串
; =======================================================*/
; void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {

	RSEG  ?PR?_ePutstr?Z1602
_ePutstr:
	USING	0
			; SOURCE LINE # 74
	MOV  	x?141,R7
	MOV  	y?142,R5
	MOV  	ptr?143,R2
	MOV  	ptr?143+01H,R3
; Uchar i,l=0;
			; SOURCE LINE # 75
	CLR  	A
	MOV  	l?145,A
?C0005:
; 	while (ptr[l] >31){l++;};
			; SOURCE LINE # 76
	MOV  	A,ptr?143+01H
	ADD  	A,l?145
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,ptr?143
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	SETB 	C
	SUBB 	A,#01FH
	JC   	?C0006
	INC  	l?145
	SJMP 	?C0005
?C0006:
; 	for (i=0;i<l;i++) {
			; SOURCE LINE # 77
	CLR  	A
	MOV  	i?144,A
?C0007:
	MOV  	A,i?144
	CLR  	C
	SUBB 	A,l?145
	JNC  	?C0011
; 		DispOneChar(x++,y,ptr[i]);
			; SOURCE LINE # 78
	MOV  	R7,x?141
	INC  	x?141
	MOV  	A,ptr?143+01H
	ADD  	A,i?144
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,ptr?143
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	R3,A
	MOV  	R5,y?142
	LCALL	_DispOneChar
; 		if ( x == 16 ){
			; SOURCE LINE # 79
	MOV  	A,x?141
	CJNE 	A,#010H,?C0009
; 			x = 0; y ^= 1;
			; SOURCE LINE # 80
	CLR  	A
	MOV  	x?141,A
	XRL  	y?142,#01H
; 		}
			; SOURCE LINE # 81
; 	}
			; SOURCE LINE # 82
?C0009:
	INC  	i?144
	SJMP 	?C0007
; }
			; SOURCE LINE # 83
?C0011:
	RET  	
; END OF _ePutstr

; 
; /*=======================================================
;  演示一行连续字符串,配合上位程序演示移动字串
; =======================================================*/
; void Display( Uchar dd ) {

	RSEG  ?PR?_Display?Z1602
_Display:
	USING	0
			; SOURCE LINE # 88
	MOV  	dd?246,R7
; 
; Uchar i;
; 	
; 	for (i=0;i<16;i++) {
			; SOURCE LINE # 92
	CLR  	A
	MOV  	i?247,A
?C0012:
; 
; 		DispOneChar(i,1,dd++);
			; SOURCE LINE # 94
	MOV  	R3,dd?246
	INC  	dd?246
	MOV  	R5,#01H
	MOV  	R7,i?247
	LCALL	_DispOneChar
; 		
; 		dd &= 0x7f;
			; SOURCE LINE # 96
	ANL  	dd?246,#07FH
; 		if (dd<32) dd=32;
			; SOURCE LINE # 97
	MOV  	A,dd?246
	CLR  	C
	SUBB 	A,#020H
	JNC  	?C0014
	MOV  	dd?246,#020H
; 	}
			; SOURCE LINE # 98
?C0014:
	INC  	i?247
	MOV  	A,i?247
	CLR  	C
	SUBB 	A,#010H
	JC   	?C0012
; }
			; SOURCE LINE # 99
?C0016:
	RET  	
; END OF _Display

; 
; /*=======================================================
;  显示光标定位
; =======================================================*/
; void LocateXY( char posx,char posy) {

	RSEG  ?PR?_LocateXY?Z1602
_LocateXY:
	USING	0
			; SOURCE LINE # 104
;---- Variable 'posy?349' assigned to Register 'R5' ----
;---- Variable 'posx?348' assigned to Register 'R7' ----
; 
; Uchar temp;
; 
; 	temp = posx & 0xf;
			; SOURCE LINE # 108
	MOV  	A,R7
	ANL  	A,#0FH
	MOV  	R7,A
;---- Variable 'temp?350' assigned to Register 'R7' ----
; 	posy &= 0x1;
			; SOURCE LINE # 109
	ANL  	AR5,#01H
; 	if ( posy )temp |= 0x40;
			; SOURCE LINE # 110
	MOV  	A,R5
	JZ   	?C0017
	ORL  	AR7,#040H
?C0017:
; 	temp |= 0x80;
			; SOURCE LINE # 111
	ORL  	AR7,#080H
; 	LcdWriteCommand(temp,0);
			; SOURCE LINE # 112
	CLR  	A
	MOV  	R5,A
	LJMP 	_LcdWriteCommand
; END OF _LocateXY

; }
; 
; /*=======================================================
;  按指定位置显示数出一个字符
; =======================================================*/
; void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

	RSEG  ?PR?_DispOneChar?Z1602
_DispOneChar:
	USING	0
			; SOURCE LINE # 118
	MOV  	Wdata?453,R3
;---- Variable 'y?452' assigned to Register 'R5' ----
;---- Variable 'x?451' assigned to Register 'R7' ----
; 
; 	LocateXY( x, y );				// 定位显示地址
			; SOURCE LINE # 120
	LCALL	_LocateXY
; 	LcdWriteData( Wdata );			// 写字符
			; SOURCE LINE # 121
	MOV  	R7,Wdata?453
	LJMP 	_LcdWriteData
; END OF _DispOneChar

; }
; 
; /*=======================================================
;  初始化程序, 必须按照产品资料介绍的初始化过程进行
; =======================================================*/
; void LcdReset( void ) {

	RSEG  ?PR?LcdReset?Z1602
LcdReset:
	USING	0
			; SOURCE LINE # 127
; 
;    	LcdWriteCommand( 0x38, 0);			// 显示模式设置(不检测忙信号)
			; SOURCE LINE # 129
	LCALL	L?0038
; 		Delay5Ms();
			; SOURCE LINE # 130
	LCALL	Delay5Ms
; 	LcdWriteCommand( 0x38, 0);			// 共三次
			; SOURCE LINE # 131
	LCALL	L?0038
; 		Delay5Ms();
			; SOURCE LINE # 132
	LCALL	Delay5Ms
; 	LcdWriteCommand( 0x38, 0);
			; SOURCE LINE # 133
	LCALL	L?0039
; 		Delay5Ms();
			; SOURCE LINE # 134
	LCALL	Delay5Ms
; 
; 	LcdWriteCommand( 0x38, 1);			// 显示模式设置(以后均检测忙信号)
			; SOURCE LINE # 136
	MOV  	R5,#01H
	MOV  	R7,#038H
	LCALL	_LcdWriteCommand
;     LcdWriteCommand( 0x08, 1);			// 显示关闭
			; SOURCE LINE # 137
	MOV  	R5,#01H
	MOV  	R7,#08H
	LCALL	_LcdWriteCommand
;    	LcdWriteCommand( 0x01, 1);			// 显示清屏
			; SOURCE LINE # 138
	MOV  	R5,#01H
	MOV  	R7,#01H
	LCALL	_LcdWriteCommand
; 	LcdWriteCommand( 0x06, 1);			// 显示光标移动设置
			; SOURCE LINE # 139
	MOV  	R5,#01H
	MOV  	R7,#06H
	LCALL	_LcdWriteCommand
; 	LcdWriteCommand( 0x0c, 1);			// 显示开及光标设置
			; SOURCE LINE # 140
	MOV  	R5,#01H
	MOV  	R7,#0CH
	LJMP 	_LcdWriteCommand
; END OF LcdReset

; }
; 
; /*=======================================================
;  写控制字符子程序: E=1 RS=0 RW=0
; =======================================================*/
; void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

	RSEG  ?PR?_LcdWriteCommand?Z1602
L?0038:
	USING	0
L?0039:
	CLR  	A
	MOV  	R5,A
	MOV  	R7,#038H
_LcdWriteCommand:
			; SOURCE LINE # 146
;---- Variable 'AttribC?655' assigned to Register 'R5' ----
;---- Variable 'CMD?654' assigned to Register 'R7' ----
; 
; 	if (AttribC) while( Lcd1602StatusPort & Busy );		// 检测忙信号?
			; SOURCE LINE # 148
	MOV  	A,R5
	JZ   	?C0021
?C0022:
	MOV  	DPTR,#Lcd1602StatusPort
	MOVX 	A,@DPTR
	JB   	ACC.7,?C0022
?C0021:
; 	Lcd1602CmdPort = CMD;
			; SOURCE LINE # 149
	MOV  	DPTR,#Lcd1602CmdPort
	MOV  	A,R7
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 150
	RET  	
; END OF _LcdWriteCommand

; 	
; /*=======================================================
;  当前位置写字符子程序: E =1 RS=1 RW=0
; =======================================================*/
; void LcdWriteData( char dataW ) {

	RSEG  ?PR?_LcdWriteData?Z1602
_LcdWriteData:
			; SOURCE LINE # 155
;---- Variable 'dataW?756' assigned to Register 'R7' ----
?C0025:
; 
; 	while( Lcd1602StatusPort & Busy );					// 检测忙信号
			; SOURCE LINE # 157
	MOV  	DPTR,#Lcd1602StatusPort
	MOVX 	A,@DPTR
	JB   	ACC.7,?C0025
?C0026:
; 	Lcd1602WdataPort = dataW;
			; SOURCE LINE # 158
	MOV  	DPTR,#Lcd1602WdataPort
	MOV  	A,R7
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 159
	RET  	
; END OF _LcdWriteData

; 
; // 短延时
; void Delay5Ms(void)

	RSEG  ?PR?Delay5Ms?Z1602
Delay5Ms:
	USING	0
			; SOURCE LINE # 162
; {
			; SOURCE LINE # 163
; 	Uint i = 5552;
			; SOURCE LINE # 164
;---- Variable 'i?857' assigned to Register 'R6/R7' ----
	MOV  	R7,#0B0H
	MOV  	R6,#015H
?C0028:
; 	while(i--);
			; SOURCE LINE # 165
	MOV  	A,R7
	DEC  	R7
	MOV  	R4,AR6
	JNZ  	?C0036
	DEC  	R6
?C0036:
	ORL  	A,R4
	JNZ  	?C0028
; }
			; SOURCE LINE # 166
?C0030:
	RET  	
; END OF Delay5Ms

; 
; //长延时
; void Delay400Ms(void)

	RSEG  ?PR?Delay400Ms?Z1602
Delay400Ms:
	USING	0
			; SOURCE LINE # 169
;---- Variable 'j?959' assigned to Register 'R6/R7' ----
;---- Variable 'i?958' assigned to Register 'R5' ----
; {
			; SOURCE LINE # 170
; 	Uchar i = 5;
			; SOURCE LINE # 171
	MOV  	R5,#05H
?C0031:
; 	Uint j;
; 	while(i--)
			; SOURCE LINE # 173
	MOV  	R4,AR5
	DEC  	R5
	MOV  	A,R4
	JZ   	?C0035
; 	{
			; SOURCE LINE # 174
; 		j=7269;
			; SOURCE LINE # 175
	MOV  	R6,#01CH
	MOV  	R7,#065H
?C0033:
; 		while(j--);
			; SOURCE LINE # 176
	MOV  	A,R7
	DEC  	R7
	MOV  	R2,AR6
	JNZ  	?C0037
	DEC  	R6
?C0037:
	ORL  	A,R2
	JZ   	?C0031
	SJMP 	?C0033
; 	};
			; SOURCE LINE # 177
; }
			; SOURCE LINE # 178
?C0035:
	RET  	
; END OF Delay400Ms

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -