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

📄 lcd1602pbpd.s

📁 一些LCD库 分享给大家了 哈哈~
💻 S
📖 第 1 页 / 共 5 页
字号:
; ----------------------------------------------------------------------
; 对外函数说明:
; 
; ----------------------------------------------------------------------
; 10101010101010101010101010101010101010101010101010101010101010101010*/
; 
; #ifndef LCD1602_H
; #define LCD1602_H
; 
; #include "D:\ICC_H\CmmICC.H"
; 
; /* 待定参数 */
; #define DELAY()		{NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
; 
; /* 不考虑移植性的写法 */
; //uint8 bdata bdat;
; //sbit bdat0=bdat^0;
; //sbit bdat1=bdat^1;
; //sbit bdat2=bdat^2;
; //sbit bdat3=bdat^3;
; //sbit bdat4=bdat^4;
; //sbit bdat5=bdat^5;
; //sbit bdat6=bdat^6;
; //sbit bdat7=bdat^7;
; /* 考虑移植性的写法 */
; uint8 bdat;
; #define bdat0 (bdat&0x01)
; #define bdat1 (bdat&0x02)
; #define bdat2 (bdat&0x04)
; #define bdat3 (bdat&0x08)
; #define bdat4 (bdat&0x10)
; #define bdat5 (bdat&0x20)
; #define bdat6 (bdat&0x40)
; #define bdat7 (bdat&0x80)
; 
; #define CGRAM0 0x00
; #define CGRAM1 0x01
; #define CGRAM2 0x02
; #define CGRAM3 0x03
; #define CGRAM4 0x04
; #define CGRAM5 0x05
; #define CGRAM6 0x06
; #define CGRAM7 0x07
; 
; #define TRUE	1
; #define FALSE	0
; bool LCD1602Err = FALSE;
; 
; /*--------------------------------------------------------------------
; 函数名称:LCD1602读读读读读忙~
; 函数功能:都说是读读读读读忙咯~
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:无
; 输    入:
; 返    回:无
; --------------------------------------------------------------------*/
; void busy(void)
; {
; 	uint16 busyCounter=0;
	clr R16
	clr R17
; 	bool busySta;		//用于探测 lcd busy status
; 	IN_BF;
	cbi 0x11,7
; 	SET_D4;
	sbi 0x12,4
; 	SET_D5;
	sbi 0x12,5
; 	SET_D6;
	sbi 0x12,6
; 	SET_D7;
	sbi 0x12,7
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	CLR_RS;
	cbi 0x18,5
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	SET_RW;
	sbi 0x18,6
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
L122:
; 
; 	do
; 	{
; 		SET_E;   
	sbi 0x18,7
; 		DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; /* 这里读取AC4-AC6位及BF的值,程序不需记录AC4-AC6的值,所以不存储 */
; 		busySta=(bool)GET_BF;  
	in R18,0x10
	clr R19
	andi R18,128
	andi R19,0
; 		CLR_E;
	cbi 0x18,7
; 		DELAY(); 
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; /* 读取 "BUSY"时,"D4-D7"状态可能已经改变,必须再次设为输出"1" */
; 		SET_D4;
	sbi 0x12,4
; 		SET_D5;
	sbi 0x12,5
; 		SET_D6;
	sbi 0x12,6
; 		SET_D7;
	sbi 0x12,7
; 		DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 		SET_E;   
	sbi 0x18,7
; 		DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; /* 这里读取AC0-AC3位的值,程序不需记录AC0-AC3的值,所以不存储 */
; 		CLR_E;   
	cbi 0x18,7
; 		DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 		if(busyCounter==1000)
	cpi R16,232
	ldi R30,3
	cpc R17,R30
	brne L125
X44:
; 		{
; 			LCD1602Err=TRUE;	//标识LCD1602错误,方便上缴系统报错
	ldi R24,1
	sts _LCD1602Err,R24
; 			return ;			//避免由于LCD1602错误而导致程序阻塞
	xjmp L121
L125:
; 		}
; 		busyCounter++;
	subi R16,255  ; offset = 1
	sbci R17,255
; 	}
L123:
; 	while(busySta);
	tst R18
	breq X46
	xjmp L122
X46:
X45:
; 
; 	LCD1602Err=FALSE;
	clr R2
	sts _LCD1602Err,R2
; 	CLR_E;
	cbi 0x18,7
; 	OUT_BF;
	sbi 0x11,7
L121:
	.dbline 0 ; func end
	ret
;            dat -> R12
;           flag -> R10
	.even
_write::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
; }
; /*--------------------------------------------------------------------
; 函数名称:LCD1602写操作
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:无
; 输    入:
; 返    回:无
; --------------------------------------------------------------------*/
; void write(bool flag,uint8 dat)	//flag=0:command,flag=1:data
; {  
; 	bdat=dat;
	sts _bdat,R12
; 	busy();
	xcall _busy
; 	if(flag)
	tst R10
	breq L128
X47:
; 		SET_RS;
	sbi 0x18,5
	xjmp L129
L128:
; 	else
; 		CLR_RS;
	cbi 0x18,5
L129:
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	CLR_RW;
	cbi 0x18,6
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	if(bdat4)
	lds R2,_bdat
	sbrs R2,4
	rjmp L130
X48:
; 		SET_D4;
	sbi 0x12,4
	xjmp L131
L130:
; 	else
; 		CLR_D4;
	cbi 0x12,4
L131:
; 	if(bdat5)
	lds R2,_bdat
	sbrs R2,5
	rjmp L132
X49:
; 		SET_D5;
	sbi 0x12,5
	xjmp L133
L132:
; 	else
; 		CLR_D5;
	cbi 0x12,5
L133:
; 	if(bdat6)
	lds R2,_bdat
	sbrs R2,6
	rjmp L134
X50:
; 		SET_D6;
	sbi 0x12,6
	xjmp L135
L134:
; 	else
; 		CLR_D6;
	cbi 0x12,6
L135:
; 	if(bdat7)
	lds R2,_bdat
	sbrs R2,7
	rjmp L136
X51:
; 		SET_D7;
	sbi 0x12,7
	xjmp L137
L136:
; 	else
; 		CLR_D7;
	cbi 0x12,7
L137:
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	SET_E;	
	sbi 0x18,7
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	CLR_E;
	cbi 0x18,7
; 	DELAY(); 
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 
; 	if(bdat0)
	lds R2,_bdat
	sbrs R2,0
	rjmp L138
X52:
; 		SET_D4;
	sbi 0x12,4
	xjmp L139
L138:
; 	else
; 		CLR_D4;
	cbi 0x12,4
L139:
; 	if(bdat1)
	lds R2,_bdat
	sbrs R2,1
	rjmp L140
X53:
; 		SET_D5;
	sbi 0x12,5
	xjmp L141
L140:
; 	else
; 		CLR_D5;
	cbi 0x12,5
L141:
; 	if(bdat2)
	lds R2,_bdat
	sbrs R2,2
	rjmp L142
X54:
; 		SET_D6;
	sbi 0x12,6
	xjmp L143
L142:
; 	else
; 		CLR_D6;
	cbi 0x12,6
L143:
; 	if(bdat3)
	lds R2,_bdat
	sbrs R2,3
	rjmp L144
X55:
; 		SET_D7;
	sbi 0x12,7
	xjmp L145
L144:
; 	else
; 		CLR_D7;
	cbi 0x12,7
L145:
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	SET_E;		
	sbi 0x18,7
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
; 	CLR_E;
	cbi 0x18,7
; 	DELAY();
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
L127:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
;              i -> R20
;            buf -> R10,R11
;            adr -> R12
	.even
_LCD1602_setCGRAM::
	xcall push_xgset303C
	movw R10,R18
	mov R12,R16
; }
; /*--------------------------------------------------------------------
; 函数名称:LCD1602读操作
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:无
; 输    入:
; 返    回:无
; --------------------------------------------------------------------*/
; //void read(uint8 adr)
; //{	
; //}
; /*--------------------------------------------------------------------
; 函数名称:LCD1602设置CGRAM内容
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:调用LCD1602_setCG(0,userCh),则写入用户定义的字符"userCh"
; 输    入:"adr"数据范围:0-8,"buf"为用户需要写入的字符"userCh"
; 返    回:无
; --------------------------------------------------------------------*/
; void LCD1602_setCGRAM(uint8 adr,const uint8 buf[8])
; {	
; 	uint8 i;
; 	write(0,0x40+adr*8);
	mov R18,R12
	lsl R18
	lsl R18
	lsl R18
	subi R18,192    ; addi 64
	clr R16
	xcall _write
; 	for(i=0;i<8;i++)
	clr R20
	xjmp L150
L147:
; 		write(1,buf[i]);
	mov R30,R20
	clr R31
	add R30,R10
	adc R31,R11
	lpm R18,Z
	ldi R16,1
	xcall _write
L148:
	inc R20
L150:
	cpi R20,8
	brlo L147
X56:
L146:
	.dbline 0 ; func end
	xjmp pop_xgset303C
	.area data(ram, con, rel)
L152:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
L153:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
L154:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
L155:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
L156:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.area text(rom, con, rel)
;            str -> R10,R11
	.even
_LCD1602_setCmd::
	xcall push_xgset003C
	movw R10,R16
; /* 不得采样下面写法,因为传入的是数组,最后一个不是'\0' */
; 	//while(*buf)
; 		//write(1,*buf++);
; }
; /*--------------------------------------------------------------------
; 函数名称:LCD1602命令设置
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:
; 输    入:"CLR_SCR"/"GO_HOME"/"AC_INC"/"AC_DEC"...
; 返    回:无
; --------------------------------------------------------------------*/
; //----	function  ------  1  --------  0  ----LcdWordPos--
; //		dispEn		|   Enable	|  Disable	|	bit2
; //		cursorEn	|   Enable	|  Disable	|	bit1
; //		blinkEn		|   Enable	|  Disable	|	bit0
; //------------------------------------------------------
; //		isACinc		|	INC_AC  |  DEC_AC	|	bit1
; //		shiftEn		|   Enable	|  Disable	|	bit0
; //------------------------------------------------------
; void LCD1602_setCmd(uint8  *str)
; {
; 	static bool dispEn  =0;
; 	static bool cursorEn=0;
; 	static bool blinkEn =0;
; 	static bool shiftEn =0;
; 	static bool isACinc =0;
; 	
; 	if(!strcmp(str,"CLR_SCR"))			//clear screen
	ldi R18,<L159
	ldi R19,>L159
	movw R16,R10
	xcall _strcmp
	cpi R16,0
	cpc R16,R17
	brne L157
X57:
; 		write(0,0x01);
	ldi R18,1
	clr R16
	xcall _write
	xjmp L158
L157:
; 
; 	else if(!strcmp(str,"GO_HOME"))		//set AC go home
	ldi R18,<L162
	ldi R19,>L162
	movw R16,R10
	xcall _strcmp
	cpi R16,0
	cpc R16,R17
	brne L160
X58:
; 		write(0,0x02);
	ldi R18,2
	clr R16
	xcall _write
	xjmp L161
L160:
; /*--------------------------------------------------
; isACinc & shiftEn 共用一个命令设置
; --------------------------------------------------*/
; 	else if(!strcmp(str,"INC_AC"))		//set AC as inc mode
	ldi R18,<L165
	ldi R19,>L165
	movw R16,R10
	xcall _strcmp
	movw R12,R16
	cpi R16,0
	cpc R16,R17
	brne L163
X59:
; 	{
; 		isACinc=1;
	ldi R24,1
	sts L156,R24
; 		if(shiftEn)
	lds R2,L155
	tst R2
	breq L166
X60:
; 			write(0,0x07);
	ldi R18,7
	clr R16
	xcall _write
	xjmp L164
L166:
; 		else 
; 			write(0,0x06);
	ldi R18,6
	clr R16
	xcall _write
; 	}		
	xjmp L164
L163:
; 	else if(!strcmp(str,"DEC_AC"))		//set AC as dec mode
	ldi R18,<L170
	ldi R19,>L170
	movw R16,R10
	xcall _strcmp
	movw R12,R16
	cpi R16,0
	cpc R16,R17
	brne L168
X61:
; 	{	
; 		isACinc=0;
	clr R2
	sts L156,R2
; 		if(shiftEn)
	lds R2,L155
	tst R2
	breq L171
X62:
; 			write(0,0x05);
	ldi R18,5
	clr R16
	xcall _write
	xjmp L169
L171:
; 		else
; 			write(0,0x04);
	ldi R18,4
	clr R16
	xcall _write
; 	}		
	xjmp L169
L168:
; 	else if(!strcmp(str,"EN_SHIFT"))	//enable shift
	ldi R18,<L175
	ldi R19,>L175
	movw R16,R10
	xcall _strcmp
	movw R12,R16
	cpi R16,0
	cpc R16,R17
	brne L173
X63:
; 	{
; 		shiftEn=1;
	ldi R24,1
	sts L155,R24
; 		if(isACinc)
	lds R2,L156
	tst R2
	breq L176
X64:
; 			write(0,0x07);
	ldi R18,7
	clr R16
	xcall _write
	xjmp L174
L176:
; 		else

⌨️ 快捷键说明

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