📄 rtc.lst
字号:
0241 2FF7 MOV R31,R23
0242 8180 LDD R24,Z+0
0243 778F ANDI R24,0x7F
0244 8380 STD Z+0,R24
(0258) Flag=temp1+13;
0245 2F6C MOV R22,R28
0246 2F7D MOV R23,R29
0247 5F60 SUBI R22,0xF0
0248 4F7F SBCI R23,0xFF
(0259) (*Flag)|=0x80;}
0249 2FE6 MOV R30,R22
024A 2FF7 MOV R31,R23
024B 8180 LDD R24,Z+0
024C 6880 ORI R24,0x80
024D 8380 STD Z+0,R24
024E C002 RJMP 0x0251
(0260) else Flag--;
024F 5061 SUBI R22,1
0250 4070 SBCI R23,0
(0261) (*Flag)|=0x80; //当前位加上小数点显示
0251 2FE6 MOV R30,R22
0252 2FF7 MOV R31,R23
0253 8180 LDD R24,Z+0
0254 6880 ORI R24,0x80
0255 8380 STD Z+0,R24
(0262) (*(Flag+1))&=0x7f; //下一位去掉点小数点显示
0256 9631 ADIW R30,1
0257 8180 LDD R24,Z+0
0258 778F ANDI R24,0x7F
0259 8380 STD Z+0,R24
(0263) break;
025A C003 RJMP 0x025E
(0264) case 0x40:Enter_Flag=1;break;//"确定"键处理
025B E081 LDI R24,1
025C 93800071 STS _Enter_Flag,R24
025E 90200071 LDS R2,_Enter_Flag
0260 2022 TST R2
0261 F409 BNE 0x0263
0262 CF5B RJMP 0x01BE
(0265) // case 0x80:Enter_Flag=1;break; //测试用
(0266) default:break;}
(0267)
(0268) }
(0269) Enter_Flag=0; //按键状态恢复
0263 2422 CLR R2
0264 92200071 STS _Enter_Flag,R2
(0270) temp2[0]=0x00; //秒,默认从00开始计时
0266 8A2C STD Y+20,R2
(0271) temp2[1]=(temp1[11]<<4)|temp1[12];//分
0267 842F LDD R2,Y+15
0268 858E LDD R24,Y+14
0269 708F ANDI R24,0xF
026A 9582 SWAP R24
026B 2982 OR R24,R2
026C 8B8D STD Y+21,R24
(0272) temp2[2]=(temp1[9]<<4)|temp1[10]; //时
026D 842D LDD R2,Y+13
026E 858C LDD R24,Y+12
026F 708F ANDI R24,0xF
0270 9582 SWAP R24
0271 2982 OR R24,R2
0272 8B8E STD Y+22,R24
(0273) temp2[3]=temp1[8]; //周
0273 842B LDD R2,Y+11
0274 8A2F STD Y+23,R2
(0274) temp2[4]=(temp1[6]<<4)|temp1[7]; //日
0275 842A LDD R2,Y+10
0276 8589 LDD R24,Y+9
0277 708F ANDI R24,0xF
0278 9582 SWAP R24
0279 2982 OR R24,R2
027A 8F88 STD Y+24,R24
(0275) temp2[5]=(temp1[4]<<4)|temp1[5]; //月
027B 8428 LDD R2,Y+8
027C 818F LDD R24,Y+7
027D 708F ANDI R24,0xF
027E 9582 SWAP R24
027F 2982 OR R24,R2
0280 8F89 STD Y+25,R24
(0276) temp2[6]=(temp1[2]<<4)|temp1[3]; //年
0281 802E LDD R2,Y+6
0282 818D LDD R24,Y+5
0283 708F ANDI R24,0xF
0284 9582 SWAP R24
0285 2982 OR R24,R2
0286 8F8A STD Y+26,R24
(0277) Write_Nbyte(SD2303,0x00,temp2,7); //初始化设定时间
0287 E087 LDI R24,7
0288 838A STD Y+2,R24
0289 2F8C MOV R24,R28
028A 2F9D MOV R25,R29
028B 9644 ADIW R24,0x14
028C 8399 STD Y+1,R25
028D 8388 STD Y+0,R24
028E 2722 CLR R18
028F E604 LDI R16,0x64
0290 DE74 RCALL _Write_Nbyte
(0278) }
(0279) if(Key==0xfd) //"闹铃设置"键按下
0291 2D8A MOV R24,R10
0292 3F8D CPI R24,0xFD
0293 F009 BEQ 0x0295
0294 C0DD RJMP 0x0372
(0280) {temp1[9]|=0x80;
0295 858C LDD R24,Y+12
0296 6880 ORI R24,0x80
0297 878C STD Y+12,R24
(0281) Flag=temp1+9; //定时小时高位设置提示
0298 2F6C MOV R22,R28
0299 2F7D MOV R23,R29
029A 5F64 SUBI R22,0xF4
029B 4F7F SBCI R23,0xFF
029C C09F RJMP 0x033C
(0282) while(!Enter_Flag) //直到按下确定键方停止
(0283) {for(i=0;i<50;i++)
029D 2744 CLR R20
029E C006 RJMP 0x02A5
(0284) Display(temp1);
029F 2F0C MOV R16,R28
02A0 2F1D MOV R17,R29
02A1 5F0D SUBI R16,0xFD
02A2 4F1F SBCI R17,0xFF
02A3 DDA9 RCALL _Display
02A4 9543 INC R20
02A5 3342 CPI R20,0x32
02A6 F3C0 BCS 0x029F
(0285) Key=~PINB;
02A7 B2A6 IN R10,0x16
02A8 94A0 COM R10
(0286) switch(Key)
02A9 2CCA MOV R12,R10
02AA 24DD CLR R13
02AB 2D8C MOV R24,R12
02AC 2D9D MOV R25,R13
02AD 3180 CPI R24,0x10
02AE E0E0 LDI R30,0
02AF 079E CPC R25,R30
02B0 F409 BNE 0x02B2
02B1 C043 RJMP 0x02F5
02B2 E180 LDI R24,0x10
02B3 158C CP R24,R12
02B4 059D CPC R25,R13
02B5 F094 BLT 0x02C8
02B6 2D8C MOV R24,R12
02B7 2D9D MOV R25,R13
02B8 3084 CPI R24,4
02B9 E0E0 LDI R30,0
02BA 079E CPC R25,R30
02BB F101 BEQ 0x02DC
02BC 3084 CPI R24,4
02BD E0E0 LDI R30,0
02BE 079E CPC R25,R30
02BF F40C BGE 0x02C1
02C0 C07B RJMP 0x033C
02C1 2D8C MOV R24,R12
02C2 2D9D MOV R25,R13
02C3 3088 CPI R24,0x8
02C4 E0E0 LDI R30,0
02C5 079E CPC R25,R30
02C6 F109 BEQ 0x02E8
02C7 C074 RJMP 0x033C
02C8 2D8C MOV R24,R12
02C9 2D9D MOV R25,R13
02CA 3280 CPI R24,0x20
02CB E0E0 LDI R30,0
02CC 079E CPC R25,R30
02CD F409 BNE 0x02CF
02CE C049 RJMP 0x0318
02CF 3280 CPI R24,0x20
02D0 E0E0 LDI R30,0
02D1 079E CPC R25,R30
02D2 F40C BGE 0x02D4
02D3 C068 RJMP 0x033C
02D4 2D8C MOV R24,R12
02D5 2D9D MOV R25,R13
02D6 3480 CPI R24,0x40
02D7 E0E0 LDI R30,0
02D8 079E CPC R25,R30
02D9 F409 BNE 0x02DB
02DA C05E RJMP 0x0339
02DB C060 RJMP 0x033C
(0287) {case 0x04: //"+"按键处理
(0288) (*Flag)++;
02DC 2FE6 MOV R30,R22
02DD 2FF7 MOV R31,R23
02DE 8180 LDD R24,Z+0
02DF 5F8F SUBI R24,0xFF
02E0 8380 STD Z+0,R24
(0289) if(((*Flag)&0x7f)==10) *Flag=0|0x80;
02E1 778F ANDI R24,0x7F
02E2 308A CPI R24,0xA
02E3 F009 BEQ 0x02E5
02E4 C057 RJMP 0x033C
02E5 E880 LDI R24,0x80
02E6 8380 STD Z+0,R24
(0290) break;
02E7 C054 RJMP 0x033C
(0291) case 0x08: //"-"按键处理
(0292) if(((*Flag)&0x7f)==0) *Flag=10|0x80;
02E8 2FE6 MOV R30,R22
02E9 2FF7 MOV R31,R23
02EA 8180 LDD R24,Z+0
02EB 778F ANDI R24,0x7F
02EC F411 BNE 0x02EF
02ED E88A LDI R24,0x8A
02EE 8380 STD Z+0,R24
(0293) (*Flag)--;
02EF 2FE6 MOV R30,R22
02F0 2FF7 MOV R31,R23
02F1 8180 LDD R24,Z+0
02F2 5081 SUBI R24,1
02F3 8380 STD Z+0,R24
(0294) break;
02F4 C047 RJMP 0x033C
(0295) case 0x10: //"下一位"按键处理
(0296) Flag++;
02F5 5F6F SUBI R22,0xFF
02F6 4F7F SBCI R23,0xFF
(0297) (*(Flag-1))&=0x7f; //上一位去掉小数点显示
02F7 2F86 MOV R24,R22
02F8 2F97 MOV R25,R23
02F9 9701 SBIW R24,1
02FA 2FE8 MOV R30,R24
02FB 2FF9 MOV R31,R25
02FC 8180 LDD R24,Z+0
02FD 778F ANDI R24,0x7F
02FE 8380 STD Z+0,R24
(0298) (*Flag)|=0x80; //当前位加上小数点显示
02FF 2FE6 MOV R30,R22
0300 2FF7 MOV R31,R23
0301 8180 LDD R24,Z+0
0302 6880 ORI R24,0x80
0303 8380 STD Z+0,R24
(0299) if(Flag==temp1+13)
0304 2F8C MOV R24,R28
0305 2F9D MOV R25,R29
0306 9640 ADIW R24,0x10
0307 17E8 CP R30,R24
0308 07F9 CPC R31,R25
0309 F009 BEQ 0x030B
030A C031 RJMP 0x033C
(0300) {(*Flag)&=0x7f;
030B 8180 LDD R24,Z+0
030C 778F ANDI R24,0x7F
030D 8380 STD Z+0,R24
(0301) Flag=temp1+9;
030E 2F6C MOV R22,R28
030F 2F7D MOV R23,R29
0310 5F64 SUBI R22,0xF4
0311 4F7F SBCI R23,0xFF
(0302) (*Flag)|=0x80;}
0312 2FE6 MOV R30,R22
0313 2FF7 MOV R31,R23
0314 8180 LDD R24,Z+0
0315 6880 ORI R24,0x80
0316 8380 STD Z+0,R24
(0303) break;
0317 C024 RJMP 0x033C
(0304) case 0x20: //"上一位"按键处理
(0305) if(Flag==temp1+9)
0318 2F8C MOV R24,R28
0319 2F9D MOV R25,R29
031A 960C ADIW R24,0xC
031B 1768 CP R22,R24
031C 0779 CPC R23,R25
031D F479 BNE 0x032D
(0306) {(*Flag)&=0x7f;
031E 2FE6 MOV R30,R22
031F 2FF7 MOV R31,R23
0320 8180 LDD R24,Z+0
0321 778F ANDI R24,0x7F
0322 8380 STD Z+0,R24
(0307) Flag=temp1+13;
0323 2F6C MOV R22,R28
0324 2F7D MOV R23,R29
0325 5F60 SUBI R22,0xF0
0326 4F7F SBCI R23,0xFF
(0308) (*Flag)|=0x80;}
0327 2FE6 MOV R30,R22
0328 2FF7 MOV R31,R23
0329 8180 LDD R24,Z+0
032A 6880 ORI R24,0x80
032B 8380 STD Z+0,R24
032C C002 RJMP 0x032F
(0309) else Flag--;
032D 5061 SUBI R22,1
032E 4070 SBCI R23,0
(0310) (*Flag)|=0x80; //当前位加上小数点显示
032F 2FE6 MOV R30,R22
0330 2FF7 MOV R31,R23
0331 8180 LDD R24,Z+0
0332 6880 ORI R24,0x80
0333 8380 STD Z+0,R24
(0311) (*(Flag+1))&=0x7f; //下一位去掉小数点显示
0334 9631 ADIW R30,1
0335 8180 LDD R24,Z+0
0336 778F ANDI R24,0x7F
0337 8380 STD Z+0,R24
(0312) break;
0338 C003 RJMP 0x033C
(0313) case 0x40:Enter_Flag=1;break;//"确定"键处理
0339 E081 LDI R24,1
033A 93800071 STS _Enter_Flag,R24
033C 90200071 LDS R2,_Enter_Flag
033E 2022 TST R2
033F F409 BNE 0x0341
0340 CF5C RJMP 0x029D
(0314) // case 0x80:Enter_Flag=1;break;//测试用
(0315) default:break;}
(0316)
(0317) }
(0318) Enter_Flag=0;
0341 2422 CLR R2
0342 92200071 STS _Enter_Flag,R2
(0319) temp3[0]=((temp1[11]<<4)|temp1[12])&0x7f; //分数据处理,去掉小数点
0344 842F LDD R2,Y+15
0345 858E LDD R24,Y+14
0346 708F ANDI R24,0xF
0347 9582 SWAP R24
0348 2982 OR R24,R2
0349 778F ANDI R24,0x7F
034A 8F8B STD Y+27,R24
(0320) temp3[1]=((temp1[9]<<4)|temp1[10])&0x7f; //时数据处理,去掉小数点
034B 842D LDD R2,Y+13
034C 858C LDD R24,Y+12
034D 708F ANDI R24,0xF
034E 9582 SWAP R24
034F 2982 OR R24,R2
0350 778F ANDI R24,0x7F
0351 8F8C STD Y+28,R24
(0321) if((temp3[0]<0x60)&&(temp3[1]<0x24)) //判断是否为合法时间
0352 8D8B LDD R24,Y+27
0353 3680 CPI R24,0x60
0354 F4C0 BCC 0x036D
0355 8D8C LDD R24,Y+28
0356 3284 CPI R24,0x24
0357 F4A8 BCC 0x036D
(0322) {Write_1byte(SD2303,0x0e,0b10110000); //开启闹铃使能
0358 EB80 LDI R24,0xB0
0359 8388 STD Y+0,R24
035A E02E LDI R18,0xE
035B E604 LDI R16,0x64
035C DDD1 RCALL _Write_1byte
(0323) Write_1byte(SD2303,0x0f,0b00101000); //开始中断使能
035D E288 LDI R24,0x28
035E 8388 STD Y+0,R24
035F E02F LDI R18,0xF
0360 E604 LDI R16,0x64
0361 DDCC RCALL _Write_1byte
(0324) Write_Nbyte(SD2303,0x08,temp3,3);} //初始化闹铃设置
0362 E083 LDI R24,3
0363 838A STD Y+2,R24
0364 2F8C MOV R24,R28
0365 2F9D MOV R25,R29
0366 964B ADIW R24,0x1B
0367 8399 STD Y+1,R25
0368 8388 STD Y+0,R24
0369 E028 LDI R18,0x8
036A E604 LDI R16,0x64
036B DD99 RCALL _Write_Nbyte
036C C005 RJMP 0x0372
(0325) else
(0326) Write_1byte(SD2303,0x0e,0b00110000); //取消闹铃功能
036D E380 LDI R24,0x30
036E 8388 STD Y+0,R24
036F E02E LDI R18,0xE
0370 E604 LDI R16,0x64
0371 DDBC RCALL _Write_1byte
(0327) }
(0328) }
(0329) }
0372 966E ADIW R28,0x1E
0373 D101 RCALL pop_gset4
0374 9508 RET
_Convert:
temp --> Y+1
p2 --> R20
p1 --> R22
0375 D11A RCALL push_gset2
0376 2F42 MOV R20,R18
0377 2F53 MOV R21,R19
0378 2F60 MOV R22,R16
(0330)
(0331)
(0332) //***************************DS1722函数开始************************//
(0333)
(0334) void Convert(uchar p1,uchar *p2)
(0335) {uchar temp;
(0336) if(p1&0x80)
0379 FF67 SBRS R22,7
037A C00A RJMP 0x0385
(0337) {p2[13]=10; //零下温度用10表示
037B E08A LDI R24,0xA
037C 2FE4 MOV R30,R20
037D 2FF5 MOV R31,R21
037E 8785 STD Z+13,R24
(0338) p1=0xff-p1;} //温度绝对值
037F 2E26 MOV R2,R22
0380 2433 CLR R3
0381 EF6F LDI R22,0xFF
0382 1962 SUB R22,R2
0383 0973 SBC R23,R3
0384 C004 RJMP 0x0389
(0339) else
(0340) p2[13]=11; //零上温度用11表示
0385 E08B LDI R24,0xB
0386 2FE4 MOV R30,R20
0387 2FF5 MOV R31,R21
0388 8785 STD Z+13,R24
(0341) p2[14]=p1/10; //温度十位
0389 E01A LDI R17,0xA
038A 2F06 MOV R16,R22
038B D0CF RCALL div8u
038C 2FE4 MOV R30,R20
038D 2FF5 MOV R31,R21
038E 8706 STD Z+14,R16
(0342) p2[15]=p1-p2[14]*10; //温度个位
038F 2FE4 MOV R30,R20
0390 2FF5 MOV R31,R21
0391 8516 LDD R17,Z+14
0392 E00A LDI R16,0xA
0393 D108 RCALL mpy8s
0394 2E26 MOV R2,R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -