STM8 PCF8563时钟芯片子程序
软件设计 |
---|
/********************************************************************* 微 雪 电 子 WaveShare <a class="Blue_2_12px_" href="https://wiki.diustou.com/" style="color: rgb(7, 66, 184);">http://www.waveShare.net 目 的: 建立PCF8563操作库 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 说 明: 若用于商业用途,请保留此段文字或注明代码来源 深 圳 市 微 雪 电 子 有 限 公 司 保 留 所 有 的 版 权
- /
- include <ws_i2c.h>
//器件地址:
- ifndef WD_DADR
#define WD_DADR 0xA2 //write device-address
- endif
- ifndef RD_DADR
#define RD_DADR 0xA3 //read device-address
- endif
- define CTRL_BUF1 0x00
- define CTRL_BUF2 0x01
- define SECOND_DATA_BUF 0x02
- define MINUTE_DATA_BUF 0x03
- define HOUR_DATA_BUF 0x04
- define DAY_DATA_BUF 0x05
- define WEEK_DATA_BUF 0x06
- define MONTH_DATA_BUF 0x07
- define YEAR_DATA_BUF 0x08
- define MINUTE_AE_BUF 0x09
- define HOUR_AE_BUF 0x0A
- define DAY_AE_BUF 0x0B
- define WEEK_AE_BUF 0x0C
- define CLK_FRQ_BUF 0x0D
- define TIMER_CTRL_BUF 0x0E
- define COUNT_VAL_BUF 0x0F
//changeIntToHex(33),return 0x33 //传参必须为 unsigned 类型
- define changeIntToHex(dec) ( ( ((dec)/10) <<4 ) + ((dec)%10) )
//调用changeHexToInt(0x33),return 33 //传参必须为 unsigned 类型
- define changeHexToInt(hex) ( ( ((hex)>>4) *10 ) + ((hex)%16) )
void WriteAByte(u8 wordAdr,u8 dat) { I2C_Start(); I2C_SendDAdr(WD_DADR); I2C_SendDat(wordAdr); I2C_SendDat(dat); I2C_stop(); }
void PCF8563_getTime(u8 *buf) { u8 i; I2C_Start(); I2C_SendDAdr(WD_DADR); I2C_SendDat(SECOND_DATA_BUF); I2C_Start(); I2C_SendDAdr(RD_DADR); for(i=0;i<2;i++) { buf[i]=I2C_RcvDat(); } I2C_NAck(); buf[i]=I2C_RcvDat(); I2C_stop(); I2C_Ack();
buf[0]=buf[0]&0x7f; //get second data buf[1]=buf[1]&0x7f; //get minute data buf[2]=buf[2]&0x3f; //get hour data
buf[0]=changeHexToInt(buf[0]); buf[1]=changeHexToInt(buf[1]); buf[2]=changeHexToInt(buf[2]); }
void PCF8563_setTime(u8 hour,u8 minute,u8 second) { hour=changeIntToHex(hour); //将数据的Dex格式转换为Hex格式 minute=changeIntToHex(minute); second=changeIntToHex(second);
WriteAByte(HOUR_DATA_BUF,hour); WriteAByte(MINUTE_DATA_BUF,minute); WriteAByte(SECOND_DATA_BUF,second); }
void PCF8563_init(u8 hour,u8 mintue,u8 second) { I2C_Init(); WriteAByte(CTRL_BUF1,0x00); //basic setting WriteAByte(CTRL_BUF2,0x00); PCF8563_setTime(hour,mintue,second); }