📄 ds1302.lis
字号:
00D6 0E940000 xcall push_gset2
00DA 602F mov R22,R16
00DC .dbline -1
00DC .dbline 72
00DC ; }
00DC ; /*******************************************
00DC ; 函数名称: DS1302_writeB
00DC ; 功 能: 向DS1302写入一个字节数据(没有RST操作)
00DC ; 参 数: byte--要写入的数据
00DC ; 返回值 : 无
00DC ; /********************************************/
00DC ; void DS1302_writeB(uchar byte)
00DC ; {
00DC .dbline 74
00DC ; uchar i;
00DC ; for(i=0;i<8;i++) //8位数据计数
00DC 4427 clr R20
00DE 0CC0 xjmp L30
00E0 L27:
00E0 .dbline 75
00E0 ; {
00E0 .dbline 76
00E0 ; PORTC&=~BIT(RTC_CLK); //拉低时钟端
00E0 AF98 cbi 0x15,7
00E2 .dbline 77
00E2 ; if(byte&0x01) //当前位是否是1
00E2 60FF sbrs R22,0
00E4 02C0 rjmp L31
00E6 .dbline 78
00E6 ; {
00E6 .dbline 79
00E6 ; PORTC|=BIT(RTC_DATA); //当前位是1,拉高数据端
00E6 AE9A sbi 0x15,6
00E8 .dbline 80
00E8 ; }
00E8 01C0 xjmp L32
00EA L31:
00EA .dbline 82
00EA ; else
00EA ; {
00EA .dbline 83
00EA ; PORTC&=~BIT(RTC_DATA); //当前位是0,拉低数据端
00EA AE98 cbi 0x15,6
00EC .dbline 84
00EC ; }
00EC L32:
00EC .dbline 85
00EC 0AE0 ldi R16,10
00EE 10E0 ldi R17,0
00F0 C0DF xcall _Delayus
00F2 .dbline 86
00F2 AF9A sbi 0x15,7
00F4 .dbline 87
00F4 6695 lsr R22
00F6 .dbline 88
00F6 L28:
00F6 .dbline 74
00F6 4395 inc R20
00F8 L30:
00F8 .dbline 74
00F8 4830 cpi R20,8
00FA 90F3 brlo L27
00FC .dbline -2
00FC L26:
00FC 0E940000 xcall pop_gset2
0100 .dbline 0 ; func end
0100 0895 ret
0102 .dbsym r i 20 c
0102 .dbsym r byte 22 c
0102 .dbend
0102 .dbfunc e DS1302_readB _DS1302_readB fc
0102 ; i -> R20
0102 ; byte -> R22
.even
0102 _DS1302_readB::
0102 0E940000 xcall push_gset2
0106 .dbline -1
0106 .dbline 97
0106 ; Delayus(10); //调整时钟和脉冲宽度
0106 ; PORTC|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
0106 ; byte>>=1; //数据右移1位,为送出新数据位做准备
0106 ; }
0106 ; }
0106 ; /*******************************************
0106 ; 函数名称: DS1302_readB
0106 ; 功 能: 从DS1302读出一个字节数据(没有RST操作)
0106 ; 参 数: 无
0106 ; 返回值 : byte--读出的数据
0106 ; /********************************************/
0106 ; uchar DS1302_readB(void)
0106 ; {
0106 .dbline 98
0106 ; uchar i,byte=0;
0106 6627 clr R22
0108 .dbline 99
0108 ; DDRC&=~BIT(RTC_DATA); //将数据端口设置为输入
0108 A698 cbi 0x14,6
010A .dbline 100
010A ; PORTC&=~BIT(RTC_DATA); //无上拉电阻
010A AE98 cbi 0x15,6
010C .dbline 101
010C ; for(i=0;i<8;i++) //8位数据计数
010C 4427 clr R20
010E 0FC0 xjmp L37
0110 L34:
0110 .dbline 102
0110 ; {
0110 .dbline 103
0110 ; byte>>=1; //保存读入的数据位
0110 6695 lsr R22
0112 .dbline 104
0112 ; PORTC|=BIT(RTC_CLK); //时钟上升沿
0112 AF9A sbi 0x15,7
0114 .dbline 105
0114 ; Delayus(10); //延时,调整时钟脉冲宽度
0114 0AE0 ldi R16,10
0116 10E0 ldi R17,0
0118 ACDF xcall _Delayus
011A .dbline 106
011A ; PORTC&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
011A AF98 cbi 0x15,7
011C .dbline 107
011C ; Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
011C 0AE0 ldi R16,10
011E 10E0 ldi R17,0
0120 A8DF xcall _Delayus
0122 .dbline 108
0122 ; if(PINC&BIT(RTC_DATA)) //当前位是否是高电平
0122 9E9B sbis 0x13,6
0124 02C0 rjmp L38
0126 .dbline 109
0126 ; {
0126 .dbline 110
0126 ; byte|=BIT(PC7); //是高电平就将返回数据的当前位置1
0126 6068 ori R22,128
0128 .dbline 111
0128 ; }
0128 01C0 xjmp L39
012A L38:
012A .dbline 113
012A ; else
012A ; {
012A .dbline 114
012A ; byte&=~BIT(PC7); //是低电平就将返回数据的当前位置0
012A 6F77 andi R22,127
012C .dbline 115
012C ; }
012C L39:
012C .dbline 116
012C L35:
012C .dbline 101
012C 4395 inc R20
012E L37:
012E .dbline 101
012E 4830 cpi R20,8
0130 78F3 brlo L34
0132 .dbline 117
0132 ; }
0132 ; DDRC|=BIT(RTC_DATA); //最后将数据端口设置为输出
0132 A69A sbi 0x14,6
0134 .dbline 119
0134 ;
0134 ; byte=byte/16*10+byte%16; //BCD码转为二进制
0134 10E1 ldi R17,16
0136 062F mov R16,R22
0138 0E940000 xcall mod8u
013C 862F mov R24,R22
013E 8295 swap R24
0140 8F70 andi R24,#0x0F
0142 9AE0 ldi R25,10
0144 989F mul R25,R24
0146 602D mov R22,R0
0148 600F add R22,R16
014A .dbline 121
014A ;
014A ; return byte; //返回读出的数据
014A 062F mov R16,R22
014C .dbline -2
014C L33:
014C 0E940000 xcall pop_gset2
0150 .dbline 0 ; func end
0150 0895 ret
0152 .dbsym r i 20 c
0152 .dbsym r byte 22 c
0152 .dbend
0152 .dbfunc e DS1302_writeD _DS1302_writeD fV
0152 ; data -> R20
0152 ; addr -> R22
.even
0152 _DS1302_writeD::
0152 0E940000 xcall push_gset2
0156 422F mov R20,R18
0158 602F mov R22,R16
015A .dbline -1
015A .dbline 131
015A ; }
015A ; /*******************************************
015A ; 函数名称: DS1302_writeD
015A ; 功 能: 向DS1302的某个地址写入一个字节数据
015A ; 参 数: addr--地址值(寄存器或RAM)
015A ; data--要写入的地址
015A ; 返回值 : 无
015A ; /********************************************/
015A ; void DS1302_writeD(uchar addr,uchar data)
015A ; {
015A .dbline 132
015A ; PORTC&=~BIT(RTC_CS); //拉低片选端
015A A998 cbi 0x15,1
015C .dbline 133
015C ; PORTC&=~BIT(RTC_CLK); //拉低时钟端
015C AF98 cbi 0x15,7
015E .dbline 134
015E ; Delayus(10);
015E 0AE0 ldi R16,10
0160 10E0 ldi R17,0
0162 87DF xcall _Delayus
0164 .dbline 135
0164 ; PORTC|=BIT(RTC_CS); //拉高片选端
0164 A99A sbi 0x15,1
0166 .dbline 136
0166 ; Delayus(10); //调整片选脉冲
0166 0AE0 ldi R16,10
0168 10E0 ldi R17,0
016A 83DF xcall _Delayus
016C .dbline 137
016C ; DS1302_writeB(addr); //写入操作命令(地址)
016C 062F mov R16,R22
016E B3DF xcall _DS1302_writeB
0170 .dbline 138
0170 ; Delayus(10);
0170 0AE0 ldi R16,10
0172 10E0 ldi R17,0
0174 7EDF xcall _Delayus
0176 .dbline 139
0176 ; PORTC&=~BIT(RTC_CLK); //拉低时钟端
0176 AF98 cbi 0x15,7
0178 .dbline 140
0178 ; Delayus(10);
0178 0AE0 ldi R16,10
017A 10E0 ldi R17,0
017C 7ADF xcall _Delayus
017E .dbline 141
017E ; DS1302_writeB(data); //写入数据
017E 042F mov R16,R20
0180 AADF xcall _DS1302_writeB
0182 .dbline 142
0182 ; PORTC&=~BIT(RTC_CLK); //拉低时钟端
0182 AF98 cbi 0x15,7
0184 .dbline 143
0184 ; Delayus(10); //调整片选脉冲
0184 0AE0 ldi R16,10
0186 10E0 ldi R17,0
0188 74DF xcall _Delayus
018A .dbline 144
018A ; PORTC&=~BIT(RTC_CS); //拉低片选端
018A A998 cbi 0x15,1
018C .dbline -2
018C L40:
018C 0E940000 xcall pop_gset2
0190 .dbline 0 ; func end
0190 0895 ret
0192 .dbsym r data 20 c
0192 .dbsym r addr 22 c
0192 .dbend
0192 .dbfunc e DS1302_readD _DS1302_readD fc
0192 ; data -> R20
0192 ; addr -> R20
.even
0192 _DS1302_readD::
0192 0E940000 xcall push_gset1
0196 402F mov R20,R16
0198 .dbline -1
0198 .dbline 153
0198 ; }
0198 ; /*******************************************
0198 ; 函数名称: DS1302_readD
0198 ; 功 能: 从DS1302的某个地址读出一个字节数据
0198 ; 参 数: addr--地址值(寄存器或RAM)
0198 ; 返回值 : data--读出的数据
0198 ; /********************************************/
0198 ; uchar DS1302_readD(uchar addr)
0198 ; {
0198 .dbline 155
0198 ; uchar data;
0198 ; PORTC&=~BIT(RTC_CS); //拉低片选端
0198 A998 cbi 0x15,1
019A .dbline 156
019A ; PORTC&=~BIT(RTC_CLK); //拉低时钟端
019A AF98 cbi 0x15,7
019C .dbline 157
019C ; Delayus(10);
019C 0AE0 ldi R16,10
019E 10E0 ldi R17,0
01A0 68DF xcall _Delayus
01A2 .dbline 158
01A2 ; PORTC|=BIT(RTC_CS); //拉高片选端
01A2 A99A sbi 0x15,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -