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

📄 pcf8563.lst

📁 ATmega16应用例子
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0044) 
(0045) #include "D:\ICC_H\CmmICC.H"
(0046) #include "D:\ICC_H\I2C.H"
(0047) 
(0048) //器件地址:A0 A1 A2 = 0 0 0
(0049) #ifndef WR_DADR 
(0050) 	#define WR_DADR		0xA2	//write device-address 
(0051) #endif
(0052) #ifndef RD_DADR 
(0053) 	#define RD_DADR		0xA3	//read device-address
(0054) #endif
(0055) 
(0056) #define CTRL_BUF1		0x00
(0057) #define CTRL_BUF2		0x01
(0058) 
(0059) #define SECOND_DATA_BUF	0x02
(0060) #define MINUTE_DATA_BUF	0x03
(0061) #define HOUR_DATA_BUF	0x04
(0062) 
(0063) #define DAY_DATA_BUF	0x05
(0064) #define WEEK_DATA_BUF	0x06
(0065) #define MONTH_DATA_BUF	0x07
(0066) #define YEAR_DATA_BUF	0x08
(0067) 
(0068) #define MINUTE_AE_BUF	0x09
(0069) #define HOUR_AE_BUF		0x0A
(0070) #define DAY_AE_BUF		0x0B
(0071) #define WEEK_AE_BUF		0x0C
(0072) 
(0073) #define CLK_FRQ_BUF		0x0D
(0074) #define TIMER_CTRL_BUF	0x0E
(0075) #define COUNT_VAL_BUF	0x0F
(0076) 
(0077) #define PCF8563_ERR		0
(0078) #define PCF8563_CRR		1
(0079) 
(0080) /*--------------------------------------------------------------------
(0081) 函数名称:
(0082) 函数功能:写 1个 Byte 到相应的寄存器
(0083) 注意事项:
(0084) 提示说明:
(0085) 输    入:
(0086) 返    回:
(0087) --------------------------------------------------------------------*/
(0088) bool WriteAByte(uint8 wordAdr,uint8 dat)
(0089) {
(0090) 	if( I2C_Write(WR_DADR,wordAdr,dat)==I2C_ERR )
    0201 8368      STD	Y+0,R22
    0202 2F24      MOV	R18,R20
    0203 EA02      LDI	R16,0xA2
    0204 E010      LDI	R17,0
    0205 DF3E      RCALL	_I2C_Write
    0206 2300      TST	R16
    0207 F411      BNE	0x020A
(0091) 		return I2C_ERR;
    0208 2700      CLR	R16
    0209 C001      RJMP	0x020B
(0092) 	return I2C_CRR;
    020A E001      LDI	R16,1
    020B 9621      ADIW	R28,1
    020C 940E03B5  CALL	pop_gset2
    020E 9508      RET
_ReadNByte:
  num                  --> Y+9
  pRdDat               --> R22
  wordAdr              --> R20
    020F 940E03D5  CALL	push_gset2
    0211 01B9      MOVW	R22,R18
    0212 2F40      MOV	R20,R16
    0213 9725      SBIW	R28,5
(0093) }
(0094) /*--------------------------------------------------------------------
(0095) 函数名称:
(0096) 函数功能:写 N个 Byte 到相应的寄存器
(0097) 注意事项:
(0098) 提示说明:
(0099) 输    入:
(0100) 返    回:
(0101) --------------------------------------------------------------------*/
(0102) //void WriteNByte(uint8 wordAdr,uint8 num,uint8 *pWrDat)
(0103) //{
(0104) //
(0105) //}
(0106) /*--------------------------------------------------------------------
(0107) 函数名称:
(0108) 函数功能:读 1个 Byte 到相应的寄存器
(0109) 注意事项:
(0110) 提示说明:
(0111) 输    入:
(0112) 返    回:
(0113) --------------------------------------------------------------------*/
(0114) //void ReadAByte(uint8 wordAdr,uint8 *pRdDat) 
(0115) //{  
(0116) //	I2C_Start();
(0117) //
(0118) //	I2C_SendByte(WR_DADR); 			
(0119) //	I2C_WaitAck();
(0120) //
(0121) //	I2C_SendByte(wordAdr); 			
(0122) //	I2C_WaitAck();
(0123) //
(0124) //	I2C_Start();
(0125) //
(0126) //	I2C_SendByte(RD_DADR);			
(0127) //	I2C_WaitAck();
(0128) //
(0129) //	I2C_RcvByte(pRdDat);
(0130) //	I2C_SendNoAck();
(0131) //
(0132) //	I2C_Stop();
(0133) //}
(0134) /*--------------------------------------------------------------------
(0135) 函数名称:
(0136) 函数功能:读 N个 Byte 到相应的寄存器
(0137) 注意事项:
(0138) 提示说明:
(0139) 输    入:
(0140) 返    回:
(0141) --------------------------------------------------------------------*/
(0142) bool ReadNByte(uint8 wordAdr,uint8 *pRdDat,uint8 num)
(0143) {  
(0144) 	if( I2C_Read_(WR_DADR,wordAdr,RD_DADR,pRdDat,num)==I2C_ERR )
    0214 8409      LDD	R0,Y+9
    0215 820C      STD	Y+4,R0
    0216 837B      STD	Y+3,R23
    0217 836A      STD	Y+2,R22
    0218 EA83      LDI	R24,0xA3
    0219 8388      STD	Y+0,R24
    021A 2F24      MOV	R18,R20
    021B EA02      LDI	R16,0xA2
    021C E010      LDI	R17,0
    021D DF74      RCALL	_I2C_Read_
    021E 2300      TST	R16
    021F F411      BNE	0x0222
(0145) 		return I2C_ERR;
    0220 2700      CLR	R16
    0221 C001      RJMP	0x0223
(0146) 	return I2C_CRR;
    0222 E001      LDI	R16,1
    0223 9625      ADIW	R28,5
    0224 940E03B5  CALL	pop_gset2
    0226 9508      RET
_PCF8563_getTime:
  buf                  --> R20
    0227 940E03BE  CALL	push_gset1
    0229 01A8      MOVW	R20,R16
    022A 9721      SBIW	R28,1
(0147) }
(0148) /*--------------------------------------------------------------------
(0149) 函数名称:
(0150) 函数功能:获取PCF8563的时间
(0151) 注意事项:
(0152) 提示说明:
(0153) 输    入:
(0154) 返    回:
(0155) --------------------------------------------------------------------*/
(0156) void PCF8563_getTime(uint8 *buf)
(0157) {
(0158) ReadAgain:    
(0159) 	ReadNByte(SECOND_DATA_BUF,buf,3);
    022B E083      LDI	R24,3
    022C 8388      STD	Y+0,R24
    022D 019A      MOVW	R18,R20
    022E E002      LDI	R16,2
    022F DFDF      RCALL	_ReadNByte
(0160) 	buf[0]=buf[0]&0x7f;		//get second data
    0230 01FA      MOVW	R30,R20
    0231 8180      LDD	R24,Z+0
    0232 778F      ANDI	R24,0x7F
    0233 8380      STD	Z+0,R24
(0161) 	if(buf[0]==0)
    0234 8020      LDD	R2,Z+0
    0235 2022      TST	R2
    0236 F409      BNE	0x0238
(0162) 		goto ReadAgain;		//if "second==0",read again for avoid mistake
    0237 CFF3      RJMP	0x022B
(0163) 	buf[1]=buf[1]&0x7f;		//get minute data
    0238 01CA      MOVW	R24,R20
    0239 9601      ADIW	R24,1
    023A 01FC      MOVW	R30,R24
    023B 8180      LDD	R24,Z+0
    023C 778F      ANDI	R24,0x7F
    023D 8380      STD	Z+0,R24
(0164) 	buf[2]=buf[2]&0x3f;		//get hour data
    023E 01CA      MOVW	R24,R20
    023F 9602      ADIW	R24,2
    0240 01FC      MOVW	R30,R24
    0241 8180      LDD	R24,Z+0
    0242 738F      ANDI	R24,0x3F
    0243 8380      STD	Z+0,R24
(0165) 
(0166) 	buf[0]=changeHexToInt(buf[0]);
    0244 01FA      MOVW	R30,R20
    0245 8020      LDD	R2,Z+0
    0246 2433      CLR	R3
    0247 E110      LDI	R17,0x10
    0248 2D02      MOV	R16,R2
    0249 940E036D  CALL	mod8u
    024B 2D82      MOV	R24,R2
    024C 9582      SWAP	R24
    024D 708F      ANDI	R24,0xF
    024E E09A      LDI	R25,0xA
    024F 9F98      MUL	R25,R24
    0250 2C20      MOV	R2,R0
    0251 0E20      ADD	R2,R16
    0252 01FA      MOVW	R30,R20
    0253 8220      STD	Z+0,R2
(0167) 	buf[1]=changeHexToInt(buf[1]);
    0254 01CF      MOVW	R24,R30
    0255 9601      ADIW	R24,1
    0256 011C      MOVW	R2,R24
    0257 01FC      MOVW	R30,R24
    0258 8040      LDD	R4,Z+0
    0259 2455      CLR	R5
    025A E110      LDI	R17,0x10
    025B 2D04      MOV	R16,R4
    025C 940E036D  CALL	mod8u
    025E 2D84      MOV	R24,R4
    025F 9582      SWAP	R24
    0260 708F      ANDI	R24,0xF
    0261 E09A      LDI	R25,0xA
    0262 9F98      MUL	R25,R24
    0263 2C40      MOV	R4,R0
    0264 0E40      ADD	R4,R16
    0265 01F1      MOVW	R30,R2
    0266 8240      STD	Z+0,R4
(0168) 	buf[2]=changeHexToInt(buf[2]);
    0267 01CA      MOVW	R24,R20
    0268 9602      ADIW	R24,2
    0269 011C      MOVW	R2,R24
    026A 01FC      MOVW	R30,R24
    026B 8040      LDD	R4,Z+0
    026C 2455      CLR	R5
    026D E110      LDI	R17,0x10
    026E 2D04      MOV	R16,R4
    026F 940E036D  CALL	mod8u
    0271 2D84      MOV	R24,R4
    0272 9582      SWAP	R24
    0273 708F      ANDI	R24,0xF
    0274 E09A      LDI	R25,0xA
    0275 9F98      MUL	R25,R24
    0276 2C40      MOV	R4,R0
    0277 0E40      ADD	R4,R16
    0278 01F1      MOVW	R30,R2
    0279 8240      STD	Z+0,R4
(0169) }
    027A 9621      ADIW	R28,1
    027B 940E03C1  CALL	pop_gset1
    027D 9508      RET
_PCF8563_setTime:
  second               --> R20
  minute               --> R22
  hour                 --> R10
    027E 940E03D9  CALL	push_gset3
    0280 2F62      MOV	R22,R18
    0281 2EA0      MOV	R10,R16
    0282 814E      LDD	R20,Y+6
(0170) /*--------------------------------------------------------------------
(0171) 函数名称:
(0172) 函数功能:设置PCF8563的时间
(0173) 注意事项:
(0174) 提示说明:
(0175) 输    入:
(0176) 返    回:
(0177) --------------------------------------------------------------------*/
(0178) void PCF8563_setTime(uint8 hour,uint8 minute,uint8 second)
(0179) {
(0180) 	hour=changeIntToHex(hour);		//将数据的Dex格式转换为Hex格式
    0283 E01A      LDI	R17,0xA
    0284 2D0A      MOV	R16,R10
    0285 940E036D  CALL	mod8u
    0287 2E20      MOV	R2,R16
    0288 E01A      LDI	R17,0xA
    0289 2D0A      MOV	R16,R10
    028A 940E036F  CALL	div8u
    028C 2F80      MOV	R24,R16
    028D 708F      ANDI	R24,0xF
    028E 9582      SWAP	R24
    028F 2EA8      MOV	R10,R24
    0290 0CA2      ADD	R10,R2
(0181) 	minute=changeIntToHex(minute);
    0291 E01A      LDI	R17,0xA
    0292 2F06      MOV	R16,R22
    0293 940E036D  CALL	mod8u
    0295 2E20      MOV	R2,R16
    0296 E01A      LDI	R17,0xA
    0297 2F06      MOV	R16,R22
    0298 940E036F  CALL	div8u
    029A 2F60      MOV	R22,R16
    029B 706F      ANDI	R22,0xF
    029C 9562      SWAP	R22
    029D 0D62      ADD	R22,R2
(0182) 	second=changeIntToHex(second);
    029E E01A      LDI	R17,0xA
    029F 2F04      MOV	R16,R20
    02A0 940E036D  CALL	mod8u
    02A2 2E20      MOV	R2,R16
    02A3 E01A      LDI	R17,0xA
    02A4 2F04      MOV	R16,R20
    02A5 940E036F  CALL	div8u
    02A7 2F40      MOV	R20,R16
    02A8 704F      ANDI	R20,0xF
    02A9 9542      SWAP	R20
    02AA 0D42      ADD	R20,R2
(0183) 
(0184) 	WriteAByte(HOUR_DATA_BUF,hour);
    02AB 2D2A      MOV	R18,R10
    02AC E004      LDI	R16,4
    02AD DF4E      RCALL	_WriteAByte
(0185) 	WriteAByte(MINUTE_DATA_BUF,minute);
    02AE 2F26      MOV	R18,R22
    02AF E003      LDI	R16,3
    02B0 DF4B      RCALL	_WriteAByte
(0186) 	WriteAByte(SECOND_DATA_BUF,second);
    02B1 2F24      MOV	R18,R20
    02B2 E002      LDI	R16,2
    02B3 DF48      RCALL	_WriteAByte
(0187) }
    02B4 940E03B8  CALL	pop_gset3
    02B6 9508      RET
