📄 time_1302.lst
字号:
time2 --> Y+16
time1 --> Y+0
i --> R20
01A1 D0B5 RCALL push_gset1
01A2 97A0 SBIW R28,0x20
(0306) }
(0307) /********************************************************
(0308) 子程序名: out_data_pc232()
(0309) 功 能: 串口发送时间数据到PC,
(0310) 输入参数: /
(0311) 输出参数: /
(0312) 描 述: 包括"当前的温度是:xxx.xx摄氏度",此程序借助LCD的显示缓冲区
(0313) ********************************************************/
(0314) void out_data_pc232(void)
(0315) {
(0316) uchar i;
(0317) uchar time1[16]=" 今天的日期是:";
01A3 E28A LDI R24,0x2A
01A4 E090 LDI R25,0
01A5 01FE MOVW R30,R28
01A6 E100 LDI R16,0x10
01A7 E010 LDI R17,0
01A8 93FA ST R31,-Y
01A9 93EA ST R30,-Y
01AA 939A ST R25,-Y
01AB 938A ST R24,-Y
01AC D0C7 RCALL asgncblk
(0318) uchar time2[16]=" 当前的时间是:";
01AD E38A LDI R24,0x3A
01AE E090 LDI R25,0
01AF 01FE MOVW R30,R28
01B0 9670 ADIW R30,0x10
01B1 E100 LDI R16,0x10
01B2 E010 LDI R17,0
01B3 93FA ST R31,-Y
01B4 93EA ST R30,-Y
01B5 939A ST R25,-Y
01B6 938A ST R24,-Y
01B7 D0BC RCALL asgncblk
(0319)
(0320) for(i=0;i<16;i++) //向串口发送数据
01B8 2744 CLR R20
01B9 C008 RJMP 0x01C2
(0321) {
(0322) write_pc232(time1[i]);
01BA 01CE MOVW R24,R28
01BB 2FE4 MOV R30,R20
01BC 27FF CLR R31
01BD 0FE8 ADD R30,R24
01BE 1FF9 ADC R31,R25
01BF 8100 LDD R16,Z+0
01C0 DF73 RCALL _write_pc232
01C1 9543 INC R20
01C2 3140 CPI R20,0x10
01C3 F3B0 BCS 0x01BA
(0323) }
(0324) write_pc232('2'); //年
01C4 E302 LDI R16,0x32
01C5 DF6E RCALL _write_pc232
(0325) write_pc232('0');
01C6 E300 LDI R16,0x30
01C7 DF6C RCALL _write_pc232
(0326) write_pc232(buf_time[7]);
01C8 91000067 LDS R16,0x67
01CA DF69 RCALL _write_pc232
(0327) write_pc232(buf_time[8]);
01CB 91000068 LDS R16,0x68
01CD DF66 RCALL _write_pc232
(0328) write_pc232('-');
01CE E20D LDI R16,0x2D
01CF DF64 RCALL _write_pc232
(0329) write_pc232(buf_time[10]); //月
01D0 9100006A LDS R16,0x6A
01D2 DF61 RCALL _write_pc232
(0330) write_pc232(buf_time[11]);
01D3 9100006B LDS R16,0x6B
01D5 DF5E RCALL _write_pc232
(0331) write_pc232('-');
01D6 E20D LDI R16,0x2D
01D7 DF5C RCALL _write_pc232
(0332) write_pc232(buf_time[13]); //日
01D8 9100006D LDS R16,0x6D
01DA DF59 RCALL _write_pc232
(0333) write_pc232(buf_time[14]);
01DB 9100006E LDS R16,0x6E
01DD DF56 RCALL _write_pc232
(0334)
(0335) for(i=0;i<16;i++) //向串口发送数据
01DE 2744 CLR R20
01DF C009 RJMP 0x01E9
(0336) {
(0337) write_pc232(time2[i]);
01E0 01CE MOVW R24,R28
01E1 9640 ADIW R24,0x10
01E2 2FE4 MOV R30,R20
01E3 27FF CLR R31
01E4 0FE8 ADD R30,R24
01E5 1FF9 ADC R31,R25
01E6 8100 LDD R16,Z+0
01E7 DF4C RCALL _write_pc232
01E8 9543 INC R20
01E9 3140 CPI R20,0x10
01EA F3A8 BCS 0x01E0
(0338) }
(0339) write_pc232(buf_time[22]); //时
01EB 91000076 LDS R16,0x76
01ED DF46 RCALL _write_pc232
(0340) write_pc232(buf_time[23]);
01EE 91000077 LDS R16,0x77
01F0 DF43 RCALL _write_pc232
(0341) write_pc232(':');
01F1 E30A LDI R16,0x3A
01F2 DF41 RCALL _write_pc232
(0342) write_pc232(buf_time[25]); //分
01F3 91000079 LDS R16,0x79
01F5 DF3E RCALL _write_pc232
(0343) write_pc232(buf_time[26]);
01F6 9100007A LDS R16,0x7A
01F8 DF3B RCALL _write_pc232
(0344) write_pc232(':');
01F9 E30A LDI R16,0x3A
01FA DF39 RCALL _write_pc232
(0345) write_pc232(buf_time[28]); //秒
01FB 9100007C LDS R16,0x7C
01FD DF36 RCALL _write_pc232
(0346) write_pc232(buf_time[29]);
01FE 9100007D LDS R16,0x7D
0200 DF33 RCALL _write_pc232
(0347)
(0348) write_pc232('\n');
0201 E00A LDI R16,0xA
0202 DF31 RCALL _write_pc232
(0349) write_pc232('\r'); //显示回车换行
0203 E00D LDI R16,0xD
0204 DF2F RCALL _write_pc232
0205 96A0 ADIW R28,0x20
0206 D053 RCALL pop_gset1
0207 9508 RET
_main:
buf_logo --> Y+0
data_old --> R20
0208 97A1 SBIW R28,0x21
(0350) }
(0351) //*****************主程序**********************************
(0352) void main (void)
(0353) {
(0354) uchar data_old;
(0355) uchar buf_logo[]=" welcome! www.itsn.cn! ";
0209 E48A LDI R24,0x4A
020A E090 LDI R25,0
020B 01FE MOVW R30,R28
020C E201 LDI R16,0x21
020D E010 LDI R17,0
020E 93FA ST R31,-Y
020F 93EA ST R30,-Y
0210 939A ST R25,-Y
0211 938A ST R24,-Y
0212 D061 RCALL asgncblk
(0356)
(0357) mcu_Init(); //单片机初始化
0213 DF2A RCALL _mcu_Init
(0358) usart_Init(); //串口初始化
0214 DF2E RCALL _usart_Init
(0359) init_lcd(); //lcd初始化
0215 DE81 RCALL _init_lcd
(0360)
(0361) write_pc232('o'); //测试串口
0216 E60F LDI R16,0x6F
0217 DF1C RCALL _write_pc232
(0362) write_pc232('k'); //测试串口
0218 E60B LDI R16,0x6B
0219 DF1A RCALL _write_pc232
(0363) write_pc232('\n');
021A E00A LDI R16,0xA
021B DF18 RCALL _write_pc232
(0364) write_pc232('\r'); //显示回车换行
021C E00D LDI R16,0xD
021D DF16 RCALL _write_pc232
(0365)
(0366) display_lcd(buf_logo); //显示LOGO
021E 018E MOVW R16,R28
021F DE82 RCALL _display_lcd
(0367) spk (1000); //上电蜂鸣器长响
0220 EE08 LDI R16,0xE8
0221 DF26 RCALL _spk
(0368) DelaymS(2000); //长延迟
0222 ED00 LDI R16,0xD0
0223 E017 LDI R17,7
0224 DE45 RCALL _DelaymS
(0369) display_lcd(buf_time); //开始工作,LCD刷新显示一屏
0225 E600 LDI R16,0x60
0226 E010 LDI R17,0
0227 DE7A RCALL _display_lcd
(0370) spk (100); //开始工作,蜂鸣器短响
0228 E604 LDI R16,0x64
0229 DF1E RCALL _spk
(0371)
(0372) //---------此段测试1302是否已经写过内容了,若写过就不再重新写。
(0373) read_DS1302(); //读时间
022A DEEC RCALL _read_DS1302
(0374) if(buf_read[0] & 0x80)
022B 90200089 LDS R2,buf_read
022D FE27 SBRS R2,7
022E C001 RJMP 0x0230
(0375) {
(0376) write_DS1302(); //写入需要的初始时间值,
022F DEBD RCALL _write_DS1302
(0377) }
(0378) //------------------
(0379)
(0380) DelaymS(1); //延迟
0230 E001 LDI R16,1
0231 E010 LDI R17,0
0232 DE37 RCALL _DelaymS
(0381) read_DS1302(); //读时间
0233 DEE3 RCALL _read_DS1302
(0382) data_old = buf_read[0]; //提取旧时钟的秒数值
0234 91400089 LDS R20,buf_read
0236 C013 RJMP 0x024A
(0383) while(1) //无限循环执行,此程序保证了一秒钟更新一次串口数据,更新一次LCD显示。
(0384) {
(0385) DelaymS(10); //延迟
0237 E00A LDI R16,0xA
0238 E010 LDI R17,0
0239 DE30 RCALL _DelaymS
(0386) read_DS1302(); //读时间
023A DEDC RCALL _read_DS1302
(0387) if (data_old == buf_read[0])
023B 90200089 LDS R2,buf_read
023D 1542 CP R20,R2
023E F421 BNE 0x0243
(0388) {
(0389) DelaymS(10); //延迟
023F E00A LDI R16,0xA
0240 E010 LDI R17,0
0241 DE28 RCALL _DelaymS
(0390) }
0242 C007 RJMP 0x024A
(0391) else
(0392) {
(0393) data_conversion(); //将读出的数据分开,分别装入显存
0243 DF0E RCALL _data_conversion
(0394) display_lcd(buf_time); //刷新显示一屏
0244 E600 LDI R16,0x60
0245 E010 LDI R17,0
0246 DE5B RCALL _display_lcd
(0395) out_data_pc232(); //串口将时间数据送PC
0247 DF59 RCALL _out_data_pc232
(0396) data_old = buf_read[0]; //更新时钟的秒数值
FILE: <library>
0248 91400089 LDS R20,buf_read
024A CFEC RJMP 0x0237
024B 96A1 ADIW R28,0x21
024C 9508 RET
pop_gset2:
024D E0E2 LDI R30,2
024E C00C RJMP pop
push_gset5:
024F 92FA ST R15,-Y
0250 92EA ST R14,-Y
push_gset4:
0251 92DA ST R13,-Y
0252 92CA ST R12,-Y
push_gset3:
0253 92BA ST R11,-Y
0254 92AA ST R10,-Y
push_gset2:
0255 937A ST R23,-Y
0256 936A ST R22,-Y
push_gset1:
0257 935A ST R21,-Y
0258 934A ST R20,-Y
0259 9508 RET
pop_gset1:
025A E0E1 LDI R30,1
pop:
025B 9149 LD R20,Y+
025C 9159 LD R21,Y+
025D FDE0 SBRC R30,0
025E 9508 RET
025F 9169 LD R22,Y+
0260 9179 LD R23,Y+
0261 FDE1 SBRC R30,1
0262 9508 RET
0263 90A9 LD R10,Y+
0264 90B9 LD R11,Y+
0265 FDE2 SBRC R30,2
0266 9508 RET
0267 90C9 LD R12,Y+
0268 90D9 LD R13,Y+
0269 FDE3 SBRC R30,3
026A 9508 RET
026B 90E9 LD R14,Y+
026C 90F9 LD R15,Y+
026D 9508 RET
lsl8:
026E 2311 TST R17
026F F019 BEQ 0x0273
0270 0F00 LSL R16
0271 951A DEC R17
0272 CFFB RJMP lsl8
0273 9508 RET
asgncblk:
0274 93AA ST R26,-Y
0275 93BA ST R27,-Y
0276 93EA ST R30,-Y
0277 93FA ST R31,-Y
0278 920A ST R0,-Y
0279 81AF LDD R26,Y+7
027A 85B8 LDD R27,Y+8
027B 81ED LDD R30,Y+5
027C 81FE LDD R31,Y+6
027D 3000 CPI R16,0
027E 0701 CPC R16,R17
027F F031 BEQ 0x0286
0280 95C8 LPM
0281 920D ST R0,X+
0282 9631 ADIW R30,1
0283 5001 SUBI R16,1
0284 4010 SBCI R17,0
0285 CFF7 RJMP 0x027D
0286 9009 LD R0,Y+
0287 91F9 LD R31,Y+
0288 91E9 LD R30,Y+
0289 91B9 LD R27,Y+
028A 91A9 LD R26,Y+
028B 9624 ADIW R28,4
028C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -