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

📄 lcd_1602_driver.s

📁 LCD1602四线接口应用范例(AVR_GCC)
💻 S
📖 第 1 页 / 共 3 页
字号:
	rcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r c 10 c
	.dbsym r b 12 c
	.dbsym l lcd 0 A[10:10]c
	.dbsym r i 14 c
	.dbsym r e 6 c
	.dbsym r s 8 pkc
	.dbsym l dat 24 l
	.dbsym l d 22 c
	.dbsym l y 20 c
	.dbsym r x 14 c
	.dbend
	.area lit(rom, con, rel)
L78:
	.byte 0
	.byte 0,0,0,0,0,0,0
	.area text(rom, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbfunc e LCD_write_time _LCD_write_time fV
;            lcd -> y+0
;              i -> R20
;              s -> y+16
;              m -> y+14
;              h -> y+12
;              y -> R22
;              x -> R20
	.even
_LCD_write_time::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,8
	.dbline -1
	.dbline 252
;   }
; /*-----------------------------------------------------------------------
; LCD_write_time  : 数字显示函数
; 
; 输入参数:
;           X、Y    : 显示数据的起始的位置
; 		  h,m,s   :时,分,秒
; 编写日期          :2005-10-19 		
; -----------------------------------------------------------------------*/ 
; void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s)
;   { 
	.dbline 254
;     unsigned char  i;
; 	unsigned char  lcd[8]={0};
	ldi R24,<L78
	ldi R25,>L78
	movw R30,R28
	ldi R16,8
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 255
; 	if(y<2)
	cpi R22,2
	brsh L79
	.dbline 256
; 	add=y*16+x;//设置起始座标LCD_set_xy( X, Y );  
	ldi R24,16
	mul R24,R22
	mov R2,R0
	add R2,R20
	sts _add,R2
L79:
	.dbline 257
; 	lcd[0]=h/10+48;
	ldi R17,10
	ldd R16,y+12
	rcall div8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+0,R24
	.dbline 258
; 	lcd[1]=h%10+48;
	ldi R17,10
	ldd R16,y+12
	rcall mod8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+1,R24
	.dbline 259
; 	lcd[2]=':';
	ldi R24,58
	std y+2,R24
	.dbline 260
; 	lcd[3]=m/10+48;
	ldi R17,10
	ldd R16,y+14
	rcall div8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+3,R24
	.dbline 261
; 	lcd[4]=m%10+48;
	ldi R17,10
	ldd R16,y+14
	rcall mod8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+4,R24
	.dbline 262
; 	lcd[5]=':';  
	ldi R24,58
	std y+5,R24
	.dbline 263
; 	lcd[6]=s/10+48;
	ldi R17,10
	ldd R16,y+16
	rcall div8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+6,R24
	.dbline 264
; 	lcd[7]=s%10+48;
	ldi R17,10
	ldd R16,y+16
	rcall mod8u
	mov R24,R16
	subi R24,208    ; addi 48
	std y+7,R24
	.dbline 270
; /*时和分之间的:的闪动效果
; 	if(lcd[7]%2)
; 	   lcd[2]=':';
; 	   else
; 	   lcd[2]=' ';*/
;    for (i=0;i<8;i++) 
	clr R20
	rjmp L91
L88:
	.dbline 271
;       {
	.dbline 272
;               if(lcd_data[add]==lcd[i])
	movw R24,R28
	mov R30,R20
	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 L92
	.dbline 273
; 			     {}
	.dbline 273
	rjmp L93
L92:
	.dbline 275
; 			  else
; 			     {data[add]=lcd[i];}    
	.dbline 275
	movw R24,R28
	mov R30,R20
	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 275
L93:
	.dbline 276
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 277
L89:
	.dbline 270
	inc R20
L91:
	.dbline 270
	cpi R20,8
	brlo L88
	.dbline 278
; 		          add++;
;       }
; 	LCD_updata;
	clr R2
	sts _new,R2
	.dbline -2
L77:
	adiw R28,8
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l lcd 0 A[8:8]c
	.dbsym r i 20 c
	.dbsym l s 16 c
	.dbsym l m 14 c
	.dbsym l h 12 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e LCD_write_new _LCD_write_new fV
;        address -> R20
;        new_add -> R22
	.even
_LCD_write_new::
	rcall push_gset2
	.dbline -1
	.dbline 287
;   }
; /*----------------------------------------------------
;     LCD_write_new:写显存函数
; 	data[]:32字节的显存
; 	new:显存标号
; 	编写日期:2005/10/18
; -----------------------------------------------------*/  
; void  LCD_write_new(void)
;   {   
	.dbline 289
;     unsigned char address;
; 	unsigned char new_add=1;//1表示要更新地址
	ldi R22,1
	rjmp L96
L95:
	.dbline 291
; 	while(new<32)//显存共32个字节,标号从0--31 
;       {    
	.dbline 292
; 		 if(new==16)//换行
	lds R24,_new
	cpi R24,16
	brne L98
	.dbline 293
; 		    new_add=1;	   
	ldi R22,1
L98:
	.dbline 294
; 	     if(data[new])//跳过为0的显存
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_new
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne X5
	rjmp L100
X5:
	.dbline 295
;             {  
	.dbline 296
; 			if(new_add)//当new_add=0时表示无需更新地址
	tst R22
	breq L102
	.dbline 297
; 		      {
	.dbline 298
; 		         if(new>15)
	ldi R24,15
	lds R2,_new
	cp R24,R2
	brsh L104
	.dbline 299
; 			       address=0xb0+new;
	mov R20,R2
	subi R20,80    ; addi 176
	rjmp L105
L104:
	.dbline 301
; 				 else
; 			       address=0x80+new;
	lds R20,_new
	subi R20,128    ; addi 128
L105:
	.dbline 302
; 			       LCD_write_char(0,address);//设置起始地址
	mov R18,R20
	clr R19
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 303
; 		       }  			  
L102:
	.dbline 304
; 			  LCD_write_char(1,data[new]);//写数据
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_new
	clr R31
	add R30,R24
	adc R31,R25
	ldd R18,z+0
	clr R19
	ldi R16,1
	ldi R17,0
	rcall _LCD_write_char
	.dbline 305
; 			  lcd_data[new]=data[new];
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_new
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_new
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 306
; 			  data[new]=0;//写完数据后,显存清0
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_new
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 307
; 			  new_add=0;
	clr R22
	.dbline 308
; 			}
	rjmp L101
L100:
	.dbline 310
; 		else
; 		   new_add=1;
	ldi R22,1
L101:
	.dbline 311
	lds R24,_new
	subi R24,255    ; addi 1
	sts _new,R24
	.dbline 312
L96:
	.dbline 290
	lds R24,_new
	cpi R24,32
	brsh X6
	rjmp L95
X6:
	.dbline -2
L94:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r address 20 c
	.dbsym r new_add 22 c
	.dbend
	.dbfunc e LCD_write_CGRAM _LCD_write_CGRAM fV
;              n -> R20
;              y -> R18
;              x -> R16
	.even
_LCD_write_CGRAM::
	rcall push_gset1
	ldd R20,y+2
	.dbline -1
	.dbline 322
; 		   new++;//
;       }
;   } 
; /*----------------------------------------------------
;     LCD_write_CGRAM:写CGRAM的函数
; 	输入参数:
;           X、Y    : 显示数据的起始的位置
; 		        n    : 存入LCD的图案的编号
; 	编写日期:2005/10/18
; -----------------------------------------------------*/ 
; void LCD_write_CGRAM(unsigned char x,unsigned char y,unsigned char n) 
; {  
	.dbline 323
;    if(y<2)
	cpi R18,2
	brsh L107
	.dbline 324
;    add=y*16+x;//设置起始座标
	ldi R24,16
	mul R24,R18
	mov R2,R0
	add R2,R16
	sts _add,R2
L107:
	.dbline 325
;     if(n==0)//0表示空数据
	tst R20
	brne L109
	.dbline 326
; 	n+=8;//所以要加上8  (0>8/1>9/2>10...7>15)  
	subi R20,248    ; addi 8
L109:
	.dbline 327
; 	data[add]=n;      
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R20
	.dbline 328
; 	LCD_updata;
	clr R2
	sts _new,R2
	.dbline -2
L106:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r n 20 c
	.dbsym r y 18 c
	.dbsym r x 16 c
	.dbend
	.area lit(rom, con, rel)
L112:
	.byte 63,1
	.byte 1,1
	.byte 1,1
	.byte 63,0
	.byte 0,4
	.byte 2,31
	.byte 2,4
	.byte 0,0
	.byte 0,4
	.byte 14,21
	.byte 4,4
	.byte 4,0
	.byte 0,31
	.byte 21,14
	.byte 4,4
	.byte 4,0
	.byte 0,31
	.byte 21,10
	.byte 4,4
	.byte 4,0
	.byte 0,0
	.byte 2,6
	.byte 14,30
	.byte 30,0
	.byte 8,12
	.byte 10,9
	.byte 10,12
	.byte 8,0
	.byte 8,12
	.byte 14,15
	.byte 14,12
	.byte 8,0
	.area text(rom, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbfunc e LCD_init_CGRAM _LCD_init_CGRAM fV
;            ads -> R20
;          CGRAM -> y+0
;              y -> R20
;              x -> R22
	.even
_LCD_init_CGRAM::
	rcall push_gset2
	sbiw R28,63
	sbiw R28,1  ; offset = 64
	.dbline -1
	.dbline 336
; }
; /*----------------------------------------------------
;     LCD_init_CGRAM:初始化CGRAM的函数
; 	
; 	编写日期:2005/10/18
; -----------------------------------------------------*/ 
; void LCD_init_CGRAM(void)
;   {
	.dbline 338
;      unsigned char CGRAM[8][8]=//CGRAM图案的定义
; 	 {  //1     2      3       4       5      6        7      x
	ldi R24,<L112
	ldi R25,>L112
	movw R30,R28
	ldi R16,64
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 348
; 	   {0x3F,0x01,0x01,0x01,0x01,0x01,0x3F,0x00},//0
; 	   {0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00},//1
; 	   {0x00,0x04,0x0E,0x15,0x04,0x04,0x04,0x00},//2
; 	   {0x00,0x1F,0x15,0x0E,0x04,0x04,0x04,0x00},//3
; 	   {0x00,0x1F,0x15,0x0A,0x04,0x04,0x04,0x00},//4
; 	   {0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x00},//5
; 	   {0x08,0x0C,0x0A,0x09,0x0A,0x0C,0x08,0x00},//6		
; 	   {0x08,0x0C,0x0E,0x0F,0x0E,0x0C,0x08,0x00},//7
; 	 };
; 	   unsigned char ads=0x40;
	ldi R20,64
	.dbline 351
; 	   unsigned char x,y;
; 	   
; 	   LCD_write_char(0,ads);//写地址
	mov R18,R20
	clr R19
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 352
; 	   for(y=0;y<8;y++)
	clr R20
	rjmp L116
L113:
	.dbline 353
; 	     { 
	.dbline 354
; 		   for(x=0;x<8;x++)
	clr R22
	rjmp L120
L117:
	.dbline 355
	.dbline 356
	ldi R24,8
	mul R24,R20
	movw R2,R0
	movw R24,R28
	add R2,R24
	adc R3,R25
	mov R30,R22
	clr R31
	add R30,R2
	adc R31,R3
	ldd R18,z+0
	clr R19
	ldi R16,1
	ldi R17,0
	rcall _LCD_write_char
	.dbline 357
L118:
	.dbline 354
	inc R22
L120:
	.dbline 354
	cpi R22,8
	brlo L117
	.dbline 358
L114:
	.dbline 352
	inc R20
L116:
	.dbline 352
	cpi R20,8
	brlo L113
	.dbline -2
L111:
	adiw R28,63
	adiw R28,1  ; offset = 64
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r ads 20 c
	.dbsym l CGRAM 0 A[64:8:8]c
	.dbsym r y 20 c
	.dbsym r x 22 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
_add::
	.blkb 1
	.dbsym e add _add c
_data::
	.blkb 32
	.dbsym e data _data A[32:32]c
_lcd_data::
	.blkb 32
	.dbsym e lcd_data _lcd_data A[32:32]c

⌨️ 快捷键说明

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