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