📄 ds1302.lis
字号:
031A 8183 std z+1,R24
031C .dbline -2
031C .dbline 262
031C ; }
031C L76:
031C 0E940000 xcall pop_gset2
0320 .dbline 0 ; func end
0320 0895 ret
0322 .dbsym r ptasc 20 pc
0322 .dbsym r BCD 22 c
0322 .dbend
.area lit(rom, con, rel)
0000 L78:
0000 0000 .byte 0,0
0002 2D00 .byte 45,0
0004 002D .byte 0,45
0006 0000 .byte 0,0
0008 2000 .byte 32,0
000A 00 .byte 0
000B L79:
000B 0000 .byte 0,0
000D 3A00 .byte 58,0
000F 003A .byte 0,58
0011 0000 .byte 0,0
0013 00 .byte 0
.area text(rom, con, rel)
0322 .dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302\ds1302.c
0322 .dbfunc e Disp_time _Disp_time fV
0322 ; line1 -> y+11
0322 ; line2 -> y+2
0322 ; asc -> y+0
0322 ; i -> R20
0322 ; time -> R22,R23
.even
0322 _Disp_time::
0322 0E940000 xcall push_gset2
0326 B801 movw R22,R16
0328 6697 sbiw R28,22
032A .dbline -1
032A .dbline 270
032A ; /*******************************************
032A ; 函数名称: Disp_time
032A ; 功 能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
032A ; 参 数: time[]--时间数组
032A ; 返回值 : 无
032A ; /********************************************/
032A ; void Disp_time(uchar time[])
032A ; {
032A .dbline 272
032A ; uchar i,asc[2];
032A ; uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
032A 80E0 ldi R24,<L78
032C 90E0 ldi R25,>L78
032E FE01 movw R30,R28
0330 3B96 adiw R30,11
0332 0BE0 ldi R16,11
0334 10E0 ldi R17,0
0336 FA93 st -y,R31
0338 EA93 st -y,R30
033A 9A93 st -y,R25
033C 8A93 st -y,R24
033E 0E940000 xcall asgncblk
0342 .dbline 273
0342 ; uchar line2[9]={0,0,':',0,0,':',0,0,'\0'}; //显示第2行的字符数组
0342 80E0 ldi R24,<L79
0344 90E0 ldi R25,>L79
0346 FE01 movw R30,R28
0348 3296 adiw R30,2
034A 09E0 ldi R16,9
034C 10E0 ldi R17,0
034E FA93 st -y,R31
0350 EA93 st -y,R30
0352 9A93 st -y,R25
0354 8A93 st -y,R24
0356 0E940000 xcall asgncblk
035A .dbline 274
035A ; for(i=0;i<3;i++) //为第2行的字符数组赋值
035A 4427 clr R20
035C 1EC0 xjmp L83
035E L80:
035E .dbline 275
035E .dbline 276
035E 9E01 movw R18,R28
0360 242E mov R2,R20
0362 3324 clr R3
0364 E2E0 ldi R30,2
0366 F0E0 ldi R31,0
0368 E219 sub R30,R2
036A F309 sbc R31,R3
036C E60F add R30,R22
036E F71F adc R31,R23
0370 0081 ldd R16,z+0
0372 C4DF xcall _BCD_ASCII
0374 .dbline 277
0374 83E0 ldi R24,3
0376 849F mul R24,R20
0378 F001 movw R30,R0
037A CE01 movw R24,R28
037C 0296 adiw R24,2
037E E80F add R30,R24
0380 F91F adc R31,R25
0382 2880 ldd R2,y+0
0384 2082 std z+0,R2
0386 .dbline 278
0386 83E0 ldi R24,3
0388 849F mul R24,R20
038A F001 movw R30,R0
038C CE01 movw R24,R28
038E 0396 adiw R24,3
0390 E80F add R30,R24
0392 F91F adc R31,R25
0394 2980 ldd R2,y+1
0396 2082 std z+0,R2
0398 .dbline 279
0398 L81:
0398 .dbline 274
0398 4395 inc R20
039A L83:
039A .dbline 274
039A 4330 cpi R20,3
039C 00F3 brlo L80
039E .dbline 280
039E ; {
039E ; BCD_ASCII(time[2-i],asc);
039E ; line2[i*3]=asc[0];
039E ; line2[i*3+1]=asc[1];
039E ; }
039E ; BCD_ASCII(time[6],asc); //为第1行的年赋值
039E 9E01 movw R18,R28
03A0 FB01 movw R30,R22
03A2 0681 ldd R16,z+6
03A4 ABDF xcall _BCD_ASCII
03A6 .dbline 281
03A6 ; line1[0]=asc[0];
03A6 2880 ldd R2,y+0
03A8 2B86 std y+11,R2
03AA .dbline 282
03AA ; line1[1]=asc[1];
03AA 2980 ldd R2,y+1
03AC 2C86 std y+12,R2
03AE .dbline 283
03AE ; BCD_ASCII(time[4],asc); //为第1行的月赋值
03AE 9E01 movw R18,R28
03B0 FB01 movw R30,R22
03B2 0481 ldd R16,z+4
03B4 A3DF xcall _BCD_ASCII
03B6 .dbline 284
03B6 ; line1[3]=asc[0];
03B6 2880 ldd R2,y+0
03B8 2E86 std y+14,R2
03BA .dbline 285
03BA ; line1[4]=asc[1];
03BA 2980 ldd R2,y+1
03BC 2F86 std y+15,R2
03BE .dbline 286
03BE ; BCD_ASCII(time[3],asc); //为第1行的日赋值
03BE 9E01 movw R18,R28
03C0 FB01 movw R30,R22
03C2 0381 ldd R16,z+3
03C4 9BDF xcall _BCD_ASCII
03C6 .dbline 287
03C6 ; line1[6]=asc[0];
03C6 2880 ldd R2,y+0
03C8 298A std y+17,R2
03CA .dbline 288
03CA ; line1[7]=asc[1];
03CA 2980 ldd R2,y+1
03CC 2A8A std y+18,R2
03CE .dbline 289
03CE ; BCD_ASCII(time[5],asc); //为第1行的星期赋值
03CE 9E01 movw R18,R28
03D0 FB01 movw R30,R22
03D2 0581 ldd R16,z+5
03D4 93DF xcall _BCD_ASCII
03D6 .dbline 290
03D6 ; line1[9]=asc[1];
03D6 2980 ldd R2,y+1
03D8 2C8A std y+20,R2
03DA L96:
03DA .dbline 292
03DA L97:
03DA .dbline 292
03DA ;
03DA ; while(LCD1602_readBF());
03DA 5ADE xcall _LCD1602_readBF
03DC 0023 tst R16
03DE E9F7 brne L96
03E0 .dbline 293
03E0 ; LCD1602_gotoXY(1,2); //第1行从第3个位置开始显示
03E0 22E0 ldi R18,2
03E2 01E0 ldi R16,1
03E4 63DE xcall _LCD1602_gotoXY
03E6 .dbline 294
03E6 ; LCD1602_sendstr("20"); //将07年显示为2007的形式
03E6 00E0 ldi R16,<L99
03E8 10E0 ldi R17,>L99
03EA 3CDE xcall _LCD1602_sendstr
03EC .dbline 295
03EC ; LCD1602_sendstr(line1); //第1行显示
03EC 8E01 movw R16,R28
03EE 055F subi R16,245 ; offset = 11
03F0 1F4F sbci R17,255
03F2 38DE xcall _LCD1602_sendstr
03F4 L100:
03F4 .dbline 296
03F4 L101:
03F4 .dbline 296
03F4 ; while(LCD1602_readBF());
03F4 4DDE xcall _LCD1602_readBF
03F6 0023 tst R16
03F8 E9F7 brne L100
03FA .dbline 297
03FA ; LCD1602_gotoXY(2,4); //第2行从第5个位置开始显示
03FA 24E0 ldi R18,4
03FC 02E0 ldi R16,2
03FE 56DE xcall _LCD1602_gotoXY
0400 .dbline 298
0400 ; LCD1602_sendstr(line2); //第2行显示
0400 8E01 movw R16,R28
0402 0E5F subi R16,254 ; offset = 2
0404 1F4F sbci R17,255
0406 2EDE xcall _LCD1602_sendstr
0408 .dbline -2
0408 .dbline 299
0408 ; }
0408 L77:
0408 6696 adiw R28,22
040A 0E940000 xcall pop_gset2
040E .dbline 0 ; func end
040E 0895 ret
0410 .dbsym l line1 11 A[11:11]c
0410 .dbsym l line2 2 A[9:9]c
0410 .dbsym l asc 0 A[2:2]c
0410 .dbsym r i 20 c
0410 .dbsym r time 22 pc
0410 .dbend
.area lit(rom, con, rel)
0014 L104:
0014 5059 .byte 'P,'Y
0016 2301 .byte 35,1
0018 0106 .byte 1,6
001A 07 .byte 7
001B L105:
001B 0000 .byte 0,0
001D 0000 .byte 0,0
001F 0000 .byte 0,0
0021 00 .byte 0
.area text(rom, con, rel)
0410 .dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302\ds1302.c
0410 .dbfunc e main _main fV
0410 ; dis_y -> <dead>
0410 ; dis_x -> <dead>
0410 ; shift -> <dead>
0410 ; setdat -> <dead>
0410 ; setadd -> <dead>
0410 ; settime -> y+7
0410 ; gettime -> y+0
.even
0410 _main::
0410 2E97 sbiw R28,14
0412 .dbline -1
0412 .dbline 307
0412 ; /*******************************************
0412 ; 函数名称: main
0412 ; 功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
0412 ; 参 数: 无
0412 ; 返回值 : 无
0412 ; /********************************************/
0412 ; void main(void)
0412 ; {
0412 .dbline 314
0412 ;
0412 ;
0412 ; uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
0412 ; //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
0412 ; //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
0412 ; uchar dis_x,dis_y; //存储1602液晶当前光标的位置
0412 ; uchar settime[7]={0x50,0x59,0x23,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
0412 80E0 ldi R24,<L104
0414 90E0 ldi R25,>L104
0416 FE01 movw R30,R28
0418 3796 adiw R30,7
041A 07E0 ldi R16,7
041C 10E0 ldi R17,0
041E FA93 st -y,R31
0420 EA93 st -y,R30
0422 9A93 st -y,R25
0424 8A93 st -y,R24
0426 0E940000 xcall asgncblk
042A .dbline 315
042A ; uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
042A 80E0 ldi R24,<L105
042C 90E0 ldi R25,>L105
042E FE01 movw R30,R28
0430 07E0 ldi R16,7
0432 10E0 ldi R17,0
0434 FA93 st -y,R31
0436 EA93 st -y,R30
0438 9A93 st -y,R25
043A 8A93 st -y,R24
043C 0E940000 xcall asgncblk
0440 .dbline 316
0440 ; LCD1602_initial(); //初始化1602液晶
0440 4BDE xcall _LCD1602_initial
0442 .dbline 317
0442 ; DS1302_portinit(); //初始化DS1302的三根数据线
0442 8FDE xcall _DS1302_portinit
0444 .dbline 318
0444 ; DS1302_init(); //启动振荡器,DS1302开始工作
0444 52DF xcall _DS1302_init
0446 .dbline 319
0446 ; DS1302_setT(settime); //设置初始时间
0446 8E01 movw R16,R28
0448 095F subi R16,249 ; offset = 7
044A 1F4F sbci R17,255
044C FDDE xcall _DS1302_setT
044E 04C0 xjmp L107
0450 L106:
0450 .dbline 321
0450 .dbline 322
0450 8E01 movw R16,R28
0452 1ADF xcall _DS1302_getT
0454 .dbline 324
0454 8E01 movw R16,R28
0456 65DF xcall _Disp_time
0458 .dbline 325
0458 L107:
0458 .dbline 320
0458 FBCF xjmp L106
045A X1:
045A .dbline -2
045A .dbline 326
045A ; while(1) //以下程序完成显示和设置时间
045A ; {
045A ; DS1302_getT(gettime); //获得当前时间
045A ;
045A ; Disp_time(gettime); //显示当前时间
045A ; }
045A ; }
045A L103:
045A 2E96 adiw R28,14
045C .dbline 0 ; func end
045C 0895 ret
045E .dbsym l dis_y 1 c
045E .dbsym l dis_x 1 c
045E .dbsym l shift 1 c
045E .dbsym l setdat 1 c
045E .dbsym l setadd 1 c
045E .dbsym l settime 7 A[7:7]c
045E .dbsym l gettime 0 A[7:7]c
045E .dbend
.area data(ram, con, rel)
0000 .dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302\ds1302.c
0000 L99:
0000 .blkb 3
.area idata
0000 323000 .byte 50,48,0
.area data(ram, con, rel)
0003 .dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302\ds1302.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -