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

📄 lcd_1602_driver.s

📁 LCD1602四线接口应用范例(AVR_GCC)
💻 S
📖 第 1 页 / 共 3 页
字号:
	ldd R20,y+6
	.dbline -1
	.dbline 153
;   }
; /*-----------------------------------------------------------------------
; LCD_write_string  : 英文字符串显示函数
; 
; 输入参数:*s       :英文字符串指针;
;                  X、Y    : 显示字符串的位置
; 				 e          : 把从最后一个字符到x=e之间的内容删除
; 编写日期          :2005/10/18		
; -----------------------------------------------------------------------*/
; void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
;   { 
	.dbline 154
;     if(y<2)
	cpi R18,2
	brsh L32
	.dbline 155
; 	add=y*16+x;//设置起始座标
	ldi R24,16
	mul R24,R18
	mov R2,R0
	add R2,R16
	sts _add,R2
	rjmp L32
L31:
	.dbline 157
;     while (*s) 
;       { 
	.dbline 158
; 	    if(lcd_data[add]==*s)//如果LCD上显示的数和
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R22
	lpm R30,Z
	cp R2,R30
	brne L34
	.dbline 159
; 		   {}                             //待写入的数相同的话
	.dbline 159
	rjmp L35
L34:
	.dbline 160
; 		else{data[add]=*s;}//要显示的数据存入显存
	.dbline 160
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	movw R26,R22
	st -y,R31
	st -y,R30
	movw R30,R26
	lpm R26,Z
	ld R30,y+
	ld R31,y+
	std z+0,R26
	.dbline 160
L35:
	.dbline 161
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 162
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 163
L32:
	.dbline 156
	movw R30,R22
	lpm R30,Z
	tst R30
	brne L31
	.dbline 164
; 	       s ++;//指针加1
; 	       add++;//显存地址加1
;       }
; 	  if(y==1)
	cpi R18,1
	brne L41
	.dbline 165
; 	    e+=16;
	subi R20,240    ; addi 16
	.dbline 166
; 	  for(;e>=add;add++)
	rjmp L41
L38:
	.dbline 167
	.dbline 167
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,32
	std z+0,R24
	.dbline 167
L39:
	.dbline 166
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
L41:
	.dbline 166
	lds R2,_add
	cp R20,R2
	brsh L38
	.dbline 168
; 	   {data[add]=' ';}
; 	LCD_updata;
	clr R2
	sts _new,R2
	.dbline -2
L28:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r e 20 c
	.dbsym r s 22 pkc
	.dbsym r y 18 c
	.dbsym r x 16 c
	.dbend
	.area lit(rom, con, rel)
L43:
	.byte 0
	.byte 0,0,0,0,0,0,0,0,0
	.area text(rom, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbfunc e LCD_write_number _LCD_write_number fV
;              c -> R10
;              b -> R12
;            lcd -> y+0
;              i -> R14
;              e -> R6
;              s -> R8,R9
;            dat -> y+24
;              d -> y+22
;              y -> y+20
;              x -> R14
	.even
_LCD_write_number::
	st -y,r19
	st -y,r18
	rcall push_gset5
	mov R14,R16
	sbiw R28,10
	ldd R8,y+28
	ldd R9,y+29
	ldd R6,y+30
	.dbline -1
	.dbline 182
;   }
; /*-----------------------------------------------------------------------
; LCD_write_number  : 数字显示函数
; 
; 输入参数:
;           X、Y    : 显示字符串的位置
;                d     :在第d位插入小数点
; 		 data      :要显示的数据 长整形
; 		     *s     :数据的单位
; 	         e       : 把从最后一个字符到x=e之间的内容删除
; 编写日期       :2005/10/18	 		
; -----------------------------------------------------------------------*/ 
; void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
;   { 
	.dbline 184
;     unsigned char  i;
; 	unsigned char b=0;
	clr R12
	.dbline 185
; 	unsigned char c='.';
	ldi R24,46
	mov R10,R24
	.dbline 186
; 	unsigned char lcd[10]={0};
	ldi R24,<L43
	ldi R25,>L43
	movw R30,R28
	ldi R16,10
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 187
; 	if(y<2)//如果Y>1则不重新计算地址
	ldd R24,y+20
	cpi R24,2
	brsh L44
	.dbline 188
;     add=y*16+x;//设置起始座标
	ldi R24,16
	ldd R0,y+20
	mul R24,R0
	mov R2,R0
	add R2,R14
	sts _add,R2
L44:
	.dbline 190
;     
;    for (i=10;i>0;i--) 
	ldi R24,10
	mov R14,R24
	rjmp L49
L46:
	.dbline 191
	.dbline 192
	ldi R20,10
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall mod32u
	movw R2,R16
	movw R4,R18
	ldi R20,48
	ldi R21,0
	ldi R22,0
	ldi R23,0
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 193
	ldi R20,10
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall div32u
	movw R30,R28
	std z+24,R16
	std z+25,R17
	std z+26,R18
	std z+27,R19
	.dbline 194
L47:
	.dbline 190
	dec R14
L49:
	.dbline 190
	clr R2
	cp R2,R14
	brsh X1
	rjmp L46
X1:
	.dbline 196
;       {
;         lcd[i]=dat%10+48;
; 		dat=dat/10;
;       }
; 	  
; 	for(i=1;i<11;i++)
	clr R14
	inc R14
	rjmp L53
L50:
	.dbline 197
; 	   { 
	.dbline 198
; 	     if(i==11-d)
	ldi R24,11
	ldd R0,y+22
	sub R24,R0
	cp R14,R24
	brne L54
	.dbline 199
; 		   {  
	.dbline 200
; 		      if(lcd_data[add]==c)
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	cp R2,R10
	brne L56
	.dbline 201
; 			     {}
	.dbline 201
	rjmp L57
L56:
	.dbline 203
; 			  else
; 			     {data[add]=c;}     
	.dbline 203
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R10
	.dbline 203
L57:
	.dbline 204
; 		          add++;
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 205
; 			}   
L54:
	.dbline 206
; 	     if((lcd[i]-48+b)==0)
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	subi R24,48
	add R24,R12
	breq X2
	rjmp L58
X2:
	.dbline 207
; 	     {
	.dbline 208
; 		   if(i>=(10-d))
	ldi R24,10
	ldd R0,y+22
	sub R24,R0
	cp R14,R24
	brsh X3
	rjmp L59
X3:
	.dbline 209
; 		   { 
	.dbline 210
; 		      if(lcd_data[add]==lcd[i])
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldd R3,z+0
	cp R3,R2
	brne L62
	.dbline 211
; 			     {}
	.dbline 211
	rjmp L63
L62:
	.dbline 213
; 			  else
; 			     {data[add]=lcd[i];}     
	.dbline 213
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 213
L63:
	.dbline 214
; 		          add++;
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 215
; 			} 	 
	.dbline 217
; 		   else
; 		   {}  	   
	.dbline 217
	.dbline 218
; 		 }
	rjmp L59
L58:
	.dbline 220
; 		 else
; 		 {
	.dbline 221
; 		      if(lcd_data[add]==lcd[i])
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldd R3,z+0
	cp R3,R2
	brne L64
	.dbline 222
; 			     {}
	.dbline 222
	rjmp L65
L64:
	.dbline 224
; 			  else
; 			     {data[add]=lcd[i];}      
	.dbline 224
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 224
L65:
	.dbline 225
; 		          add++;
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 226
; 		 b=1;
	clr R12
	inc R12
	.dbline 227
; 		 }
L59:
	.dbline 228
L51:
	.dbline 196
	inc R14
L53:
	.dbline 196
	mov R24,R14
	cpi R24,11
	brsh X4
	rjmp L50
X4:
	rjmp L67
L66:
	.dbline 230
; 	   }
; 	   while (*s) 
;       {
	.dbline 231
;         if(lcd_data[add]==*s)//如果LCD上显示的数和
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R8
	lpm R30,Z
	cp R2,R30
	brne L69
	.dbline 232
; 		   {}                             //待写入的数相同的话
	.dbline 232
	rjmp L70
L69:
	.dbline 233
; 		else{data[add]=*s;}//要显示的数据存入显存
	.dbline 233
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	movw R26,R8
	st -y,R31
	st -y,R30
	movw R30,R26
	lpm R26,Z
	ld R30,y+
	ld R31,y+
	std z+0,R26
	.dbline 233
L70:
	.dbline 234
	movw R24,R8
	adiw R24,1
	movw R8,R24
	.dbline 235
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 236
L67:
	.dbline 229
	movw R30,R8
	lpm R30,Z
	tst R30
	brne L66
	.dbline 237
; 	       s ++;//指针加1
; 	       add++;//显存地址加1
;       } 
; 	  if(y==1)
	ldd R24,y+20
	cpi R24,1
	brne L76
	.dbline 238
; 	    e+=16;
	mov R24,R6
	subi R24,240    ; addi 16
	mov R6,R24
	.dbline 239
; 	  for(;e>=add;add++)
	rjmp L76
L73:
	.dbline 240
	.dbline 240
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,32
	std z+0,R24
	.dbline 240
L74:
	.dbline 239
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
L76:
	.dbline 239
	lds R2,_add
	cp R6,R2
	brsh L73
	.dbline 241
; 	   {data[add]=' ';}
; 	    LCD_updata;
	clr R2
	sts _new,R2
	.dbline -2
L42:
	adiw R28,10

⌨️ 快捷键说明

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