📄 pcf8563.lst
字号:
(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 + -