📄 ds1307.s
字号:
.module ds1307.c
.area text(rom, con, rel)
.dbfile F:\cdy笔记本资料\E\工程\五星\设计文档\程序设计\ds1307\ds1307.c
.dbfunc e rtc_write _rtc_write fc
; i -> R20
; len -> R22
; buf -> R10,R11
; addr -> R20
.even
_rtc_write::
xcall push_gset3
movw R10,R18
mov R20,R16
ldd R22,y+6
.dbline -1
.dbline 11
; #include"twi.h"
; #include"ds1307.h"
; #include"delay.h"
;
; char g_aTimeBuf[7];//日历/时钟BCD格式缓冲区
; char g_aTimeBin[7];//时钟/日历二进制格式缓冲区
;
; /*************DS1307操作**************开始**************/
; //对DS1307内存连续的写操作
; unsigned char rtc_write(unsigned char addr,unsigned char *buf,unsigned char len)
; {
.dbline 14
; unsigned char i;
;
; twi_start();
xcall _twi_start
.dbline 15
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 16
; twi_writebyte(DS1307_ADDR|TW_WRITE);
ldi R16,208
xcall _twi_writebyte
.dbline 17
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 18
; twi_writebyte(addr);//write address
mov R16,R20
xcall _twi_writebyte
.dbline 19
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 20
; for(i=0;i<len;i++)
clr R20
xjmp L5
L2:
.dbline 21
.dbline 22
mov R30,R20
clr R31
add R30,R10
adc R31,R11
ldd R16,z+0
xcall _twi_writebyte
.dbline 23
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 24
L3:
.dbline 20
inc R20
L5:
.dbline 20
cp R20,R22
brlo L2
.dbline 25
; {
; twi_writebyte(buf[i]);
; delay_nms(10);
; }
; twi_stop();
xcall _twi_stop
.dbline 26
; return 0;
clr R16
.dbline -2
L1:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r len 22 c
.dbsym r buf 10 pc
.dbsym r addr 20 c
.dbend
.dbfunc e rtc_read _rtc_read fc
; i -> R20
; len -> R22
; buf -> R10,R11
; addr -> R20
.even
_rtc_read::
xcall push_gset3
movw R10,R18
mov R20,R16
sbiw R28,1
ldd R22,y+7
.dbline -1
.dbline 31
; }
;
; //对DS1307内存连续的读操作
; unsigned char rtc_read(unsigned char addr,unsigned char *buf,unsigned char len)
; {
.dbline 34
; unsigned char i;
;
; rtc_write(addr,0,0); //set address
clr R2
std y+0,R2
clr R18
clr R19
mov R16,R20
xcall _rtc_write
.dbline 36
;
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 38
;
; twi_start();
xcall _twi_start
.dbline 39
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 40
; twi_writebyte(DS1307_ADDR|TW_READ);
ldi R16,209
xcall _twi_writebyte
.dbline 41
; for(i=0;i<len-1;i++)
clr R20
xjmp L10
L7:
.dbline 42
.dbline 43
ldi R18,1
mov R16,R20
clr R17
add R16,R10
adc R17,R11
xcall _twi_readbyte
.dbline 44
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 45
L8:
.dbline 41
inc R20
L10:
.dbline 41
mov R24,R22
subi R24,1
cp R20,R24
brlo L7
.dbline 46
; {
; twi_readbyte(buf+i,TW_ACK);
; delay_nms(10);
; }
; twi_readbyte(buf+i,TW_NACK);
clr R18
mov R16,R20
clr R17
add R16,R10
adc R17,R11
xcall _twi_readbyte
.dbline 47
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 48
; twi_stop();
xcall _twi_stop
.dbline 49
; return 0;
clr R16
.dbline -2
L6:
adiw R28,1
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r len 22 c
.dbsym r buf 10 pc
.dbsym r addr 20 c
.dbend
.dbfunc e RtcUpdateData _RtcUpdateData fc
; ret -> R20
; direction -> R20
.even
_RtcUpdateData::
xcall push_gset1
mov R20,R16
sbiw R28,1
.dbline -1
.dbline 59
; }
; /*************DS1307操作**************结束**************/
;
; /*************接口部分****************开始**************/
;
;
;
; //更新或读取DS1307日历/时间数据
; unsigned char RtcUpdateData(unsigned char direction)
; {
.dbline 61
; unsigned char ret;
; if(direction) //读
tst R20
breq L12
.dbline 62
; ret=rtc_read(0,g_aTimeBuf,7);
ldi R24,7
std y+0,R24
ldi R18,<_g_aTimeBuf
ldi R19,>_g_aTimeBuf
clr R16
xcall _rtc_read
mov R20,R16
xjmp L13
L12:
.dbline 64
; else //写
; ret=rtc_write(0,g_aTimeBuf,7);
ldi R24,7
std y+0,R24
ldi R18,<_g_aTimeBuf
ldi R19,>_g_aTimeBuf
clr R16
xcall _rtc_write
mov R20,R16
L13:
.dbline 66
;
; return ret;
mov R16,R20
.dbline -2
L11:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ret 20 c
.dbsym r direction 20 c
.dbend
.dbfunc e RtcReadRAM _RtcReadRAM fc
; len -> y+5
; buf -> R22,R23
; addr -> R20
.even
_RtcReadRAM::
xcall push_gset2
movw R22,R18
mov R20,R16
sbiw R28,1
.dbline -1
.dbline 70
; }
; //读DS1307用户RAM
; unsigned char RtcReadRAM(unsigned char addr,unsigned char *buf,unsigned char len)
; {
.dbline 71
; addr+=8;
subi R20,248 ; addi 8
.dbline 72
; return rtc_read(addr,buf,len);
ldd R0,y+5
std y+0,R0
movw R18,R22
mov R16,R20
xcall _rtc_read
.dbline -2
L14:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l len 5 c
.dbsym r buf 22 pc
.dbsym r addr 20 c
.dbend
.dbfunc e RtcWriteRAM _RtcWriteRAM fc
; len -> y+5
; buf -> R22,R23
; addr -> R20
.even
_RtcWriteRAM::
xcall push_gset2
movw R22,R18
mov R20,R16
sbiw R28,1
.dbline -1
.dbline 76
; }
; //写DS1307用户RAM
; unsigned char RtcWriteRAM(unsigned char addr,unsigned char *buf,unsigned char len)
; {
.dbline 77
; addr+=8;
subi R20,248 ; addi 8
.dbline 78
; return rtc_write(addr,buf,len);
ldd R0,y+5
std y+0,R0
movw R18,R22
mov R16,R20
xcall _rtc_write
.dbline -2
L15:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l len 5 c
.dbsym r buf 22 pc
.dbsym r addr 20 c
.dbend
.dbfunc e byte_bintobcd _byte_bintobcd fc
; ret -> R20
; bin -> R22
.even
_byte_bintobcd::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 82
; }
;
; unsigned char byte_bintobcd(unsigned char bin)
; {
.dbline 84
; unsigned char ret;
; bin&=0x7f;
andi R22,127
.dbline 85
; bin%=100;
ldi R17,100
mov R16,R22
xcall mod8u
mov R22,R16
.dbline 86
; ret=bin/10;
ldi R17,10
xcall div8u
mov R20,R16
.dbline 87
; ret <<=4;
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 88
; ret|=bin%10;
ldi R17,10
mov R16,R22
xcall mod8u
or R20,R16
.dbline 89
; return ret;
mov R16,R20
.dbline -2
L16:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r ret 20 c
.dbsym r bin 22 c
.dbend
.dbfunc e byte_bcdtobin _byte_bcdtobin fc
; ret -> R20
; bcd -> R16
.even
_byte_bcdtobin::
xcall push_gset1
.dbline -1
.dbline 92
; }
; unsigned char byte_bcdtobin(unsigned char bcd)
; {
.dbline 94
; unsigned char ret;
; ret=bcd & 0x0f;
mov R20,R16
andi R20,15
.dbline 95
; ret+=(bcd>>4)*10;
mov R24,R16
swap R24
andi R24,#0x0F
ldi R25,10
mul R25,R24
add R20,R0
.dbline 96
; return ret;
mov R16,R20
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ret 20 c
.dbsym r bcd 16 c
.dbend
.dbfunc e RtcBinToBCD _RtcBinToBCD fV
; i -> R20
.even
_RtcBinToBCD::
xcall push_gset1
.dbline -1
.dbline 101
; }
;
; //将二进制格式缓冲区(g_aTimeBin)内容转换成BCD格式后保存到BCD格式缓冲区(g_aTimeBuf)
; void RtcBinToBCD(void)
; {
.dbline 103
; unsigned char i;
; g_aTimeBin[0]&=0x7f;
lds R24,_g_aTimeBin
andi R24,127
sts _g_aTimeBin,R24
.dbline 104
; g_aTimeBin[1]&=0x7f;
lds R24,_g_aTimeBin+1
andi R24,127
sts _g_aTimeBin+1,R24
.dbline 106
;
; g_aTimeBin[2]&=0x3f;
lds R24,_g_aTimeBin+2
andi R24,63
sts _g_aTimeBin+2,R24
.dbline 109
;
;
; g_aTimeBin[3]&=0x07;
lds R24,_g_aTimeBin+3
andi R24,7
sts _g_aTimeBin+3,R24
.dbline 112
;
;
; g_aTimeBin[4]&=0x3f;
lds R24,_g_aTimeBin+4
andi R24,63
sts _g_aTimeBin+4,R24
.dbline 113
; g_aTimeBin[5]&=0x1f;
lds R24,_g_aTimeBin+5
andi R24,31
sts _g_aTimeBin+5,R24
.dbline 114
; g_aTimeBin[6]&=0xff;
lds R24,_g_aTimeBin+6
andi R24,255
sts _g_aTimeBin+6,R24
.dbline 116
;
; for(i=0;i<7;i++)
clr R20
xjmp L28
L25:
.dbline 117
ldi R24,<_g_aTimeBin
ldi R25,>_g_aTimeBin
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _byte_bintobcd
ldi R24,<_g_aTimeBuf
ldi R25,>_g_aTimeBuf
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R16
L26:
.dbline 116
inc R20
L28:
.dbline 116
cpi R20,7
brlo L25
.dbline -2
L18:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e RtcBCDToBin _RtcBCDToBin fV
; i -> R20
.even
_RtcBCDToBin::
xcall push_gset1
.dbline -1
.dbline 122
; g_aTimeBuf[i]=byte_bintobcd(g_aTimeBin[i]);
; }
;
; //将BCD格式缓冲区(g_aTimeBuf)内容转换成二进制格式后保存到二进制格式缓冲区(g_aTimeBin)
; void RtcBCDToBin(void)
; {
.dbline 124
; unsigned char i;
; for(i=0;i<7;i++)
clr R20
xjmp L33
L30:
.dbline 125
ldi R24,<_g_aTimeBuf
ldi R25,>_g_aTimeBuf
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _byte_bcdtobin
ldi R24,<_g_aTimeBin
ldi R25,>_g_aTimeBin
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R16
L31:
.dbline 124
inc R20
L33:
.dbline 124
cpi R20,7
brlo L30
.dbline -2
L29:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e RtcSetSQWOutput _RtcSetSQWOutput fV
; c -> y+1
; level -> R20
; en -> R22
.even
_RtcSetSQWOutput::
xcall push_gset2
mov R20,R18
mov R22,R16
sbiw R28,2
.dbline -1
.dbline 130
; g_aTimeBin[i]=byte_bcdtobin(g_aTimeBuf[i]);
; }
;
; //写DS1307配置字节
; void RtcSetSQWOutput(unsigned char en,unsigned char level)
; {
.dbline 132
; //en:方波输出允许 TRUE 有效 level:如果输出禁止 OUT口的逻辑电平
; unsigned char c=0;
clr R2
std y+1,R2
.dbline 133
; if(en) //enable
tst R22
breq L35
.dbline 134
; c=0x10;
ldi R24,16
std y+1,R24
xjmp L36
L35:
.dbline 136
; else //disable
; {
.dbline 137
; if(level)
tst R20
breq L37
.dbline 138
; c=0x80;
ldi R24,128
std y+1,R24
L37:
.dbline 139
; }
L36:
.dbline 140
; rtc_write(7,&c,1);
ldi R24,1
std y+0,R24
movw R18,R28
subi R18,255 ; offset = 1
sbci R19,255
ldi R16,7
xcall _rtc_write
.dbline -2
L34:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l c 1 c
.dbsym r level 20 c
.dbsym r en 22 c
.dbend
.area bss(ram, con, rel)
.dbfile F:\cdy笔记本资料\E\工程\五星\设计文档\程序设计\ds1307\ds1307.c
_g_aTimeBin::
.blkb 7
.dbsym e g_aTimeBin _g_aTimeBin A[7:7]c
_g_aTimeBuf::
.blkb 7
.dbsym e g_aTimeBuf _g_aTimeBuf A[7:7]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -