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

📄 test.lst

📁 mega128+时实时钟日期芯片ds1307的例子
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -