📄 ds1302.s
字号:
.module ds1302.c
.area data(ram, con, rel)
_time_buf::
.blkb 2
.area idata
.byte 32,7
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 5,8
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 22,21
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 0,2
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
.dbsym e time_buf _time_buf A[8:8]c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
.dbfunc e ds1302_write_byte _ds1302_write_byte fV
; i -> R20
; d -> R18
; addr -> R16
.even
_ds1302_write_byte::
xcall push_gset1
.dbline -1
.dbline 43
; /*
; DS1302时钟芯片驱动函数
;
; DS1302是产品中最常用的时钟芯片,此文件中的代码可以嵌入项目中使用。
;
; */
;
; #include "iom128v.h"
;
; /*复位脚*/
; #define RST_CLR PORTD &= ~(1 << PD7)/*电平置低*/
; #define RST_SET PORTD |= (1 << PD7)/*电平置高*/
; #define RST_IN DDRD &= ~(1 << PD7)/*方向输入*/
; #define RST_OUT DDRD |= (1 << PD7)/*方向输出*/
;
; /*双向数据*/
; #define IO_CLR PORTD &= ~(1 << PD6)/*电平置低*/
; #define IO_SET PORTD |= (1 << PD6)/*电平置高*/
; #define IO_R PIND & (1 << PD6)/*电平读取*/
; #define IO_IN DDRD &= ~(1 << PD6)/*方向输入*/
; #define IO_OUT DDRD |= (1 << PD6)/*方向输出*/
;
; /*时钟信号*/
; #define SCK_CLR PORTD &= ~(1 << PD5)/*时钟信号*/
; #define SCK_SET PORTD |= (1 << PD5)/*电平置高*/
; #define SCK_IN DDRD &= ~(1 << PD5)/*方向输入*/
; #define SCK_OUT DDRD |= (1 << PD5)/*方向输出*/
;
; #define ds1302_sec_add 0x80 //秒数据地址
; #define ds1302_min_add 0x82 //分数据地址
; #define ds1302_hr_add 0x84 //时数据地址
; #define ds1302_date_add 0x86 //日数据地址
; #define ds1302_month_add 0x88 //月数据地址
; #define ds1302_day_add 0x8a //星期数据地址
; #define ds1302_year_add 0x8c //年数据地址
; #define ds1302_control_add 0x8e //控制数据地址
; #define ds1302_charger_add 0x90
; #define ds1302_clkburst_add 0xbe
;
; unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
;
; /*向DS1302写入一字节数据*/
; void ds1302_write_byte(unsigned char addr, unsigned char d) {
.dbline 46
;
; unsigned char i;
; RST_SET; /*启动DS1302总线*/
sbi 0x12,7
.dbline 49
;
; /*写入目标地址:addr*/
; IO_OUT;
sbi 0x11,6
.dbline 50
; addr = addr & 0xFE;/*最低位置零*/
andi R16,254
.dbline 51
clr R20
xjmp L5
L2:
.dbline 51
; for (i = 0; i < 8; i ++) {
.dbline 52
; if (addr & 0x01) {
sbrs R16,0
rjmp L6
.dbline 52
.dbline 53
; IO_SET;
sbi 0x12,6
.dbline 54
; }
xjmp L7
L6:
.dbline 55
; else {
.dbline 56
; IO_CLR;
cbi 0x12,6
.dbline 57
; }
L7:
.dbline 58
sbi 0x12,5
.dbline 59
cbi 0x12,5
.dbline 60
lsr R16
.dbline 61
L3:
.dbline 51
inc R20
L5:
.dbline 51
cpi R20,8
brlo L2
.dbline 64
; SCK_SET;
; SCK_CLR;
; addr = addr >> 1;
; }
;
; /*写入数据:d*/
; IO_OUT;
sbi 0x11,6
.dbline 65
clr R20
xjmp L11
L8:
.dbline 65
; for (i = 0; i < 8; i ++) {
.dbline 66
; if (d & 0x01) {
sbrs R18,0
rjmp L12
.dbline 66
.dbline 67
; IO_SET;
sbi 0x12,6
.dbline 68
; }
xjmp L13
L12:
.dbline 69
; else {
.dbline 70
; IO_CLR;
cbi 0x12,6
.dbline 71
; }
L13:
.dbline 72
sbi 0x12,5
.dbline 73
cbi 0x12,5
.dbline 74
lsr R18
.dbline 75
L9:
.dbline 65
inc R20
L11:
.dbline 65
cpi R20,8
brlo L8
.dbline 76
; SCK_SET;
; SCK_CLR;
; d = d >> 1;
; }
; RST_CLR; /*停止DS1302总线*/
cbi 0x12,7
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r d 18 c
.dbsym r addr 16 c
.dbend
.dbfunc e ds1302_read_byte _ds1302_read_byte fc
; temp -> R20
; i -> R22
; addr -> R16
.even
_ds1302_read_byte::
xcall push_gset2
.dbline -1
.dbline 80
; }
;
; /*从DS1302读出一字节数据*/
; unsigned char ds1302_read_byte(unsigned char addr) {
.dbline 84
;
; unsigned char i;
; unsigned char temp;
; RST_SET; /*启动DS1302总线*/
sbi 0x12,7
.dbline 87
;
; /*写入目标地址:addr*/
; IO_OUT;
sbi 0x11,6
.dbline 88
; addr = addr | 0x01;/*最低位置高*/
ori R16,1
.dbline 89
clr R22
xjmp L18
L15:
.dbline 89
; for (i = 0; i < 8; i ++) {
.dbline 90
; if (addr & 0x01) {
sbrs R16,0
rjmp L19
.dbline 90
.dbline 91
; IO_SET;
sbi 0x12,6
.dbline 92
; }
xjmp L20
L19:
.dbline 93
; else {
.dbline 94
; IO_CLR;
cbi 0x12,6
.dbline 95
; }
L20:
.dbline 96
sbi 0x12,5
.dbline 97
cbi 0x12,5
.dbline 98
lsr R16
.dbline 99
L16:
.dbline 89
inc R22
L18:
.dbline 89
cpi R22,8
brlo L15
.dbline 102
; SCK_SET;
; SCK_CLR;
; addr = addr >> 1;
; }
;
; /*输出数据:temp*/
; IO_IN;
cbi 0x11,6
.dbline 103
clr R22
xjmp L24
L21:
.dbline 103
; for (i = 0; i < 8; i ++) {
.dbline 104
; temp = temp >> 1;
lsr R20
.dbline 105
; if (IO_R) {
sbis 0x10,6
rjmp L25
.dbline 105
.dbline 106
; temp |= 0x80;
ori R20,128
.dbline 107
; }
xjmp L26
L25:
.dbline 108
; else {
.dbline 109
; temp &= 0x7F;
andi R20,127
.dbline 110
; }
L26:
.dbline 111
sbi 0x12,5
.dbline 112
cbi 0x12,5
.dbline 113
L22:
.dbline 103
inc R22
L24:
.dbline 103
cpi R22,8
brlo L21
.dbline 115
; SCK_SET;
; SCK_CLR;
; }
;
; RST_CLR; /*停止DS1302总线*/
cbi 0x12,7
.dbline 116
; return temp;
mov R16,R20
.dbline -2
L14:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r addr 16 c
.dbend
.dbfunc e ds1302_write_time _ds1302_write_time fV
.even
_ds1302_write_time::
.dbline -1
.dbline 120
; }
;
; /*向DS302写入时钟数据*/
; void ds1302_write_time(void) {
.dbline 122
;
; ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
clr R18
ldi R16,142
xcall _ds1302_write_byte
.dbline 123
; ds1302_write_byte(ds1302_sec_add,0x80); //暂停
ldi R18,128
ldi R16,128
xcall _ds1302_write_byte
.dbline 125
; //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
; ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
lds R18,_time_buf+1
ldi R16,140
xcall _ds1302_write_byte
.dbline 126
; ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
lds R18,_time_buf+2
ldi R16,136
xcall _ds1302_write_byte
.dbline 127
; ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
lds R18,_time_buf+3
ldi R16,134
xcall _ds1302_write_byte
.dbline 128
; ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
lds R18,_time_buf+7
ldi R16,138
xcall _ds1302_write_byte
.dbline 129
; ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
lds R18,_time_buf+4
ldi R16,132
xcall _ds1302_write_byte
.dbline 130
; ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
lds R18,_time_buf+5
ldi R16,130
xcall _ds1302_write_byte
.dbline 131
; ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
lds R18,_time_buf+6
ldi R16,128
xcall _ds1302_write_byte
.dbline 132
; ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
lds R18,_time_buf+7
ldi R16,138
xcall _ds1302_write_byte
.dbline 133
; ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
ldi R18,128
ldi R16,142
xcall _ds1302_write_byte
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ds1302_read_time _ds1302_read_time fV
.even
_ds1302_read_time::
.dbline -1
.dbline 137
; }
;
; /*从DS302读出时钟数据*/
; void ds1302_read_time(void) {
.dbline 139
;
; time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
ldi R16,140
xcall _ds1302_read_byte
sts _time_buf+1,R16
.dbline 140
; time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
ldi R16,136
xcall _ds1302_read_byte
sts _time_buf+2,R16
.dbline 141
; time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
ldi R16,134
xcall _ds1302_read_byte
sts _time_buf+3,R16
.dbline 142
; time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
ldi R16,132
xcall _ds1302_read_byte
sts _time_buf+4,R16
.dbline 143
; time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
ldi R16,130
xcall _ds1302_read_byte
sts _time_buf+5,R16
.dbline 144
; time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
ldi R16,128
xcall _ds1302_read_byte
mov R24,R16
andi R24,127
sts _time_buf+6,R24
.dbline 145
; time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
ldi R16,138
xcall _ds1302_read_byte
sts _time_buf+7,R16
.dbline -2
L36:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ds1302_init _ds1302_init fV
.even
_ds1302_init::
.dbline -1
.dbline 149
; }
;
; /*DS302初始化函数*/
; void ds1302_init(void) {
.dbline 151
;
; RST_CLR; /*RST脚置低*/
cbi 0x12,7
.dbline 152
; SCK_CLR; /*SCK脚置低*/
cbi 0x12,5
.dbline 153
; RST_OUT; /*RST脚设置为输出*/
sbi 0x11,7
.dbline 154
; SCK_OUT; /*SCK脚设置为输出*/
sbi 0x11,5
.dbline -2
L44:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -