📄 lcd_icc.lst
字号:
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 + -