📄 ds1302.s
字号:
.module ds1302.c
.area text(rom, con, rel)
.dbfile D:\时钟芯片\1302\1302-162\ds1302.c
.dbfunc e delay _delay fV
; a -> R20
; n -> R16
.even
_delay::
rcall push_gset1
.dbline -1
.dbline 9
;
; #include <io8515v.h>
; #include <macros.h>
; #include <162-1302.h>
; /************************************************
; 延时程序
; ************************************************/
; void delay(uchar n)
; {
.dbline 11
; uchar a;
; for(a=0;a<n;a++)
clr R20
rjmp L5
L2:
.dbline 12
L3:
.dbline 11
inc R20
L5:
.dbline 11
cp R20,R16
brlo L2
.dbline -2
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r n 16 c
.dbend
.dbfunc e write_data _write_data fV
; temp -> R20
; i -> R22
; data -> R10
; addr -> R22
.even
_write_data::
rcall push_gset3
mov R10,R18
mov R22,R16
.dbline -1
.dbline 18
; ;
; }
; /****************************************************
; 写一个字节
; ****************************************************/
; void write_data(uchar addr,uchar data)
; {
.dbline 20
; unsigned char i,temp;
; T_DDR|=T_IO;
sbi 0x14,6
.dbline 21
; T_PORT&=~T_RST;
cbi 0x15,7
.dbline 22
; T_PORT&=~T_CLK;
cbi 0x15,5
.dbline 23
; asm("nop");
nop
.dbline 24
; asm("nop");
nop
.dbline 25
; asm("nop");
nop
.dbline 26
; asm("nop");
nop
.dbline 27
; T_PORT|=T_RST; //时钟信号低时拉高RST初始化
sbi 0x15,7
.dbline 28
; temp=addr;
mov R20,R22
.dbline 29
; for(i=0;i<8;i++)
clr R22
rjmp L10
L7:
.dbline 30
; {
.dbline 31
; if(temp&(1<<i))
ldi R16,1
mov R17,R22
rcall lsl8
mov R2,R20
and R2,R16
breq L11
.dbline 32
; T_PORT |=T_IO ;
sbi 0x15,6
rjmp L12
L11:
.dbline 34
; else
; T_PORT &=~T_IO ;
cbi 0x15,6
L12:
.dbline 35
nop
.dbline 36
nop
.dbline 37
sbi 0x15,5
.dbline 38
nop
.dbline 39
cbi 0x15,5
.dbline 40
L8:
.dbline 29
inc R22
L10:
.dbline 29
cpi R22,8
brlo L7
.dbline 41
; asm("nop");
; asm("nop");
; T_PORT |=T_CLK; //时钟上升沿写入数据
; asm("nop");
; T_PORT &=~T_CLK; //时钟拉低电平
; }
; temp=data;
mov R20,R10
.dbline 42
; for(i=0;i<8;i++)
clr R22
rjmp L16
L13:
.dbline 43
; {
.dbline 44
; if(temp&(1<<i))
ldi R16,1
mov R17,R22
rcall lsl8
mov R2,R20
and R2,R16
breq L17
.dbline 45
; T_PORT |=T_IO ;
sbi 0x15,6
rjmp L18
L17:
.dbline 47
; else
; T_PORT &=~T_IO ;
cbi 0x15,6
L18:
.dbline 48
nop
.dbline 49
nop
.dbline 50
sbi 0x15,5
.dbline 51
nop
.dbline 52
cbi 0x15,5
.dbline 53
L14:
.dbline 42
inc R22
L16:
.dbline 42
cpi R22,8
brlo L13
.dbline 54
; asm("nop");
; asm("nop");
; T_PORT |=T_CLK; //时钟上升沿写入数据
; asm("nop");
; T_PORT &=~T_CLK; //时钟拉低电平
; }
; T_PORT&=~T_RST; //禁止DS1302
cbi 0x15,7
.dbline -2
L6:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r data 10 c
.dbsym r addr 22 c
.dbend
.dbfunc e read_data _read_data fc
; k -> R20
; temp -> R22
; i -> R10
; addr -> R20
.even
_read_data::
rcall push_gset3
mov R20,R16
.dbline -1
.dbline 61
; }
;
; /***************************************************
; 读一个字节
; ***************************************************/
; uchar read_data(uchar addr)
; {
.dbline 63
; uchar i,temp,k;
; temp=0;
clr R22
.dbline 64
; T_DDR|=T_IO;
sbi 0x14,6
.dbline 65
; T_PORT&=~T_RST;
cbi 0x15,7
.dbline 66
; T_PORT&=~T_CLK;
cbi 0x15,5
.dbline 67
; asm("nop");
nop
.dbline 68
; asm("nop");
nop
.dbline 69
; asm("nop");
nop
.dbline 70
; asm("nop");
nop
.dbline 71
; T_PORT|=T_RST; //时钟信号低时拉高RST初始化
sbi 0x15,7
.dbline 72
; temp=addr;
mov R22,R20
.dbline 73
; for(i=0;i<8;i++)
clr R10
rjmp L23
L20:
.dbline 74
; {
.dbline 75
; if(temp&(1<<i))
ldi R16,1
mov R17,R10
rcall lsl8
mov R2,R22
and R2,R16
breq L24
.dbline 76
; T_PORT |=T_IO ;
sbi 0x15,6
rjmp L25
L24:
.dbline 78
; else
; T_PORT &=~T_IO ;
cbi 0x15,6
L25:
.dbline 79
nop
.dbline 80
nop
.dbline 81
sbi 0x15,5
.dbline 82
cbi 0x15,5
.dbline 83
L21:
.dbline 73
inc R10
L23:
.dbline 73
mov R24,R10
cpi R24,8
brlo L20
.dbline 84
; asm("nop");
; asm("nop");
; T_PORT |=T_CLK; //时钟上升沿写入数据
; T_PORT &=~T_CLK; //时钟拉低电平
; }
; T_DDR&=~T_IO;
cbi 0x14,6
.dbline 85
; for(i=0;i<8;i++)
clr R10
rjmp L29
L26:
.dbline 86
; {
.dbline 87
; k=(T_PIN&T_IO);
in R20,0x13
andi R20,64
.dbline 88
; if(k==T_IO)
cpi R20,64
brne L30
.dbline 89
; temp|=(1<<i);
ldi R16,1
mov R17,R10
rcall lsl8
or R22,R16
rjmp L31
L30:
.dbline 91
; else
; temp&=~(1<<i);
ldi R16,1
mov R17,R10
rcall lsl8
mov R2,R16
com R2
and R22,R2
L31:
.dbline 92
nop
.dbline 93
nop
.dbline 94
sbi 0x15,5
.dbline 95
cbi 0x15,5
.dbline 96
L27:
.dbline 85
inc R10
L29:
.dbline 85
mov R24,R10
cpi R24,8
brlo L26
.dbline 97
; asm("nop");
; asm("nop");
; T_PORT|=T_CLK; //上升沿读出数据
; T_PORT &=~T_CLK; //时钟电平拉低
; }
; T_DDR|=T_IO;
sbi 0x14,6
.dbline 98
; T_PORT&=~T_CLK;
cbi 0x15,5
.dbline 99
; T_PORT&=~T_RST; //禁止DS1302
cbi 0x15,7
.dbline 100
; return(temp);
mov R16,R22
.dbline -2
L19:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbsym r temp 22 c
.dbsym r i 10 c
.dbsym r addr 20 c
.dbend
.dbfunc e init_1302 _init_1302 fV
.even
_init_1302::
.dbline -1
.dbline 104
; }
; //1302初始化
; void init_1302()
; {
.dbline 105
; write_data(0x8e,0x00); //关闭寄存器写保护
clr R18
ldi R16,142
rcall _write_data
.dbline 106
; write_data(0x90,0x00); //写充电寄存器
clr R18
ldi R16,144
rcall _write_data
.dbline 107
; write_data(0x80,0x00); //秒寄存器停止位置0,时钟启动,初值设为0
clr R18
ldi R16,128
rcall _write_data
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_time _init_time fV
; d -> y+10
; month -> y+8
; day -> y+6
; hour -> y+4
; min -> R20
; sec -> R22
.even
_init_time::
rcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 111
; }
;
; void init_time(uchar sec,uchar min,uchar hour,uchar day,uchar month,uchar d)
; {
.dbline 112
; write_data(0x80,sec);
mov R18,R22
ldi R16,128
rcall _write_data
.dbline 113
; write_data(0x82,min);
mov R18,R20
ldi R16,130
rcall _write_data
.dbline 114
; write_data(0x84,hour);
ldd R18,y+4
ldi R16,132
rcall _write_data
.dbline 115
; write_data(0x86,day);
ldd R18,y+6
ldi R16,134
rcall _write_data
.dbline 116
; write_data(0x88,month);
ldd R18,y+8
ldi R16,136
rcall _write_data
.dbline 117
; write_data(0x8a,d);
ldd R18,y+10
ldi R16,138
rcall _write_data
.dbline -2
L33:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l d 10 c
.dbsym l month 8 c
.dbsym l day 6 c
.dbsym l hour 4 c
.dbsym r min 20 c
.dbsym r sec 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -