⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1307.s

📁 mega128+时实时钟日期芯片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 + -