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

📄 lcd_icc.lst

📁 用AVR及1602LCD在PROTEUS环境下仿真
💻 LST
📖 第 1 页 / 共 4 页
字号:
    014F 2F40      MOV	R20,R16
    0150 9722      SBIW	R28,2
FILE: D:\练习\LCD显示1602\lcd1602.c
(0001) //ICC-AVR application builder : 2007-4-21 20:12:02
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "lcd1602.h"
(0008) 
(0009) /*unsigned char TempBuffer[10];
(0010) void IntToStr(unsigned int t, unsigned char *str, unsigned char n) 
(0011) {
(0012) 	unsigned char a[5]; 
(0013) 	char i, j;                                 	
(0014) 	a[0]=(t/10000)%10;         //取得整数值到数组         	
(0015) 	a[1]=(t/1000)%10;                                     	
(0016) 	a[2]=(t/100)%10;                                      	
(0017) 	a[3]=(t/10)%10;                                       	
(0018) 	a[4]=(t/1)%10;                                        	
(0019)                                                       
(0020) 	for(i=0; i<5; i++)         //转成ASCII码              	
(0021) 		a[i]=a[i]+'0';                                    	
(0022) 	for(i=0; a[i]=='0' && i<=3; i++);                     	
(0023) 	for(j=5-n; j<i; j++)       //填充空格                 	
(0024) 		{ *str='a';  str++; }                             	
(0025) 	for(; i<5; i++)                                       	
(0026) 		{ *str=a[i]; str++; }  //加入有效的数字           	
(0027) 	*str='\0'; 
(0028) } */
(0029) 
(0030) unsigned char second[2],minute[2],hour[2];
(0031) unsigned char Year[4],Month[2],Day[2];
(0032) unsigned char sec=0,min=5,hou=18;
(0033) unsigned int year=2007;
(0034) unsigned char month=4,day=23;
(0035) unsigned char flash_flag=0,time_set=0;
(0036) 
(0037)  
(0038) void IntToStr(unsigned char t, unsigned char *str) 
(0039) {
(0040) 	unsigned char a[2]; 
(0041) 	char i;                                 	
(0042) 	                                     	
(0043) 	a[0]=(t/10)%10;   //取得整数值到数组                                      	
    0151 E01A      LDI	R17,0xA
    0152 2F04      MOV	R16,R20
    0153 940E05BE  CALL	div8u
    0155 E01A      LDI	R17,0xA
    0156 940E05BC  CALL	mod8u
    0158 8308      STD	Y+0,R16
(0044) 	a[1]=(t/1)%10;                                       	
    0159 E01A      LDI	R17,0xA
    015A 2F04      MOV	R16,R20
    015B 940E05BC  CALL	mod8u
    015D 8309      STD	Y+1,R16
(0045) 	for(i=0; i<2; i++)         //转成ASCII码              	
    015E 2744      CLR	R20
    015F C00A      RJMP	0x016A
(0046) 		a[i]=a[i]+'0'; 
    0160 01CE      MOVW	R24,R28
    0161 2E24      MOV	R2,R20
    0162 2433      CLR	R3
    0163 0E28      ADD	R2,R24
    0164 1E39      ADC	R3,R25
    0165 01F1      MOVW	R30,R2
    0166 8180      LDD	R24,Z+0
    0167 5D80      SUBI	R24,0xD0
    0168 8380      STD	Z+0,R24
    0169 9543      INC	R20
    016A 3042      CPI	R20,2
    016B F3A0      BCS	0x0160
(0047)     for(i=0;i<2;i++)
    016C 2744      CLR	R20
    016D C00B      RJMP	0x0179
(0048) 	{
(0049) 	 *str=a[i];
    016E 01CE      MOVW	R24,R28
    016F 2FE4      MOV	R30,R20
    0170 27FF      CLR	R31
    0171 0FE8      ADD	R30,R24
    0172 1FF9      ADC	R31,R25
    0173 8020      LDD	R2,Z+0
    0174 01FB      MOVW	R30,R22
    0175 8220      STD	Z+0,R2
(0050) 	 str++;
    0176 5F6F      SUBI	R22,0xFF
    0177 4F7F      SBCI	R23,0xFF
    0178 9543      INC	R20
    0179 3042      CPI	R20,2
    017A F398      BCS	0x016E
(0051) 	} 
(0052) 	*str='\0';
    017B 2422      CLR	R2
    017C 01FB      MOVW	R30,R22
    017D 8220      STD	Z+0,R2
    017E 9622      ADIW	R28,2
    017F 940E05D4  CALL	pop_gset2
    0181 9508      RET
_IntToStr1:
  j                    --> Y+1
  a                    --> Y+0
  i                    --> R20
  str                  --> R22
  t                    --> R20
    0182 940E05DD  CALL	push_gset2
    0184 01B9      MOVW	R22,R18
    0185 01A8      MOVW	R20,R16
    0186 9724      SBIW	R28,4
(0053) }
(0054) //**************************************************************
(0055) void IntToStr1(unsigned int t, unsigned char *str) 
(0056) {
(0057) 	unsigned char a[4]; 
(0058) 	char i, j;                                 	
(0059) 	a[0]=(t/1000)%10;         //取得整数值到数组         	
    0187 EE28      LDI	R18,0xE8
    0188 E033      LDI	R19,3
    0189 018A      MOVW	R16,R20
    018A 940E05A2  CALL	div16u
    018C E02A      LDI	R18,0xA
    018D E030      LDI	R19,0
    018E 940E05A0  CALL	mod16u
    0190 8308      STD	Y+0,R16
(0060) 	a[1]=(t/100)%10;                                     	
    0191 E624      LDI	R18,0x64
    0192 E030      LDI	R19,0
    0193 018A      MOVW	R16,R20
    0194 940E05A2  CALL	div16u
    0196 E02A      LDI	R18,0xA
    0197 E030      LDI	R19,0
    0198 940E05A0  CALL	mod16u
    019A 8309      STD	Y+1,R16
(0061) 	a[2]=(t/10)%10;                                      	
    019B E02A      LDI	R18,0xA
    019C E030      LDI	R19,0
    019D 018A      MOVW	R16,R20
    019E 940E05A2  CALL	div16u
    01A0 E02A      LDI	R18,0xA
    01A1 E030      LDI	R19,0
    01A2 940E05A0  CALL	mod16u
    01A4 830A      STD	Y+2,R16
(0062) 	a[3]=(t/1)%10;                              	                                      	
    01A5 E02A      LDI	R18,0xA
    01A6 E030      LDI	R19,0
    01A7 018A      MOVW	R16,R20
    01A8 940E05A0  CALL	mod16u
    01AA 830B      STD	Y+3,R16
(0063) 	for(i=0; i<4; i++)         //转成ASCII码              	
    01AB 2744      CLR	R20
    01AC C00A      RJMP	0x01B7
(0064) 		a[i]=a[i]+'0';
    01AD 01CE      MOVW	R24,R28
    01AE 2E24      MOV	R2,R20
    01AF 2433      CLR	R3
    01B0 0E28      ADD	R2,R24
    01B1 1E39      ADC	R3,R25
    01B2 01F1      MOVW	R30,R2
    01B3 8180      LDD	R24,Z+0
    01B4 5D80      SUBI	R24,0xD0
    01B5 8380      STD	Z+0,R24
    01B6 9543      INC	R20
    01B7 3044      CPI	R20,4
    01B8 F3A0      BCS	0x01AD
(0065) 	for(i=0;i<4;i++)
    01B9 2744      CLR	R20
    01BA C00B      RJMP	0x01C6
(0066) 	{
(0067) 	 *str=a[i];
    01BB 01CE      MOVW	R24,R28
    01BC 2FE4      MOV	R30,R20
    01BD 27FF      CLR	R31
    01BE 0FE8      ADD	R30,R24
    01BF 1FF9      ADC	R31,R25
    01C0 8020      LDD	R2,Z+0
    01C1 01FB      MOVW	R30,R22
    01C2 8220      STD	Z+0,R2
(0068) 	 str++;
    01C3 5F6F      SUBI	R22,0xFF
    01C4 4F7F      SBCI	R23,0xFF
    01C5 9543      INC	R20
    01C6 3044      CPI	R20,4
    01C7 F398      BCS	0x01BB
(0069) 	} 
(0070) 	*str='\0';
    01C8 2422      CLR	R2
    01C9 01FB      MOVW	R30,R22
    01CA 8220      STD	Z+0,R2
    01CB 9624      ADIW	R28,4
    01CC 940E05D4  CALL	pop_gset2
    01CE 9508      RET
(0071) }
(0072) 		  
(0073) //主函数
(0074) void main(void)
(0075) {
(0076)  /*unsigned char sec=0,min=5,hou=18;
(0077)  unsigned int year=2007;
(0078)  unsigned char month=4,day=23;*/
(0079)  
(0080)  init_devices();
_main:
    01CF DEAB      RCALL	_init_devices
(0081)  lcd_init();
    01D0 DF51      RCALL	_lcd_init
(0082)  GotoXY(0,0);
    01D1 2722      CLR	R18
    01D2 2700      CLR	R16
    01D3 DF3C      RCALL	_GotoXY
(0083)  Print("Date:");
    01D4 E806      LDI	R16,0x86
    01D5 E010      LDI	R17,0
    01D6 DF28      RCALL	_Print
(0084)  GotoXY(0,1);
    01D7 E021      LDI	R18,1
    01D8 2700      CLR	R16
    01D9 DF36      RCALL	_GotoXY
(0085)  asm("nop");
    01DA 0000      NOP
(0086)  Print("Time:           ");
    01DB E705      LDI	R16,0x75
    01DC E010      LDI	R17,0
    01DD DF21      RCALL	_Print
(0087)  //********************************************************
(0088)   GotoXY(13,0);//显示':'
    01DE 2722      CLR	R18
    01DF E00D      LDI	R16,0xD
    01E0 DF2F      RCALL	_GotoXY
(0089)   Print(":");
    01E1 E703      LDI	R16,0x73
    01E2 E010      LDI	R17,0
    01E3 DF1B      RCALL	_Print
(0090)   GotoXY(10,0);
    01E4 2722      CLR	R18
    01E5 E00A      LDI	R16,0xA
    01E6 DF29      RCALL	_GotoXY
(0091)   Print(":");
    01E7 E703      LDI	R16,0x73
    01E8 E010      LDI	R17,0
    01E9 DF15      RCALL	_Print
    01EA C0F0      RJMP	0x02DB
(0092)  //循环函数********************************************************
(0093)  while(1)
(0094)  {
(0095)  //********************************************************
(0096)   WDR();  
    01EB 95A8      WDR
(0097)   IntToStr(sec,&second[0]);//把两位的秒位转换成两个一位的数字才能显示;
    01EC E928      LDI	R18,0x98
    01ED E030      LDI	R19,0
    01EE 91000060  LDS	R16,sec
    01F0 DF5B      RCALL	_IntToStr
(0098)   GotoXY(12,1);
    01F1 E021      LDI	R18,1
    01F2 E00C      LDI	R16,0xC
    01F3 DF1C      RCALL	_GotoXY
(0099)   if(time_set!=1)
    01F4 91800068  LDS	R24,time_set
    01F6 3081      CPI	R24,1
    01F7 F021      BEQ	0x01FC
(0100)   {   
(0101)    Print(&second[0]);
    01F8 E908      LDI	R16,0x98
    01F9 E010      LDI	R17,0
    01FA DF04      RCALL	_Print
(0102)   }
    01FB C012      RJMP	0x020E
(0103)   else if(time_set==1)//当时间设定选定秒位时,秒位开始闪烁;
    01FC 91800068  LDS	R24,time_set
    01FE 3081      CPI	R24,1
    01FF F471      BNE	0x020E
(0104)   {
(0105)    if((flash_flag)%2==0)
    0200 E012      LDI	R17,2
    0201 91000067  LDS	R16,flash_flag
    0203 940E05BC  CALL	mod8u
    0205 2300      TST	R16
    0206 F421      BNE	0x020B
(0106)    {
(0107)     Print(&second[0]);
    0207 E908      LDI	R16,0x98
    0208 E010      LDI	R17,0
    0209 DEF5      RCALL	_Print
(0108)    }
    020A C003      RJMP	0x020E
(0109)    else
(0110)    {
(0111)     Print("  ");
    020B E700      LDI	R16,0x70
    020C E010      LDI	R17,0
    020D DEF1      RCALL	_Print
(0112)    }
(0113)   } 
(0114)   //********************************************************  
(0115)   if((flash_flag%2)==0)
    020E E012      LDI	R17,2
    020F 91000067  LDS	R16,flash_flag
    0211 940E05BC  CALL	mod8u
    0213 2300      TST	R16
    0214 F469      BNE	0x0222
(0116)   {
(0117)    GotoXY(11,1);//显示':'
    0215 E021      LDI	R18,1
    0216 E00B      LDI	R16,0xB
    0217 DEF8      RCALL	_GotoXY
(0118)    Print(":");
    0218 E703      LDI	R16,0x73
    0219 E010      LDI	R17,0
    021A DEE4      RCALL	_Print
(0119)    GotoXY(8,1);
    021B E021      LDI	R18,1
    021C E008      LDI	R16,0x8
    021D DEF2      RCALL	_GotoXY
(0120)    Print(":");
    021E E703      LDI	R16,0x73
    021F E010      LDI	R17,0
    0220 DEDE      RCALL	_Print
(0121)   }
    0221 C00C      RJMP	0x022E
(0122)   else
(0123)   {
(0124)    GotoXY(11,1);//显示' ';实现':'闪烁效果
    0222 E021      LDI	R18,1
    0223 E00B      LDI	R16,0xB
    0224 DEEB      RCALL	_GotoXY
(0125)    Print(" ");
    0225 E60E      LDI	R16,0x6E
    0226 E010      LDI	R17,0
    0227 DED7      RCALL	_Print
(0126)    GotoXY(8,1);
    0228 E021      LDI	R18,1
    0229 E008      LDI	R16,0x8
    022A DEE5      RCALL	_GotoXY
(0127)    Print(" ");
    022B E60E      LDI	R16,0x6E
    022C E010      LDI	R17,0
    022D DED1      RCALL	_Print
(0128)   } 
(0129)   //********************************************************  
(0130)   IntToStr(min,&minute[0]);//转换分位,显示
    022E E926      LDI	R18,0x96
    022F E030      LDI	R19,0
    0230 91000061  LDS	R16,min
    0232 DF19      RCALL	_IntToStr
(0131)   GotoXY(9,1);
    0233 E021      LDI	R18,1
    0234 E009      LDI	R16,0x9
    0235 DEDA      RCALL	_GotoXY
(0132)   if(time_set!=2)//按下时间设定键,第2下为分设置
    0236 91800068  LDS	R24,time_set
    0238 3082      CPI	R24,2
    0239 F021      BEQ	0x023E
(0133)   {   
(0134)    Print(&minute[0]);
    023A E906      LDI	R16,0x96
    023B E010      LDI	R17,0
    023C DEC2      RCALL	_Print
(0135)   }
    023D C012      RJMP	0x0250
(0136)   else if(time_set==2)
    023E 91800068  LDS	R24,time_set
    0240 3082      CPI	R24,2
    0241 F471      BNE	0x0250
(0137)   {
(0138)    if((flash_flag)%2==0)
    0242 E012      LDI	R17,2
    0243 91000067  LDS	R16,flash_flag
    0245 940E05BC  CALL	mod8u
    0247 2300      TST	R16
    0248 F421      BNE	0x024D
(0139)    {
(0140)     Print(&minute[0]);
    0249 E906      LDI	R16,0x96
    024A E010      LDI	R17,0
    024B DEB3      RCALL	_Print
(0141)    }
    024C C003      RJMP	0x0250
(0142)    else
(0143)    {
(0144)     Print("  ");
    024D E700      LDI	R16,0x70
    024E E010      LDI	R17,0
    024F DEAF      RCALL	_Print
(0145)    }
(0146)   }  
(0147)   //********************************************************  
(0148)   IntToStr(hou,&hour[0]);//转换小时位,显示
    0250 E924      LDI	R18,0x94
    0251 E030      LDI	R19,0
    0252 91000062  LDS	R16,hou
    0254 DEF7      RCALL	_IntToStr
(0149)   GotoXY(6,1);
    0255 E021      LDI	R18,1
    0256 E006      LDI	R16,6
    0257 DEB8      RCALL	_GotoXY
(0150)   if(time_set!=3)//按下时间设定键,第3下为小时设置
    0258 91800068  LDS	R24,time_set
    025A 3083      CPI	R24,3
    025B F021      BEQ	0x0260
(0151)   {   
(0152)    Print(&hour[0]);
    025C E904      LDI	R16,0x94
    025D E010      LDI	R17,0
    025E DEA0      RCALL	_Print
(0153)   }
    025F C012      RJMP	0x0272
(0154)   else if(time_set==3)
    0260 91800068  LDS	R24,time_set
    0262 3083      CPI	R24,3
    0263 F471      BNE	0x0272
(0155)   {
(0156)    if((flash_flag)%2==0)
    0264 E012      LDI	R17,2
    0265 91000067  LDS	R16,flash_flag
    0267 940E05BC  CALL	mod8u
    0269 2300      TST	R16
    026A F421      BNE	0x026F
(0157)    {
(0158)     Print(&hour[0]);
    026B E904      LDI	R16,0x94
    026C E010      LDI	R17,0
    026D DE91      RCALL	_Print
(0159)    }
    026E C003      RJMP	0x0272
(0160)    else
(0161)    {
(0162)     Print("  ");
    026F E700      LDI	R16,0x70
    0270 E010      LDI	R17,0
    0271 DE8D      RCALL	_Print
(0163)    }
(0164)   }  
(0165)   //********************************************************
(0166)   IntToStr(day,&Day[0]);//转换日位,显示
    0272 E82C      LDI	R18,0x8C
    0273 E030      LDI	R19,0
    0274 91000066  LDS	R16,day
    0276 DED5      RCALL	_IntToStr
(0167)   GotoXY(14,0);
    0277 2722      CLR	R18
    0278 E00E      LDI	R16,0xE
    0279 DE96      RCALL	_GotoXY
(0168)   if(time_set!=4)//按下时间设定键,第4下为日设置
    027A 91800068  LDS	R24,time_set
    027C 3084      CPI	R24,4
    027D F021      BEQ	0x0282
(0169)   {   
(0170)    Print(&Day[0]);
    027E E80C      LDI	R16,0x8C
    027F E010      LDI	R17,0
    0280 DE7E      RCALL	_Print
(0171)   }
    0281 C012      RJMP	0x0294
(0172)   else if(time_set==4)
    0282 91800068  LDS	R24,time_set
    0284 3084      CPI	R24,4
    0285 F471      BNE	0x0294
(0173)   {
(0174)    if((flash_flag)%2==0)
    0286 E012      LDI	R17,2
    0287 91000067  LDS	R16,flash_flag
    0289 940E05BC  CALL	mod8u
    028B 2300      TST	R16
    028C F421      BNE	0x0291
(0175)    {
(0176)     Print(&Day[0]);
    028D E80C      LDI	R16,0x8C
    028E E010      LDI	R17,0
    028F DE6F      RCALL	_Print
(0177)    }
    0290 C003      RJMP	0x0294
(0178)    else
(0179)    {
(0180)     Print("  ");
    0291 E700      LDI	R16,0x70
    0292 E010      LDI	R17,0
    0293 DE6B      RCALL	_Print
(0181)    }
(0182)   }  
(0183)   
(0184)   //********************************************************
(0185)   IntToStr(month,&Month[0]);//转换月位,显示
    0294 E82E      LDI	R18,0x8E
    0295 E030      LDI	R19,0
    0296 91000065  LDS	R16,month
    0298 DEB3      RCALL	_IntToStr
(0186)   GotoXY(11,0);
    0299 2722      CLR	R18
    029A E00B      LDI	R16,0xB
    029B DE74      RCALL	_GotoXY
(0187)   if(time_set!=5)//按下时间设定键,第5下为月设置
    029C 91800068  LDS	R24,time_set
    029E 3085      CPI	R24,5
    029F F021      BEQ	0x02A4
(0188)   {   
(0189)    Print(&Month[0]);
    02A0 E80E      LDI	R16,0x8E
    02A1 E010      LDI	R17,0
    02A2 DE5C      RCALL	_Print
(0190)   }
    02A3 C012      RJMP	0x02B6
(0191)   else if(time_set==5)
    02A4 91800068  LDS	R24,time_set
    02A6 3085      CPI	R24,5

⌨️ 快捷键说明

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