📄 ds1302.lis
字号:
0280 ; ptasc -> R18,R19
0280 ; BCD -> R16
.even
0280 _BCD_ASCII::
0280 .dbline -1
0280 .dbline 252
0280 ; }
0280 ; /*******************************************
0280 ; 函数名称: BCD_ASCII
0280 ; 功 能: 将压缩BCD码转换成ascii码
0280 ; 参 数: BCD--将要转换的压缩BCD码
0280 ; ptasc--转换后的ASCII码数组指针
0280 ; 返回值 : 无
0280 ; /********************************************/
0280 ; void BCD_ASCII(uchar BCD,uchar ptasc[])
0280 ; {
0280 .dbline 253
0280 ; ptasc[0]=BCD/16|0x30; //0X58 35 38 //转换十位
0280 802F mov R24,R16
0282 8295 swap R24
0284 8F70 andi R24,#0x0F
0286 8063 ori R24,48
0288 F901 movw R30,R18
028A 8083 std z+0,R24
028C .dbline 254
028C ; ptasc[1]=BCD&0x0F|0x30; //转换个位
028C 802F mov R24,R16
028E 8F70 andi R24,15
0290 8063 ori R24,48
0292 8183 std z+1,R24
0294 .dbline -2
0294 L56:
0294 .dbline 0 ; func end
0294 0895 ret
0296 .dbsym r ptasc 18 pc
0296 .dbsym r BCD 16 c
0296 .dbend
0296 .dbfunc e Disp_time _Disp_time fV
0296 ; dm -> y+0
0296 ; n -> R20
0296 ; m -> R22
0296 ; i -> R10
0296 ; time -> R20,R21
.even
0296 _Disp_time::
0296 0E940000 xcall push_gset3
029A A801 movw R20,R16
029C 2897 sbiw R28,8
029E .dbline -1
029E .dbline 263
029E ; }
029E ; /*******************************************
029E ; 函数名称: Disp_time
029E ; 功 能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
029E ; 参 数: time[]--时间数组
029E ; 返回值 : 无
029E ; /********************************************/
029E ; void Disp_time(uchar time[])
029E ; { uint dm[4];
029E .dbline 267
029E ; uchar i,m,n;
029E ;
029E ;
029E ; m=(uint)time[0];
029E FA01 movw R30,R20
02A0 6081 ldd R22,z+0
02A2 .dbline 268
02A2 ; n=(uint)time[1];
02A2 4181 ldd R20,z+1
02A4 .dbline 270
02A4 ;
02A4 ; for(i=1;i<3;i++)
02A4 AA24 clr R10
02A6 A394 inc R10
02A8 16C0 xjmp L61
02AA L58:
02AA .dbline 271
02AA .dbline 271
02AA 14E0 ldi R17,4
02AC 1A19 sub R17,R10
02AE 02E0 ldi R16,2
02B0 0102 muls R16,R17
02B2 F001 movw R30,R0
02B4 CE01 movw R24,R28
02B6 E80F add R30,R24
02B8 F91F adc R31,R25
02BA 2AE0 ldi R18,10
02BC 30E0 ldi R19,0
02BE 062F mov R16,R22
02C0 1127 clr R17
02C2 0E940000 xcall mod16s
02C6 1183 std z+1,R17
02C8 0083 std z+0,R16
02CA .dbline 272
02CA 1AE0 ldi R17,10
02CC 062F mov R16,R22
02CE 0E940000 xcall div8u
02D2 602F mov R22,R16
02D4 .dbline 273
02D4 L59:
02D4 .dbline 270
02D4 A394 inc R10
02D6 L61:
02D6 .dbline 270
02D6 8A2D mov R24,R10
02D8 8330 cpi R24,3
02DA 38F3 brlo L58
02DC .dbline 274
02DC ; { dm[4-i]=m%10;
02DC ; m=m/10;
02DC ; }
02DC ; for(i=3;i<5;i++)
02DC 83E0 ldi R24,3
02DE A82E mov R10,R24
02E0 16C0 xjmp L65
02E2 L62:
02E2 .dbline 275
02E2 .dbline 275
02E2 14E0 ldi R17,4
02E4 1A19 sub R17,R10
02E6 02E0 ldi R16,2
02E8 0102 muls R16,R17
02EA F001 movw R30,R0
02EC CE01 movw R24,R28
02EE E80F add R30,R24
02F0 F91F adc R31,R25
02F2 2AE0 ldi R18,10
02F4 30E0 ldi R19,0
02F6 042F mov R16,R20
02F8 1127 clr R17
02FA 0E940000 xcall mod16s
02FE 1183 std z+1,R17
0300 0083 std z+0,R16
0302 .dbline 276
0302 1AE0 ldi R17,10
0304 042F mov R16,R20
0306 0E940000 xcall div8u
030A 402F mov R20,R16
030C .dbline 277
030C L63:
030C .dbline 274
030C A394 inc R10
030E L65:
030E .dbline 274
030E 8A2D mov R24,R10
0310 8530 cpi R24,5
0312 38F3 brlo L62
0314 .dbline 278
0314 ; { dm[4-i]=n%10;
0314 ; n=n/10;
0314 ; }
0314 ; for(i=0;i<4;i++)
0314 AA24 clr R10
0316 0CC0 xjmp L69
0318 L66:
0318 .dbline 279
0318 .dbline 279
0318 2A2D mov R18,R10
031A 82E0 ldi R24,2
031C 8A9D mul R24,R10
031E F001 movw R30,R0
0320 CE01 movw R24,R28
0322 E80F add R30,R24
0324 F91F adc R31,R25
0326 0081 ldd R16,z+0
0328 81DE xcall _show
032A .dbline 281
032A 8FEF ldi R24,255
032C 82BB out 0x12,R24
032E .dbline 282
032E L67:
032E .dbline 278
032E A394 inc R10
0330 L69:
0330 .dbline 278
0330 8A2D mov R24,R10
0332 8430 cpi R24,4
0334 88F3 brlo L66
0336 .dbline -2
0336 L57:
0336 2896 adiw R28,8
0338 0E940000 xcall pop_gset3
033C .dbline 0 ; func end
033C 0895 ret
033E .dbsym l dm 0 A[8:4]i
033E .dbsym r n 20 c
033E .dbsym r m 22 c
033E .dbsym r i 10 c
033E .dbsym r time 20 pc
033E .dbend
.area lit(rom, con, rel)
0020 L71:
0020 5950 .byte 'Y,'P
0022 L72:
0022 0000 .byte 0,0
.area text(rom, con, rel)
033E .dbfile D:\卜凡涛单片机\卜凡涛做板\DS1302\DS1302.c
033E .dbfunc e main _main fV
033E ; shift -> <dead>
033E ; setdat -> <dead>
033E ; setadd -> <dead>
033E ; settime -> y+2
033E ; gettime -> y+0
.even
033E _main::
033E 2497 sbiw R28,4
0340 .dbline -1
0340 .dbline 294
0340 ; { show(dm[i],i);
0340 ;
0340 ; PORTD=0XFF;
0340 ; }
0340 ;
0340 ;
0340 ;
0340 ; }
0340 ; /*******************************************
0340 ; 函数名称: main
0340 ; 功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
0340 ; 参 数: 无
0340 ; 返回值 : 无
0340 ; /********************************************/
0340 ; void main(void)
0340 ; {
0340 .dbline 301
0340 ;
0340 ;
0340 ; uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
0340 ; //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
0340 ; //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
0340 ; //uchar dis_x,dis_y; //存储1602液晶当前光标的位置
0340 ; uchar settime[2]={0X59,0X50};//设置的秒,分,时,日,月,星期,年
0340 80E0 ldi R24,<L71
0342 90E0 ldi R25,>L71
0344 FE01 movw R30,R28
0346 3296 adiw R30,2
0348 02E0 ldi R16,2
034A 10E0 ldi R17,0
034C FA93 st -y,R31
034E EA93 st -y,R30
0350 9A93 st -y,R25
0352 8A93 st -y,R24
0354 0E940000 xcall asgncblk
0358 .dbline 302
0358 ; uchar gettime[2]={0X00,0X00};//保存当前时间的数组
0358 80E0 ldi R24,<L72
035A 90E0 ldi R25,>L72
035C FE01 movw R30,R28
035E 02E0 ldi R16,2
0360 10E0 ldi R17,0
0362 FA93 st -y,R31
0364 EA93 st -y,R30
0366 9A93 st -y,R25
0368 8A93 st -y,R24
036A 0E940000 xcall asgncblk
036E .dbline 304
036E ; //LCD1602_initial(); //初始化1602液晶
036E ; DS1302_portinit(); //初始化DS1302的三根数据线
036E AFDE xcall _DS1302_portinit
0370 .dbline 305
0370 ; DS1302_init(); //启动振荡器,DS1302开始工作
0370 7DDF xcall _DS1302_init
0372 .dbline 306
0372 ; DS1302_setT(settime); //设置初始时间
0372 8E01 movw R16,R28
0374 0E5F subi R16,254 ; offset = 2
0376 1F4F sbci R17,255
0378 28DF xcall _DS1302_setT
037A 04C0 xjmp L74
037C L73:
037C .dbline 310
037C .dbline 311
037C 8E01 movw R16,R28
037E 45DF xcall _DS1302_getT
0380 .dbline 313
0380 8E01 movw R16,R28
0382 89DF xcall _Disp_time
0384 .dbline 314
0384 L74:
0384 .dbline 309
0384 FBCF xjmp L73
0386 X0:
0386 .dbline -2
0386 L70:
0386 2496 adiw R28,4
0388 .dbline 0 ; func end
0388 0895 ret
038A .dbsym l shift 1 c
038A .dbsym l setdat 1 c
038A .dbsym l setadd 1 c
038A .dbsym l settime 2 A[2:2]c
038A .dbsym l gettime 0 A[2:2]c
038A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -