📄 test.lst
字号:
(0001) #include"twi.h"
(0002) #include"ds1307.h"
(0003) #include"delay.h"
(0004)
(0005) char g_aTimeBuf[7];//日历/时钟BCD格式缓冲区
(0006) char g_aTimeBin[7];//时钟/日历二进制格式缓冲区
(0007)
(0008) /*************DS1307操作**************开始**************/
(0009) //对DS1307内存连续的写操作
(0010) unsigned char rtc_write(unsigned char addr,unsigned char *buf,unsigned char len)
(0011) {
(0012) unsigned char i;
(0013)
(0014) twi_start();
01D6 940E018C CALL _twi_start
(0015) delay_nms(10);
01D8 E00A LDI R16,0xA
01D9 E010 LDI R17,0
01DA 940E0323 CALL _delay_nms
(0016) twi_writebyte(DS1307_ADDR|TW_WRITE);
01DC ED00 LDI R16,0xD0
01DD 940E0197 CALL _twi_writebyte
(0017) delay_nms(10);
01DF E00A LDI R16,0xA
01E0 E010 LDI R17,0
01E1 940E0323 CALL _delay_nms
(0018) twi_writebyte(addr);//write address
01E3 2F04 MOV R16,R20
01E4 940E0197 CALL _twi_writebyte
(0019) delay_nms(10);
01E6 E00A LDI R16,0xA
01E7 E010 LDI R17,0
01E8 940E0323 CALL _delay_nms
(0020) for(i=0;i<len;i++)
01EA 2744 CLR R20
01EB C00C RJMP 0x01F8
(0021) {
(0022) twi_writebyte(buf[i]);
01EC 2FE4 MOV R30,R20
01ED 27FF CLR R31
01EE 0DEA ADD R30,R10
01EF 1DFB ADC R31,R11
01F0 8100 LDD R16,Z+0
01F1 940E0197 CALL _twi_writebyte
(0023) delay_nms(10);
01F3 E00A LDI R16,0xA
01F4 E010 LDI R17,0
01F5 940E0323 CALL _delay_nms
01F7 9543 INC R20
01F8 1746 CP R20,R22
01F9 F390 BCS 0x01EC
(0024) }
(0025) twi_stop();
01FA 940E0188 CALL _twi_stop
(0026) return 0;
01FC 2700 CLR R16
01FD 940E03E2 CALL pop_gset3
01FF 9508 RET
_rtc_read:
i --> R20
len --> R22
buf --> R10
addr --> R20
0200 940E03EC CALL push_gset3
0202 0159 MOVW R10,R18
0203 2F40 MOV R20,R16
0204 9721 SBIW R28,1
0205 816F LDD R22,Y+7
(0027) }
(0028)
(0029) //对DS1307内存连续的读操作
(0030) unsigned char rtc_read(unsigned char addr,unsigned char *buf,unsigned char len)
(0031) {
(0032) unsigned char i;
(0033)
(0034) rtc_write(addr,0,0); //set address
0206 2422 CLR R2
0207 8228 STD Y+0,R2
0208 2722 CLR R18
0209 2733 CLR R19
020A 2F04 MOV R16,R20
020B DFC5 RCALL _rtc_write
(0035)
(0036) delay_nms(10);
020C E00A LDI R16,0xA
020D E010 LDI R17,0
020E 940E0323 CALL _delay_nms
(0037)
(0038) twi_start();
0210 940E018C CALL _twi_start
(0039) delay_nms(10);
0212 E00A LDI R16,0xA
0213 E010 LDI R17,0
0214 940E0323 CALL _delay_nms
(0040) twi_writebyte(DS1307_ADDR|TW_READ);
0216 ED01 LDI R16,0xD1
0217 940E0197 CALL _twi_writebyte
(0041) for(i=0;i<len-1;i++)
0219 2744 CLR R20
021A C00C RJMP 0x0227
(0042) {
(0043) twi_readbyte(buf+i,TW_ACK);
021B E021 LDI R18,1
021C 2F04 MOV R16,R20
021D 2711 CLR R17
021E 0D0A ADD R16,R10
021F 1D1B ADC R17,R11
0220 940E01B1 CALL _twi_readbyte
(0044) delay_nms(10);
0222 E00A LDI R16,0xA
0223 E010 LDI R17,0
0224 940E0323 CALL _delay_nms
0226 9543 INC R20
0227 2F86 MOV R24,R22
0228 5081 SUBI R24,1
0229 1748 CP R20,R24
022A F380 BCS 0x021B
(0045) }
(0046) twi_readbyte(buf+i,TW_NACK);
022B 2722 CLR R18
022C 2F04 MOV R16,R20
022D 2711 CLR R17
022E 0D0A ADD R16,R10
022F 1D1B ADC R17,R11
0230 940E01B1 CALL _twi_readbyte
(0047) delay_nms(10);
0232 E00A LDI R16,0xA
0233 E010 LDI R17,0
0234 940E0323 CALL _delay_nms
(0048) twi_stop();
0236 940E0188 CALL _twi_stop
(0049) return 0;
0238 2700 CLR R16
0239 9621 ADIW R28,1
023A 940E03E2 CALL pop_gset3
023C 9508 RET
_RtcUpdateData:
ret --> R20
direction --> R20
023D 940E03F0 CALL push_gset1
023F 2F40 MOV R20,R16
0240 9721 SBIW R28,1
(0050) }
(0051) /*************DS1307操作**************结束**************/
(0052)
(0053) /*************接口部分****************开始**************/
(0054)
(0055)
(0056)
(0057) //更新或读取DS1307日历/时间数据
(0058) unsigned char RtcUpdateData(unsigned char direction)
(0059) {
(0060) unsigned char ret;
(0061) if(direction) //读
0241 2344 TST R20
0242 F041 BEQ 0x024B
(0062) ret=rtc_read(0,g_aTimeBuf,7);
0243 E087 LDI R24,7
0244 8388 STD Y+0,R24
0245 E620 LDI R18,0x60
0246 E031 LDI R19,1
0247 2700 CLR R16
0248 DFB7 RCALL _rtc_read
0249 2F40 MOV R20,R16
024A C007 RJMP 0x0252
(0063) else //写
(0064) ret=rtc_write(0,g_aTimeBuf,7);
024B E087 LDI R24,7
024C 8388 STD Y+0,R24
024D E620 LDI R18,0x60
024E E031 LDI R19,1
024F 2700 CLR R16
0250 DF80 RCALL _rtc_write
0251 2F40 MOV R20,R16
(0065)
(0066) return ret;
0252 2F04 MOV R16,R20
0253 9621 ADIW R28,1
0254 940E03F3 CALL pop_gset1
0256 9508 RET
_RtcReadRAM:
len --> Y+5
buf --> R22
addr --> R20
0257 940E03EE CALL push_gset2
0259 01B9 MOVW R22,R18
025A 2F40 MOV R20,R16
025B 9721 SBIW R28,1
(0067) }
(0068) //读DS1307用户RAM
(0069) unsigned char RtcReadRAM(unsigned char addr,unsigned char *buf,unsigned char len)
(0070) {
(0071) addr+=8;
025C 5F48 SUBI R20,0xF8
(0072) return rtc_read(addr,buf,len);
025D 800D LDD R0,Y+5
025E 8208 STD Y+0,R0
025F 019B MOVW R18,R22
0260 2F04 MOV R16,R20
0261 DF9E RCALL _rtc_read
0262 9621 ADIW R28,1
0263 940E03DF CALL pop_gset2
0265 9508 RET
_RtcWriteRAM:
len --> Y+5
buf --> R22
addr --> R20
0266 940E03EE CALL push_gset2
0268 01B9 MOVW R22,R18
0269 2F40 MOV R20,R16
026A 9721 SBIW R28,1
(0073) }
(0074) //写DS1307用户RAM
(0075) unsigned char RtcWriteRAM(unsigned char addr,unsigned char *buf,unsigned char len)
(0076) {
(0077) addr+=8;
026B 5F48 SUBI R20,0xF8
(0078) return rtc_write(addr,buf,len);
026C 800D LDD R0,Y+5
026D 8208 STD Y+0,R0
026E 019B MOVW R18,R22
026F 2F04 MOV R16,R20
0270 DF60 RCALL _rtc_write
0271 9621 ADIW R28,1
0272 940E03DF CALL pop_gset2
0274 9508 RET
_byte_bintobcd:
ret --> R20
bin --> R22
0275 940E03EE CALL push_gset2
0277 2F60 MOV R22,R16
(0079) }
(0080)
(0081) unsigned char byte_bintobcd(unsigned char bin)
(0082) {
(0083) unsigned char ret;
(0084) bin&=0x7f;
0278 776F ANDI R22,0x7F
(0085) bin%=100;
0279 E614 LDI R17,0x64
027A 2F06 MOV R16,R22
027B 940E03C7 CALL mod8u
027D 2F60 MOV R22,R16
(0086) ret=bin/10;
027E E01A LDI R17,0xA
027F 940E03C9 CALL div8u
0281 2F40 MOV R20,R16
(0087) ret <<=4;
0282 2F84 MOV R24,R20
0283 708F ANDI R24,0xF
0284 9582 SWAP R24
0285 2F48 MOV R20,R24
(0088) ret|=bin%10;
0286 E01A LDI R17,0xA
0287 2F06 MOV R16,R22
0288 940E03C7 CALL mod8u
028A 2B40 OR R20,R16
(0089) return ret;
028B 2F04 MOV R16,R20
028C 940E03DF CALL pop_gset2
028E 9508 RET
_byte_bcdtobin:
ret --> R20
bcd --> R16
028F 940E03F0 CALL push_gset1
(0090) }
(0091) unsigned char byte_bcdtobin(unsigned char bcd)
(0092) {
(0093) unsigned char ret;
(0094) ret=bcd & 0x0f;
0291 2F40 MOV R20,R16
0292 704F ANDI R20,0xF
(0095) ret+=(bcd>>4)*10;
0293 2F80 MOV R24,R16
0294 9582 SWAP R24
0295 708F ANDI R24,0xF
0296 E09A LDI R25,0xA
0297 9F98 MUL R25,R24
0298 0D40 ADD R20,R0
(0096) return ret;
0299 2F04 MOV R16,R20
029A 940E03F3 CALL pop_gset1
029C 9508 RET
_RtcBinToBCD:
i --> R20
029D 940E03F0 CALL push_gset1
(0097) }
(0098)
(0099) //将二进制格式缓冲区(g_aTimeBin)内容转换成BCD格式后保存到BCD格式缓冲区(g_aTimeBuf)
(0100) void RtcBinToBCD(void)
(0101) {
(0102) unsigned char i;
(0103) g_aTimeBin[0]&=0x7f;
029F 91800159 LDS R24,g_aTimeBin
02A1 778F ANDI R24,0x7F
02A2 93800159 STS g_aTimeBin,R24
(0104) g_aTimeBin[1]&=0x7f;
02A4 9180015A LDS R24,g_aTimeBin+1
02A6 778F ANDI R24,0x7F
02A7 9380015A STS g_aTimeBin+1,R24
(0105)
(0106) g_aTimeBin[2]&=0x3f;
02A9 9180015B LDS R24,g_aTimeBin+2
02AB 738F ANDI R24,0x3F
02AC 9380015B STS g_aTimeBin+2,R24
(0107)
(0108)
(0109) g_aTimeBin[3]&=0x07;
02AE 9180015C LDS R24,g_aTimeBin+3
02B0 7087 ANDI R24,7
02B1 9380015C STS g_aTimeBin+3,R24
(0110)
(0111)
(0112) g_aTimeBin[4]&=0x3f;
02B3 9180015D LDS R24,0x15D
02B5 738F ANDI R24,0x3F
02B6 9380015D STS 0x15D,R24
(0113) g_aTimeBin[5]&=0x1f;
02B8 9180015E LDS R24,0x15E
02BA 718F ANDI R24,0x1F
02BB 9380015E STS 0x15E,R24
(0114) g_aTimeBin[6]&=0xff;
02BD 9180015F LDS R24,0x15F
02BF 7F8F ANDI R24,0xFF
02C0 9380015F STS 0x15F,R24
(0115)
(0116) for(i=0;i<7;i++)
02C2 2744 CLR R20
02C3 C010 RJMP 0x02D4
(0117) g_aTimeBuf[i]=byte_bintobcd(g_aTimeBin[i]);
02C4 E589 LDI R24,0x59
02C5 E091 LDI R25,1
02C6 2FE4 MOV R30,R20
02C7 27FF CLR R31
02C8 0FE8 ADD R30,R24
02C9 1FF9 ADC R31,R25
02CA 8100 LDD R16,Z+0
02CB DFA9 RCALL _byte_bintobcd
02CC E680 LDI R24,0x60
02CD E091 LDI R25,1
02CE 2FE4 MOV R30,R20
02CF 27FF CLR R31
02D0 0FE8 ADD R30,R24
02D1 1FF9 ADC R31,R25
02D2 8300 STD Z+0,R16
02D3 9543 INC R20
02D4 3047 CPI R20,7
02D5 F370 BCS 0x02C4
02D6 940E03F3 CALL pop_gset1
02D8 9508 RET
_RtcBCDToBin:
i --> R20
02D9 940E03F0 CALL push_gset1
(0118) }
(0119)
(0120) //将BCD格式缓冲区(g_aTimeBuf)内容转换成二进制格式后保存到二进制格式缓冲区(g_aTimeBin)
(0121) void RtcBCDToBin(void)
(0122) {
(0123) unsigned char i;
(0124) for(i=0;i<7;i++)
02DB 2744 CLR R20
02DC C010 RJMP 0x02ED
(0125) g_aTimeBin[i]=byte_bcdtobin(g_aTimeBuf[i]);
02DD E680 LDI R24,0x60
02DE E091 LDI R25,1
02DF 2FE4 MOV R30,R20
02E0 27FF CLR R31
02E1 0FE8 ADD R30,R24
02E2 1FF9 ADC R31,R25
02E3 8100 LDD R16,Z+0
02E4 DFAA RCALL _byte_bcdtobin
02E5 E589 LDI R24,0x59
02E6 E091 LDI R25,1
02E7 2FE4 MOV R30,R20
02E8 27FF CLR R31
02E9 0FE8 ADD R30,R24
02EA 1FF9 ADC R31,R25
02EB 8300 STD Z+0,R16
02EC 9543 INC R20
02ED 3047 CPI R20,7
02EE F370 BCS 0x02DD
02EF 940E03F3 CALL pop_gset1
02F1 9508 RET
_RtcSetSQWOutput:
c --> Y+1
level --> R20
en --> R22
02F2 940E03EE CALL push_gset2
02F4 2F42 MOV R20,R18
02F5 2F60 MOV R22,R16
02F6 9722 SBIW R28,2
(0126) }
(0127)
(0128) //写DS1307配置字节
(0129) void RtcSetSQWOutput(unsigned char en,unsigned char level)
(0130) {
(0131) //en:方波输出允许 TRUE 有效 level:如果输出禁止 OUT口的逻辑电平
(0132) unsigned char c=0;
02F7 2422 CLR R2
02F8 8229 STD Y+1,R2
(0133) if(en) //enable
02F9 2366 TST R22
02FA F019 BEQ 0x02FE
(0134) c=0x10;
02FB E180 LDI R24,0x10
02FC 8389 STD Y+1,R24
02FD C004 RJMP 0x0302
(0135) else //disable
(0136) {
(0137) if(level)
02FE 2344 TST R20
02FF F011 BEQ 0x0302
(0138) c=0x80;
0300 E880 LDI R24,0x80
0301 8389 STD Y+1,R24
(0139) }
(0140) rtc_write(7,&c,1);
0302 E081 LDI R24,1
0303 8388 STD Y+0,R24
0304 019E MOVW R18,R28
0305 5F2F SUBI R18,0xFF
0306 4F3F SBCI R19,0xFF
0307 E007 LDI R16,7
0308 DEC8 RCALL _rtc_write
0309 9622 ADIW R28,2
030A 940E03DF CALL pop_gset2
030C 9508 RET
FILE: F:\cdy笔记本资料\E\工程\五星\设计文档\程序设计\ds1307\delay.c
(0001) /*--------------------------------------------------*/
(0002) /* AVR-ARM开发网论坛 */
(0003) /* http://www.avrarm.com */
(0004) /* AVR生成代码测试程序 */
(0005) /*--------------------------------------------------*/
(0006) /* 程序由AVR辅助开发工具V2.0.0自动生成 */
(0007) /*--------------------------------------------------*/
(0008)
(0009) #include "delay.h"
(0010)
(0011) /*-----------------------------------------------------------------------
(0012) delay_us :1us延时函数
(0013) -----------------------------------------------------------------------*/
(0014) void delay_us(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -