📄 ds1302.s
字号:
.module DS1302.c
.area text(rom, con, rel)
.dbfile D:\单片机编程\iccavr\DS1302时钟\DS1302.c
.dbfunc e SetDateTime _SetDateTime fV
; i -> R20
; data -> R18
; cmd -> R16
.even
_SetDateTime::
xcall push_gset1
.dbline -1
.dbline 49
; #include <iom16v.h>
; #include <macros.h>
;
; //秒
; #define SEC_W 0x80
; #define SEC_R 0x81
;
; //分
; #define MIN_W 0x82
; #define MIN_R 0x83
;
; //小时
; #define HR_W 0x84
; #define HR_R 0x85
;
; //日期
; #define DATE_W 0x86
; #define DATE_R 0x87
;
; //月
; #define MONTH_W 0x88
; #define MONTH_R 0x89
;
; //星期几
; #define DAY_W 0x8A
; #define DAY_R 0x8B
;
; //年
; #define YEAR_W 0x8C
; #define YEAR_R 0x8D
;
; //控制写保护
; #define CONTROL_W 0x8E
; #define CONTROL_R 0x8F
;
; //控制充电
; #define TRIC_CHARGE_W 0x90
; #define TRIC_CHARGE_R 0x91
;
; //突发模式
; #define CLOCK_BURST_W 0xBE
; #define CLOCK_BURST_R 0xBF
;
; //写入时钟控制信息
; //SZRST--PD5
; //SZSDA--PD6
; //SZSCK--PD7
; void SetDateTime(unsigned char cmd,unsigned char data)
; {
.dbline 50
; unsigned char i=0;
clr R20
.dbline 51
; PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
in R24,0x12
andi R24,31
out 0x12,R24
.dbline 52
; DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
in R24,0x11
ori R24,224
out 0x11,R24
.dbline 53
; PORTD|=0x20;//RESET为高 0010 0000
sbi 0x12,5
.dbline 54
; for(i=0;i<8;i++)
xjmp L5
L2:
.dbline 55
; {
.dbline 56
; if(cmd&0x01)
sbrs R16,0
rjmp L6
.dbline 57
; {
.dbline 58
; PORTD|=0x40; //0100 0000
sbi 0x12,6
.dbline 59
; }
xjmp L7
L6:
.dbline 61
; else
; {
.dbline 62
; PORTD&=0xBF; //1011 1111
in R24,0x12
andi R24,191
out 0x12,R24
.dbline 63
; }
L7:
.dbline 64
sbi 0x12,7
.dbline 65
in R24,0x12
andi R24,127
out 0x12,R24
.dbline 66
lsr R16
.dbline 67
L3:
.dbline 54
inc R20
L5:
.dbline 54
cpi R20,8
brlo L2
.dbline 68
; PORTD|=0x80; //1000 0000
; PORTD&=0x7F; //0111 1111
; cmd=cmd>>1;
; }
; for(i=0;i<8;i++)
clr R20
xjmp L11
L8:
.dbline 69
; {
.dbline 70
; if(data&0x01)
sbrs R18,0
rjmp L12
.dbline 71
; {
.dbline 72
; PORTD|=0x40;//0100 0000
sbi 0x12,6
.dbline 73
; }
xjmp L13
L12:
.dbline 75
; else
; {
.dbline 76
; PORTD&=0xBF;//1011 1111
in R24,0x12
andi R24,191
out 0x12,R24
.dbline 77
; }
L13:
.dbline 78
sbi 0x12,7
.dbline 79
in R24,0x12
andi R24,127
out 0x12,R24
.dbline 80
lsr R18
.dbline 81
L9:
.dbline 68
inc R20
L11:
.dbline 68
cpi R20,8
brlo L8
.dbline 82
; PORTD|=0x80;//SZSCK=1;
; PORTD&=0x7F;//SZSCK=0;
; data=data>>1;
; }
; PORTD&=0xDF;//设置RESET为低
in R24,0x12
andi R24,223
out 0x12,R24
.dbline -2
.dbline 83
; }
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r data 18 c
.dbsym r cmd 16 c
.dbend
.dbfunc e ReadDateTime _ReadDateTime fc
; code -> R20
; i -> R22
; cmd -> R16
.even
_ReadDateTime::
xcall push_gset2
.dbline -1
.dbline 91
;
;
; //读出时钟控制信息
; //SZRST--PD5
; //SZSDA--PD6
; //SZSCK--PD7
; unsigned char ReadDateTime(unsigned char cmd)
; {
.dbline 92
; unsigned char i=0;
clr R22
.dbline 94
; unsigned char code;//返回的数据值
; PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
in R24,0x12
andi R24,31
out 0x12,R24
.dbline 95
; DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
in R24,0x11
ori R24,224
out 0x11,R24
.dbline 96
; PORTD|=0x20;//RESET为高 0010 0000
sbi 0x12,5
.dbline 97
; for(i=0;i<8;i++)
xjmp L18
L15:
.dbline 98
; {
.dbline 99
; if(cmd&0x01)
sbrs R16,0
rjmp L19
.dbline 100
; {
.dbline 101
; PORTD|=0x40; //0100 0000
sbi 0x12,6
.dbline 102
; }
xjmp L20
L19:
.dbline 104
; else
; {
.dbline 105
; PORTD&=0xBF; //1011 1111
in R24,0x12
andi R24,191
out 0x12,R24
.dbline 106
; }
L20:
.dbline 107
sbi 0x12,7
.dbline 108
in R24,0x12
andi R24,127
out 0x12,R24
.dbline 109
lsr R16
.dbline 110
L16:
.dbline 97
inc R22
L18:
.dbline 97
cpi R22,8
brlo L15
.dbline 111
; PORTD|=0x80; //1000 0000 SZSCK=1
; PORTD&=0x7F;//SZSCK=0;
; cmd=cmd>>1;
; }
; DDRD&=0xBF;//设置PD6(SZSDA)为输入模式
in R24,0x11
andi R24,191
out 0x11,R24
.dbline 112
; for(i=0;i<8;i++)
clr R22
xjmp L24
L21:
.dbline 113
; {
.dbline 114
; code=code>>1;
lsr R20
.dbline 115
; PORTD&=0x7F;//0111 1111 设置PD7(SZSCK)为低
in R24,0x12
andi R24,127
out 0x12,R24
.dbline 116
; if(PIND&0x40)
sbis 0x10,6
rjmp L25
.dbline 117
; {
.dbline 118
; code|=0x80;
ori R20,128
.dbline 119
; }
L25:
.dbline 120
sbi 0x12,7
.dbline 121
in R24,0x12
andi R24,127
out 0x12,R24
.dbline 122
L22:
.dbline 112
inc R22
L24:
.dbline 112
cpi R22,8
brlo L21
.dbline 123
; PORTD|=0x80;//SZSCK=1;
; PORTD&=0x7F;//SZSCK=0;
; }
; PORTD&=0xDF;//设置RESET为低 1101 1111
in R24,0x12
andi R24,223
out 0x12,R24
.dbline 124
; return code;
mov R16,R20
.dbline -2
L14:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r code 20 c
.dbsym r i 22 c
.dbsym r cmd 16 c
.dbend
.dbfunc e ASCIItoBCD _ASCIItoBCD fc
; tmp -> R22
; data -> R20
.even
_ASCIItoBCD::
xcall push_gset2
mov R20,R16
.dbline -1
.dbline 131
; }
;
; //ASCII码转换为BCD码
; //输入参数data为输入的数字
; //返回值为BCD码表示的数字
; unsigned char ASCIItoBCD(unsigned char data)
; {
.dbline 133
; unsigned char tmp;
; if(data>10)
ldi R24,10
cp R24,R20
brsh L28
.dbline 134
; {
.dbline 135
; tmp=data/10;
ldi R17,10
mov R16,R20
xcall div8u
mov R22,R16
.dbline 136
; data=data%10;
ldi R17,10
mov R16,R20
xcall mod8u
mov R20,R16
.dbline 137
; data=(tmp<<4)|data;
mov R24,R22
andi R24,#0x0F
swap R24
or R20,R24
.dbline 138
; }
L28:
.dbline 139
; return data;
mov R16,R20
.dbline -2
L27:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r tmp 22 c
.dbsym r data 20 c
.dbend
.dbfunc e BCDtoASCII _BCDtoASCII fc
; tmp -> R22
; mask -> R10
; data -> R20
.even
_BCDtoASCII::
xcall push_gset3
mov R10,R18
mov R20,R16
.dbline -1
.dbline 147
; }
;
; //BCD码转换为ASCII码
; //输入参数data为BCD码
; //输入参数num为转换从最右边开始到第mask位结束
; //返回值为ASCII表示的数字
; unsigned char BCDtoASCII(unsigned char data,unsigned char mask)
; {
.dbline 148
; unsigned char tmp=0xff;
ldi R22,255
.dbline 149
; tmp=tmp>>(8-mask);
ldi R17,8
sub R17,R10
mov R16,R22
xcall lsr8
mov R22,R16
.dbline 150
; data=data&tmp;
and R20,R16
.dbline 151
; if(data>0x0f)
ldi R24,15
cp R24,R20
brsh L31
.dbline 152
; {
.dbline 153
; tmp=data&0x0f;
mov R22,R20
andi R22,15
.dbline 154
; data=data>>4;
mov R24,R20
swap R24
andi R24,#0x0F
mov R20,R24
.dbline 155
; data=data*10+tmp;
ldi R24,10
mul R24,R20
mov R20,R0
add R20,R22
.dbline 156
; }
L31:
.dbline 157
; return data;
mov R16,R20
.dbline -2
L30:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r tmp 22 c
.dbsym r mask 10 c
.dbsym r data 20 c
.dbend
.dbfunc e main _main fV
; data -> R20
.even
_main::
.dbline -1
.dbline 162
; }
;
;
; void main()
; {
.dbline 164
; unsigned char data;
; SetDateTime(TRIC_CHARGE_W,0xA5);
ldi R18,165
ldi R16,144
xcall _SetDateTime
.dbline 165
; data=ReadDateTime(TRIC_CHARGE_R);
ldi R16,145
xcall _ReadDateTime
mov R20,R16
L34:
.dbline 167
L35:
.dbline 166
xjmp L34
X0:
.dbline -2
.dbline 168
; while(1)
; ;
; }
L33:
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -