📄 ds1302.s
字号:
.module ds1302.c
.area data(ram, con, rel)
_code::
.blkb 2
.area idata
.byte 1,2
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 4,8
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 16,32
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 64,128
.area data(ram, con, rel)
.dbfile F:\yyjapp\yymk\software\ds1302.c
.dbsym e code _code A[8:8]c
.area text(rom, con, rel)
.dbfile F:\yyjapp\yymk\software\ds1302.c
.dbfunc e W_Byte _W_Byte fV
; i -> R20
; Data -> R22
.even
_W_Byte::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 14
; #include <f:\yyjapp\yymk\software\main.h>
; #include <f:\yyjapp\yymk\software\ds1302.h>
; #include <iom128v.h>
; #include <macros.h>
; unsigned char code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
; /********************************************************************
; 函 数 名:W_Byte()
; 功 能:实时时钟写入一字节
; 说 明:往DS1302写入1Byte数据
; 入口参数:Data 写入的数据
; 返 回 值:无
; ***********************************************************************/
; void W_Byte(unsigned char Data)
; {
.dbline 16
; unsigned char i;
; for(i=0;i<8;i++)
clr R20
xjmp L5
L2:
.dbline 17
; {
.dbline 18
; if(Data&0x01) //相当于汇编的RRC命令
sbrs R22,0
rjmp L6
.dbline 19
; SET_IO();
cbi 0x2,5
xjmp L7
L6:
.dbline 21
; else
; CLEAR_IO();
sbi 0x2,5
L7:
.dbline 22
lsr R22
.dbline 23
xcall _CLOCK
.dbline 24
L3:
.dbline 16
inc R20
L5:
.dbline 16
cpi R20,8
brlo L2
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Data 22 c
.dbend
.dbfunc e R_Byte _R_Byte fc
; data -> R20
; i -> R22
.even
_R_Byte::
xcall push_gset2
.dbline -1
.dbline 35
; Data>>=1;
; CLOCK();
; }
; }
; /********************************************************************
;
; 函 数 名:R_Byte()
; 功 能:实时时钟读取一字节
; 说 明:从DS1302读取1Byte数据
; 入口参数:无
; 返 回 值:data
; ***********************************************************************/
; unsigned char R_Byte(void)
; {
.dbline 36
; unsigned char i,data=0;
clr R20
.dbline 37
; for(i=0;i<8;i++)
clr R22
xjmp L12
L9:
.dbline 38
; {
.dbline 39
; if(PINE&0x20)
sbis 0x1,5
rjmp L13
.dbline 40
; data|=code[i];
ldi R24,<_code
ldi R25,>_code
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
or R20,R2
L13:
.dbline 41
xcall _CLOCK
.dbline 42
L10:
.dbline 37
inc R22
L12:
.dbline 37
cpi R22,8
brlo L9
.dbline 43
; CLOCK();
; }
; return data;
mov R16,R20
.dbline -2
L8:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbsym r i 22 c
.dbend
.dbfunc e W_1302 _W_1302 fV
; Data -> R20
; Addr -> R22
.even
_W_1302::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 55
; }
; /********************************************************************
;
; 函 数 名:W_1302()
; 功 能:往DS1302写入数据
; 说 明:先写地址,后写命令/数据
; 调 用:W_Byte() , R_Byte()
; 入口参数:Addr: DS1302地址, Data: 要写的数据
; 返 回 值:无
; ***********************************************************************/
; void W_1302(unsigned char Addr, unsigned char Data)
; {
.dbline 56
; CLEAR_RST();
sbi 0x2,6
.dbline 57
; CLEAR_CLK();
sbi 0x2,4
.dbline 58
; SET_RST();
cbi 0x2,6
.dbline 59
; SET_IO();
cbi 0x2,5
.dbline 60
; W_Byte(Addr); /* 地址,命令 */
mov R16,R22
xcall _W_Byte
.dbline 61
; W_Byte(Data); /* 写1Byte数据*/
mov R16,R20
xcall _W_Byte
.dbline 62
; SET_CLK();
cbi 0x2,4
.dbline 63
; CLEAR_RST();
sbi 0x2,6
.dbline -2
L15:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Data 20 c
.dbsym r Addr 22 c
.dbend
.dbfunc e R_1302 _R_1302 fc
; Data1 -> R20
; Addr -> R20
.even
_R_1302::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 75
; }
; /********************************************************************
;
; 函 数 名:R_1302()
; 功 能:读取DS1302某地址的数据
; 说 明:先写地址,后读命令/数据
; 调 用:W_Byte() , R_Byte()
; 入口参数:ucAddr: DS1302地址
; 返 回 值:ucData :读取的数据
; ***********************************************************************/
; unsigned char R_1302(unsigned char Addr)
; {
.dbline 77
; unsigned char Data1;
; CLEAR_RST();
sbi 0x2,6
.dbline 78
; CLEAR_CLK();
sbi 0x2,4
.dbline 79
; SET_RST();
cbi 0x2,6
.dbline 80
; W_Byte(Addr); /* 地址,命令 */
mov R16,R20
xcall _W_Byte
.dbline 81
; Data1 = R_Byte(); /* 读1Byte数据 */
xcall _R_Byte
mov R20,R16
.dbline 82
; SET_CLK();
cbi 0x2,4
.dbline 83
; CLEAR_RST();
sbi 0x2,6
.dbline 84
; return Data1;
.dbline -2
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Data1 20 c
.dbsym r Addr 20 c
.dbend
.dbfunc e BurstW1302T _BurstW1302T fV
; i -> R20
; Cdata -> R22,R23
.even
_BurstW1302T::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 97
; }
; /********************************************************************
;
; 函 数 名:BurstW1302T()
; 功 能:往DS1302写入时钟数据(多字节方式)
; 说 明:先写地址,后写命令/数据
; 调 用:W_Byte()
; 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
; 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
; 返 回 值:无
; ***********************************************************************/
; void BurstW1302T(unsigned char *Cdata)
; {
.dbline 99
; unsigned char i;
; W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
clr R18
ldi R16,142
xcall _W_1302
.dbline 100
; CLEAR_RST();
sbi 0x2,6
.dbline 101
; CLEAR_CLK();
sbi 0x2,4
.dbline 102
; SET_RST();
cbi 0x2,6
.dbline 103
; W_Byte(0xbe); /* 0xbe:时钟多字节写命令 */
ldi R16,190
xcall _W_Byte
.dbline 104
; for (i=0;i<8;i++) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
clr R20
xjmp L21
L18:
.dbline 105
.dbline 106
movw R30,R22
ldd R16,z+0
xcall _W_Byte
.dbline 107
subi R22,255 ; offset = 1
sbci R23,255
.dbline 108
L19:
.dbline 104
inc R20
L21:
.dbline 104
cpi R20,8
brlo L18
.dbline 109
; {
; W_Byte(*Cdata); /* 写1Byte数据*/
; Cdata++;
; }
; SET_CLK();
cbi 0x2,4
.dbline 110
; CLEAR_RST();
sbi 0x2,6
.dbline -2
L17:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Cdata 22 pc
.dbend
.dbfunc e BurstR1302T _BurstR1302T fV
; i -> R20
; Cdata -> R22,R23
.even
_BurstR1302T::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 123
; }
; /********************************************************************
;
; 函 数 名:BurstR1302T()
; 功 能:读取DS1302时钟数据
; 说 明:先写地址/命令,后读数据(时钟多字节方式)
; 调 用:W_Byte() , R_Byte()
; 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
; 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
; 返 回 值:无
; ***********************************************************************/
; void BurstR1302T(unsigned char *Cdata)
; {
.dbline 125
; unsigned char i;
; CLEAR_RST();
sbi 0x2,6
.dbline 126
; CLEAR_CLK();
sbi 0x2,4
.dbline 127
; SET_RST();
cbi 0x2,6
.dbline 128
; W_Byte(0xbf); /* 0xbf:时钟多字节读命令 */
ldi R16,191
xcall _W_Byte
.dbline 129
; for (i=0;i<8;i++)
clr R20
xjmp L26
L23:
.dbline 130
.dbline 131
xcall _R_Byte
movw R30,R22
std z+0,R16
.dbline 132
subi R22,255 ; offset = 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -