📄 ds1302.lis
字号:
.module ds1302.c
.area data(ram, con, rel)
0000 _INITDATE::
0000 .blkb 2
.area idata
0000 5559 .byte 'U,'Y
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 2331 .byte 35,49
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 1202 .byte 18,2
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 0780 .byte 7,128
.area data(ram, con, rel)
0008 .dbfile F:\自编程序\M16\ds1302\ds1302.c
0008 .dbsym e INITDATE _INITDATE A[8:8]c
.area text(rom, con, rel)
0000 .dbfile F:\自编程序\M16\ds1302\ds1302.c
0000 .dbfunc e RTInputByte _RTInputByte fV
0000 ; i -> R20
0000 ; j -> R10
0000 ; x -> R22
.even
0000 _RTInputByte::
0000 0E940000 xcall push_gset3
0004 602F mov R22,R16
0006 .dbline -1
0006 .dbline 21
0006 ; #include<iom16v.h>
0006 ; #include<macros.h>
0006 ; #include "ds1302.h"
0006 ; unsigned char INITDATE[8]={0x55, //55秒
0006 ; 0x59, //59分
0006 ; 0x23, //23时 24小时制
0006 ; 0x31, //21日
0006 ; 0x12, //08月
0006 ; 0x02, //星期2
0006 ; 0x07, //2007年
0006 ; 0x80 //写保护
0006 ; };
0006 ; /********************************************************************
0006 ; 函 数 名:RTInputByte()
0006 ; 功 能:实时时钟写入一字节
0006 ; 说 明:往DS1302写入1Byte数据 (内部函数)
0006 ; 入口参数:d 写入的数据
0006 ; 返 回 值:无
0006 ; ***********************************************************************/
0006 ; void RTInputByte(unsigned char x)
0006 ; {
0006 .dbline 23
0006 ; unsigned char i,j;
0006 ; for(i=0; i<8;i++)
0006 4427 clr R20
0008 19C0 xjmp L5
000A L2:
000A .dbline 24
000A ; {
000A .dbline 25
000A ; if(x&(1<<i))
000A 01E0 ldi R16,1
000C 142F mov R17,R20
000E 0E940000 xcall lsl8
0012 262E mov R2,R22
0014 2022 and R2,R16
0016 11F0 breq L6
0018 .dbline 26
0018 ; DS1302_PORT|=(1<<DS1302_DATA);
0018 969A sbi 0x12,6
001A 01C0 xjmp L7
001C L6:
001C .dbline 28
001C ; else
001C ; DS1302_PORT&=~(1<<DS1302_DATA);
001C 9698 cbi 0x12,6
001E L7:
001E .dbline 29
001E ; DS1302_PORT|=(1<<DS1302_CLK);
001E 979A sbi 0x12,7
0020 .dbline 30
0020 AA24 clr R10
0022 01C0 xjmp L11
0024 L8:
0024 .dbline 30
0024 L9:
0024 .dbline 30
0024 A394 inc R10
0026 L11:
0026 .dbline 30
0026 ; for(j=0; j<5;j++);
0026 8A2D mov R24,R10
0028 8530 cpi R24,5
002A E0F3 brlo L8
002C .dbline 31
002C ; DS1302_PORT&=~(1<<DS1302_CLK);
002C 9798 cbi 0x12,7
002E .dbline 32
002E AA24 clr R10
0030 01C0 xjmp L15
0032 L12:
0032 .dbline 32
0032 L13:
0032 .dbline 32
0032 A394 inc R10
0034 L15:
0034 .dbline 32
0034 8A2D mov R24,R10
0036 8530 cpi R24,5
0038 E0F3 brlo L12
003A .dbline 33
003A L3:
003A .dbline 23
003A 4395 inc R20
003C L5:
003C .dbline 23
003C 4830 cpi R20,8
003E 28F3 brlo L2
0040 .dbline -2
0040 .dbline 34
0040 ; for(j=0; j<5;j++);
0040 ; }
0040 ; }
0040 L1:
0040 0E940000 xcall pop_gset3
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbsym r i 20 c
0046 .dbsym r j 10 c
0046 .dbsym r x 22 c
0046 .dbend
0046 .dbfunc e RTOutputByte _RTOutputByte fc
0046 ; data -> R20
0046 ; k -> R22
0046 ; i -> R10
0046 ; j -> R12
.even
0046 _RTOutputByte::
0046 0E940000 xcall push_gset4
004A .dbline -1
004A .dbline 43
004A ; /********************************************************************
004A ; 函 数 名:RTOutputByte()
004A ; 功 能:实时时钟读取一字节
004A ; 说 明:从DS1302读取1Byte数据 (内部函数)
004A ; 入口参数:无
004A ; 返 回 值:ACC
004A ; ***********************************************************************/
004A ; unsigned char RTOutputByte(void)
004A ; {
004A .dbline 45
004A ; unsigned char i,k,data,j;
004A ; DS1302_DDR&=~(1<<DS1302_DATA);
004A 8E98 cbi 0x11,6
004C .dbline 46
004C CC24 clr R12
004E 01C0 xjmp L20
0050 L17:
0050 .dbline 46
0050 L18:
0050 .dbline 46
0050 C394 inc R12
0052 L20:
0052 .dbline 46
0052 ; for(j=0; j<5;j++);
0052 8C2D mov R24,R12
0054 8530 cpi R24,5
0056 E0F3 brlo L17
0058 .dbline 47
0058 ; for(i=0; i<8; i++)
0058 AA24 clr R10
005A 1FC0 xjmp L24
005C L21:
005C .dbline 48
005C ; {
005C .dbline 49
005C ; k=(DS1302_PIN&(1<<DS1302_DATA)); //读数据,从低位开始
005C 60B3 in R22,0x10
005E 6074 andi R22,64
0060 .dbline 50
0060 ; if(k)
0060 31F0 breq L25
0062 .dbline 51
0062 ; data|=(1<<i);
0062 01E0 ldi R16,1
0064 1A2D mov R17,R10
0066 0E940000 xcall lsl8
006A 402B or R20,R16
006C 07C0 xjmp L26
006E L25:
006E .dbline 53
006E ; else
006E ; data&=~(1<<i);
006E 01E0 ldi R16,1
0070 1A2D mov R17,R10
0072 0E940000 xcall lsl8
0076 202E mov R2,R16
0078 2094 com R2
007A 4221 and R20,R2
007C L26:
007C .dbline 54
007C ; DS1302_PORT|=(1<<DS1302_CLK);
007C 979A sbi 0x12,7
007E .dbline 55
007E CC24 clr R12
0080 01C0 xjmp L30
0082 L27:
0082 .dbline 55
0082 L28:
0082 .dbline 55
0082 C394 inc R12
0084 L30:
0084 .dbline 55
0084 ; for(j=0; j<5;j++);
0084 8C2D mov R24,R12
0086 8530 cpi R24,5
0088 E0F3 brlo L27
008A .dbline 56
008A ; DS1302_PORT&=~(1<<DS1302_CLK);
008A 9798 cbi 0x12,7
008C .dbline 57
008C CC24 clr R12
008E 01C0 xjmp L34
0090 L31:
0090 .dbline 57
0090 L32:
0090 .dbline 57
0090 C394 inc R12
0092 L34:
0092 .dbline 57
0092 8C2D mov R24,R12
0094 8530 cpi R24,5
0096 E0F3 brlo L31
0098 .dbline 58
0098 L22:
0098 .dbline 47
0098 A394 inc R10
009A L24:
009A .dbline 47
009A 8A2D mov R24,R10
009C 8830 cpi R24,8
009E F0F2 brlo L21
00A0 .dbline 59
00A0 ; for(j=0; j<5;j++);
00A0 ; }
00A0 ; DS1302_DDR|=(1<<DS1302_DATA);
00A0 8E9A sbi 0x11,6
00A2 .dbline 60
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -