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

📄 lcd1602四线接口应用范例.lst

📁 LCD1602四线接口应用范例(AVR_GCC)
💻 LST
📖 第 1 页 / 共 4 页
字号:
    02D0 F491      BNE	0x02E3
(0238) 	    e+=16;
    02D1 2D86      MOV	R24,R6
    02D2 5F80      SUBI	R24,0xF0
    02D3 2E68      MOV	R6,R24
(0239) 	  for(;e>=add;add++)
    02D4 C00E      RJMP	0x02E3
(0240) 	   {data[add]=' ';}
    02D5 E684      LDI	R24,0x64
    02D6 E090      LDI	R25,0
    02D7 91E00063  LDS	R30,add
    02D9 27FF      CLR	R31
    02DA 0FE8      ADD	R30,R24
    02DB 1FF9      ADC	R31,R25
    02DC E280      LDI	R24,0x20
    02DD 8380      STD	Z+0,R24
    02DE 91800063  LDS	R24,add
    02E0 5F8F      SUBI	R24,0xFF
    02E1 93800063  STS	add,R24
    02E3 90200063  LDS	R2,add
    02E5 1462      CP	R6,R2
    02E6 F770      BCC	0x02D5
(0241) 	    LCD_updata;
    02E7 2422      CLR	R2
    02E8 92200060  STS	new,R2
    02EA 962A      ADIW	R28,0xA
    02EB D24F      RCALL	pop_gset5
    02EC 9622      ADIW	R28,2
    02ED 9508      RET
_LCD_write_time:
  lcd                  --> Y+0
  i                    --> R20
  s                    --> Y+16
  m                    --> Y+14
  h                    --> Y+12
  y                    --> R22
  x                    --> R20
    02EE D254      RCALL	push_gset2
    02EF 2F62      MOV	R22,R18
    02F0 2F40      MOV	R20,R16
    02F1 9728      SBIW	R28,0x8
(0242)   }
(0243) /*-----------------------------------------------------------------------
(0244) LCD_write_time  : 数字显示函数
(0245) 
(0246) 输入参数:
(0247)           X、Y    : 显示数据的起始的位置
(0248) 		  h,m,s   :时,分,秒
(0249) 编写日期          :2005-10-19 		
(0250) -----------------------------------------------------------------------*/ 
(0251) void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s)
(0252)   { 
(0253)     unsigned char  i;
(0254) 	unsigned char  lcd[8]={0};
    02F2 E382      LDI	R24,0x32
    02F3 E090      LDI	R25,0
    02F4 01FE      MOVW	R30,R28
    02F5 E008      LDI	R16,0x8
    02F6 E010      LDI	R17,0
    02F7 93FA      ST	R31,-Y
    02F8 93EA      ST	R30,-Y
    02F9 939A      ST	R25,-Y
    02FA 938A      ST	R24,-Y
    02FB D260      RCALL	asgncblk
(0255) 	if(y<2)
    02FC 3062      CPI	R22,2
    02FD F430      BCC	0x0304
(0256) 	add=y*16+x;//设置起始座标LCD_set_xy( X, Y );  
    02FE E180      LDI	R24,0x10
    02FF 9F86      MUL	R24,R22
    0300 2C20      MOV	R2,R0
    0301 0E24      ADD	R2,R20
    0302 92200063  STS	add,R2
(0257) 	lcd[0]=h/10+48;
    0304 E01A      LDI	R17,0xA
    0305 850C      LDD	R16,Y+12
    0306 D21C      RCALL	div8u
    0307 2F80      MOV	R24,R16
    0308 5D80      SUBI	R24,0xD0
    0309 8388      STD	Y+0,R24
(0258) 	lcd[1]=h%10+48;
    030A E01A      LDI	R17,0xA
    030B 850C      LDD	R16,Y+12
    030C D214      RCALL	mod8u
    030D 2F80      MOV	R24,R16
    030E 5D80      SUBI	R24,0xD0
    030F 8389      STD	Y+1,R24
(0259) 	lcd[2]=':';
    0310 E38A      LDI	R24,0x3A
    0311 838A      STD	Y+2,R24
(0260) 	lcd[3]=m/10+48;
    0312 E01A      LDI	R17,0xA
    0313 850E      LDD	R16,Y+14
    0314 D20E      RCALL	div8u
    0315 2F80      MOV	R24,R16
    0316 5D80      SUBI	R24,0xD0
    0317 838B      STD	Y+3,R24
(0261) 	lcd[4]=m%10+48;
    0318 E01A      LDI	R17,0xA
    0319 850E      LDD	R16,Y+14
    031A D206      RCALL	mod8u
    031B 2F80      MOV	R24,R16
    031C 5D80      SUBI	R24,0xD0
    031D 838C      STD	Y+4,R24
(0262) 	lcd[5]=':';  
    031E E38A      LDI	R24,0x3A
    031F 838D      STD	Y+5,R24
(0263) 	lcd[6]=s/10+48;
    0320 E01A      LDI	R17,0xA
    0321 8908      LDD	R16,Y+16
    0322 D200      RCALL	div8u
    0323 2F80      MOV	R24,R16
    0324 5D80      SUBI	R24,0xD0
    0325 838E      STD	Y+6,R24
(0264) 	lcd[7]=s%10+48;
    0326 E01A      LDI	R17,0xA
    0327 8908      LDD	R16,Y+16
    0328 D1F8      RCALL	mod8u
    0329 2F80      MOV	R24,R16
    032A 5D80      SUBI	R24,0xD0
    032B 838F      STD	Y+7,R24
(0265) /*时和分之间的:的闪动效果
(0266) 	if(lcd[7]%2)
(0267) 	   lcd[2]=':';
(0268) 	   else
(0269) 	   lcd[2]=' ';*/
(0270)    for (i=0;i<8;i++) 
    032C 2744      CLR	R20
    032D C025      RJMP	0x0353
(0271)       {
(0272)               if(lcd_data[add]==lcd[i])
    032E 01CE      MOVW	R24,R28
    032F 2FE4      MOV	R30,R20
    0330 27FF      CLR	R31
    0331 0FE8      ADD	R30,R24
    0332 1FF9      ADC	R31,R25
    0333 8020      LDD	R2,Z+0
    0334 E884      LDI	R24,0x84
    0335 E090      LDI	R25,0
    0336 91E00063  LDS	R30,add
    0338 27FF      CLR	R31
    0339 0FE8      ADD	R30,R24
    033A 1FF9      ADC	R31,R25
    033B 8030      LDD	R3,Z+0
    033C 1432      CP	R3,R2
    033D F409      BNE	0x033F
(0273) 			     {}
    033E C00E      RJMP	0x034D
(0274) 			  else
(0275) 			     {data[add]=lcd[i];}    
    033F 01CE      MOVW	R24,R28
    0340 2FE4      MOV	R30,R20
    0341 27FF      CLR	R31
    0342 0FE8      ADD	R30,R24
    0343 1FF9      ADC	R31,R25
    0344 8020      LDD	R2,Z+0
    0345 E684      LDI	R24,0x64
    0346 E090      LDI	R25,0
    0347 91E00063  LDS	R30,add
    0349 27FF      CLR	R31
    034A 0FE8      ADD	R30,R24
    034B 1FF9      ADC	R31,R25
    034C 8220      STD	Z+0,R2
(0276) 		          add++;
    034D 91800063  LDS	R24,add
    034F 5F8F      SUBI	R24,0xFF
    0350 93800063  STS	add,R24
    0352 9543      INC	R20
    0353 3048      CPI	R20,0x8
    0354 F2C8      BCS	0x032E
(0277)       }
(0278) 	LCD_updata;
    0355 2422      CLR	R2
    0356 92200060  STS	new,R2
    0358 9628      ADIW	R28,0x8
    0359 D1DF      RCALL	pop_gset2
    035A 9508      RET
_LCD_write_new:
  address              --> R20
  new_add              --> R22
    035B D1E7      RCALL	push_gset2
(0279)   }
(0280) /*----------------------------------------------------
(0281)     LCD_write_new:写显存函数
(0282) 	data[]:32字节的显存
(0283) 	new:显存标号
(0284) 	编写日期:2005/10/18
(0285) -----------------------------------------------------*/  
(0286) void  LCD_write_new(void)
(0287)   {   
(0288)     unsigned char address;
(0289) 	unsigned char new_add=1;//1表示要更新地址
    035C E061      LDI	R22,1
    035D C04F      RJMP	0x03AD
(0290) 	while(new<32)//显存共32个字节,标号从0--31 
(0291)       {    
(0292) 		 if(new==16)//换行
    035E 91800060  LDS	R24,new
    0360 3180      CPI	R24,0x10
    0361 F409      BNE	0x0363
(0293) 		    new_add=1;	   
    0362 E061      LDI	R22,1
(0294) 	     if(data[new])//跳过为0的显存
    0363 E684      LDI	R24,0x64
    0364 E090      LDI	R25,0
    0365 91E00060  LDS	R30,new
    0367 27FF      CLR	R31
    0368 0FE8      ADD	R30,R24
    0369 1FF9      ADC	R31,R25
    036A 8020      LDD	R2,Z+0
    036B 2022      TST	R2
    036C F409      BNE	0x036E
    036D C039      RJMP	0x03A7
(0295)             {  
(0296) 			if(new_add)//当new_add=0时表示无需更新地址
    036E 2366      TST	R22
    036F F081      BEQ	0x0380
(0297) 		      {
(0298) 		         if(new>15)
    0370 E08F      LDI	R24,0xF
    0371 90200060  LDS	R2,new
    0373 1582      CP	R24,R2
    0374 F418      BCC	0x0378
(0299) 			       address=0xb0+new;
    0375 2D42      MOV	R20,R2
    0376 5540      SUBI	R20,0x50
    0377 C003      RJMP	0x037B
(0300) 				 else
(0301) 			       address=0x80+new;
    0378 91400060  LDS	R20,new
    037A 5840      SUBI	R20,0x80
(0302) 			       LCD_write_char(0,address);//设置起始地址
    037B 2F24      MOV	R18,R20
    037C 2733      CLR	R19
    037D 2700      CLR	R16
    037E 2711      CLR	R17
    037F DD22      RCALL	_LCD_write_char
(0303) 		       }  			  
(0304) 			  LCD_write_char(1,data[new]);//写数据
    0380 E684      LDI	R24,0x64
    0381 E090      LDI	R25,0
    0382 91E00060  LDS	R30,new
    0384 27FF      CLR	R31
    0385 0FE8      ADD	R30,R24
    0386 1FF9      ADC	R31,R25
    0387 8120      LDD	R18,Z+0
    0388 2733      CLR	R19
    0389 E001      LDI	R16,1
    038A E010      LDI	R17,0
    038B DD16      RCALL	_LCD_write_char
(0305) 			  lcd_data[new]=data[new];
    038C E684      LDI	R24,0x64
    038D E090      LDI	R25,0
    038E 91E00060  LDS	R30,new
    0390 27FF      CLR	R31
    0391 0FE8      ADD	R30,R24
    0392 1FF9      ADC	R31,R25
    0393 8020      LDD	R2,Z+0
    0394 E884      LDI	R24,0x84
    0395 E090      LDI	R25,0
    0396 91E00060  LDS	R30,new
    0398 27FF      CLR	R31
    0399 0FE8      ADD	R30,R24
    039A 1FF9      ADC	R31,R25
    039B 8220      STD	Z+0,R2
(0306) 			  data[new]=0;//写完数据后,显存清0
    039C E684      LDI	R24,0x64
    039D E090      LDI	R25,0
    039E 91E00060  LDS	R30,new
    03A0 27FF      CLR	R31
    03A1 0FE8      ADD	R30,R24
    03A2 1FF9      ADC	R31,R25
    03A3 2422      CLR	R2
    03A4 8220      STD	Z+0,R2
(0307) 			  new_add=0;
    03A5 2766      CLR	R22
(0308) 			}
    03A6 C001      RJMP	0x03A8
(0309) 		else
(0310) 		   new_add=1;
    03A7 E061      LDI	R22,1
(0311) 		   new++;//
    03A8 91800060  LDS	R24,new
    03AA 5F8F      SUBI	R24,0xFF
    03AB 93800060  STS	new,R24
    03AD 91800060  LDS	R24,new
    03AF 3280      CPI	R24,0x20
    03B0 F408      BCC	0x03B2
    03B1 CFAC      RJMP	0x035E
    03B2 D186      RCALL	pop_gset2
    03B3 9508      RET
_LCD_write_CGRAM:
  n                    --> R20
  y                    --> R18
  x                    --> R16
    03B4 D190      RCALL	push_gset1
    03B5 814A      LDD	R20,Y+2
(0312)       }
(0313)   } 
(0314) /*----------------------------------------------------
(0315)     LCD_write_CGRAM:写CGRAM的函数
(0316) 	输入参数:
(0317)           X、Y    : 显示数据的起始的位置
(0318) 		        n    : 存入LCD的图案的编号
(0319) 	编写日期:2005/10/18
(0320) -----------------------------------------------------*/ 
(0321) void LCD_write_CGRAM(unsigned char x,unsigned char y,unsigned char n) 
(0322) {  
(0323)    if(y<2)
    03B6 3022      CPI	R18,2
    03B7 F430      BCC	0x03BE
(0324)    add=y*16+x;//设置起始座标
    03B8 E180      LDI	R24,0x10
    03B9 9F82      MUL	R24,R18
    03BA 2C20      MOV	R2,R0
    03BB 0E20      ADD	R2,R16
    03BC 92200063  STS	add,R2
(0325)     if(n==0)//0表示空数据
    03BE 2344      TST	R20
    03BF F409      BNE	0x03C1
(0326) 	n+=8;//所以要加上8  (0>8/1>9/2>10...7>15)  
    03C0 5F48      SUBI	R20,0xF8
(0327) 	data[add]=n;      
    03C1 E684      LDI	R24,0x64
    03C2 E090      LDI	R25,0
    03C3 91E00063  LDS	R30,add
    03C5 27FF      CLR	R31
    03C6 0FE8      ADD	R30,R24
    03C7 1FF9      ADC	R31,R25
    03C8 8340      STD	Z+0,R20
(0328) 	LCD_updata;
    03C9 2422      CLR	R2
    03CA 92200060  STS	new,R2
    03CC D17B      RCALL	pop_gset1
    03CD 9508      RET
_LCD_init_CGRAM:
  ads                  --> R20
  CGRAM                --> Y+0
  y                    --> R20
  x                    --> R22
    03CE D174      RCALL	push_gset2
    03CF 97EF      SBIW	R28,0x3F
    03D0 9721      SBIW	R28,1
(0329) }
(0330) /*----------------------------------------------------
(0331)     LCD_init_CGRAM:初始化CGRAM的函数
(0332) 	
(0333) 	编写日期:2005/10/18
(0334) -----------------------------------------------------*/ 
(0335) void LCD_init_CGRAM(void)
(0336)   {
(0337)      unsigned char CGRAM[8][8]=//CGRAM图案的定义
(0338) 	 {  //1     2      3       4       5      6        7      x
    03D1 E38A      LDI	R24,0x3A
    03D2 E090      LDI	R25,0
    03D3 01FE      MOVW	R30,R28
    03D4 E400      LDI	R16,0x40
    03D5 E010      LDI	R17,0
    03D6 93FA      ST	R31,-Y
    03D7 93EA      ST	R30,-Y
    03D8 939A      ST	R25,-Y
    03D9 938A      ST	R24,-Y
    03DA D181      RCALL	asgncblk
(0339) 	   {0x3F,0x01,0x01,0x01,0x01,0x01,0x3F,0x00},//0
(0340) 	   {0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00},//1
(0341) 	   {0x00,0x04,0x0E,0x15,0x04,0x04,0x04,0x00},//2
(0342) 	   {0x00,0x1F,0x15,0x0E,0x04,0x04,0x04,0x00},//3
(0343) 	   {0x00,0x1F,0x15,0x0A,0x04,0x04,0x04,0x00},//4
(0344) 	   {0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x00},//5
(0345) 	   {0x08,0x0C,0x0A,0x09,0x0A,0x0C,0x08,0x00},//6		
(0346) 	   {0x08,0x0C,0x0E,0x0F,0x0E,0x0C,0x08,0x00},//7
(0347) 	 };
(0348) 	   unsigned char ads=0x40;
    03DB E440      LDI	R20,0x40
(0349) 	   unsigned char x,y;
(0350) 	   
(0351) 	   LCD_write_char(0,ads);//写地址
    03DC 2F24      MOV	R18,R20
    03DD 2733      CLR	R19
    03DE 2700      CLR	R16
    03DF 2711      CLR	R17
    03E0 DCC1      RCALL	_LCD_write_char
(0352) 	   for(y=0;y<8;y++)
    03E1 2744      CLR	R20
    03E2 C015      RJMP	0x03F8
(0353) 	     { 
(0354) 		   for(x=0;x<8;x++)
    03E3 2766      CLR	R22
    03E4 C010      RJMP	0x03F5
(0355) 		     {
(0356) 			    LCD_write_char(1,CGRAM[y][x]);
    03E5 E088      LDI	R24,0x8
    03E6 9F84      MUL	R24,R20
    03E7 0110      MOVW	R2,R0
    03E8 01CE      MOVW	R24,R28
    03E9 0E28      ADD	R2,R24
    03EA 1E39      ADC	R3,R25
    03EB 2FE6      MOV	R30,R22
    03EC 27FF      CLR	R31
    03ED 0DE2      ADD	R30,R2
    03EE 1DF3      ADC	R31,R3
    03EF 8120      LDD	R18,Z+0
    03F0 2733      CLR	R19
    03F1 E001      LDI	R16,1
    03F2 E010      LDI	R17,0
    03F3 DCAE      RCALL	_LCD_write_char
    03F4 9563      INC	R22
    03F5 3068      CPI	R22,0x8
    03F6 F370      BCS	0x03E5
    03F7 9543      INC	R20
    03F8 3048      CPI	R20,0x8
    03F9 F348      BCS	0x03E3
    03FA 96EF      ADIW	R28,0x3F
    03FB 9621      ADIW	R28,1
    03FC D13C      RCALL	pop_gset2
    03FD 9508      RET
_main:
    03FE 9729      SBIW	R28,0x9
FILE: E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\main.c
(0001) //项目名称:LCD1602四线接口应用范例
(0002) //功能描述:测试4位数据线接口的LCD1602的驱动程序
(0003) //外部模块:LCD1602
(0004) //连接方法:   本例子的接线请参照LCD_1602.H中的定义
(0005) //如果要更改端口,只要修改LCD_1602.H上的定义即可  
(0006) //外部时钟:   8MHz  
(0007) //开发人员:书生
(0008) //开发日期:2006年2月13日凌晨
(0009) //*********************************************************
(0010) #include <iom8v.h>
(0011) #include <macros.h>
(0012) #include "LCD_1602.h"
(0013) 
(0014) unsigned char hour,min,sec,time;
(0015) unsigned int BT1_time,BT1_T,D882_P;
(0016) void delay_nms(unsigned int n);
(0017) void delay_nus(unsigned int n);
(0018) /*----------------------------------
(0019)             主程序
(0020) -----------------------------------*/
(0021) void main(void)

⌨️ 快捷键说明

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