(0188) /*--------------------------------------------------------------------
(0189) 函数名称:
(0190) 函数功能:获取PCF8563的日期
(0191) 注意事项:
(0192) 提示说明:
(0193) 输    入:
(0194) 返    回:
(0195) --------------------------------------------------------------------*/
(0196) //void PCF8563_getDate()
(0197) //{
(0198) //
(0199) //}
(0200) /*--------------------------------------------------------------------
(0201) 函数名称:
(0202) 函数功能:设置PCF8563的日期
(0203) 注意事项:
(0204) 提示说明:
(0205) 输    入:
(0206) 返    回:
(0207) --------------------------------------------------------------------*/
(0208) //void PCF8563_setDate()
(0209) //{
(0210) //
(0211) //}
(0212) /*--------------------------------------------------------------------
(0213) 函数名称:
(0214) 函数功能:初始化PCF8563
(0215) 注意事项:
(0216) 提示说明:
(0217) 输    入:
(0218) 返    回:
(0219) --------------------------------------------------------------------*/
(0220) void PCF8563_init()
(0221) {
(0222) 	WriteAByte(CTRL_BUF1,0x00);			//basic setting
_PCF8563_init:
    02B7 2722      CLR	R18
    02B8 2700      CLR	R16
    02B9 DF42      RCALL	_WriteAByte
(0223) 	WriteAByte(CTRL_BUF2,0x12);			//alarm enable
    02BA E122      LDI	R18,0x12
    02BB E001      LDI	R16,1
(0224) 	//WriteAByte(HOUR_AE_BUF,0x09);		//set alarm hour at 9:00
(0225) 	//WriteAByte(CLK_FRQ_BUF,0xf0);		//set clkout frequency
(0226) }
    02BC CF3F      RJMP	_WriteAByte
FILE: E:\ProductPro\M16SD\ICCAVR\PCF8563\PCF8563\PCF8563.C
(0001) /*********************************************************************
(0002) 	微 雪 电 子   WaveShare   http://www.waveShare.net            	
(0003) 		                                                        
(0004) 目    的:   建立PCF8563测试程序
(0005) 	
(0006) 目标系统:   基于AVR单片机
(0007) 		                                                                
(0008) 应用软件:   ICCAVR
(0009) 		                                                                
(0010) 版    本:   Version 1.0                                                          
(0011) 		                                                                
(0012) 圆版时间:   2005-06-25
(0013) 	
(0014) 开发人员:   SEE(中文名不告诉你~怕你骂我)
(0015) 
(0016) 说	 明:   若用于商业用途,请保留此段文字或注明代码来源
(0017) 	
(0018) 	深 圳 微 雪 电 子 保 留 所 有 的 版 权     
(0019) *********************************************************************/
(0020) 
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024) 		版    本:   Version 1.1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -