📄 pcf8563.c
字号:
/*******************************************************************************/
/* PCF8563初始化 */
/* Function : pcf_init */
/* Input : none */
/* Output : none */
/* Description : */
/* 设置和写入PCF8563控制、报警、频率寄存器,读取PCF8563的所有寄存器到430 */
/*******************************************************************************/
void pcf_init ( void )
{
char buffer[16];
pcf_bcon2 = 0x11; // Set PCF8563 Control/Status2 register
buffer[0] = pcf_bcon2;
ziic_page_write( buffer,1,ADR_CON2 );
_NOP();
pcf_bminutealarm |= ALARMBIT; // 停止所有报警,在430里设定的
pcf_bhouralarm |= ALARMBIT;
pcf_bdayalarm |= ALARMBIT;
pcf_bweekalarm |= ALARMBIT;
pcf_bclkoutfreq = 0x81; // 在430里设定CLKOUT frequency = 1024Hz
pcf_btimerfreq = 0x03; // 在430里设定定时器时钟设为1/60Hz,降低功耗
buffer[9] = pcf_bminutealarm;
buffer[10] = pcf_bhouralarm;
buffer[11] = pcf_bdayalarm;
buffer[12] = pcf_bweekalarm;
buffer[13] = pcf_bclkoutfreq;
buffer[14] = pcf_btimerfreq;
ziic_page_write ( &buffer[9],6,ADR_MINUTEALARM );// 将上述6个字节写入PCF8563
ziic_page_read ( buffer,16,ADR_CON1 );
pcf_bcon1 = buffer[0]; // 将读入内存的值赋给相应变量
pcf_bcon2 = buffer[1];
pcf_bsecond = buffer[2];
pcf_bminute = buffer[3];
pcf_bhour = buffer[4];
pcf_bday = buffer[5];
pcf_bmonth = buffer[7];
pcf_byear = buffer[8];
pcf_bminutealarm = buffer[9];
pcf_bhouralarm = buffer[10];
pcf_bdayalarm = buffer[11];
pcf_bweekalarm = buffer[12];
pcf_bclkoutfreq = buffer[13];
pcf_btimerfreq = buffer[14];
pcf_btimer = buffer[15];
}
/*******************************************************************************/
/* PCF8563的时间设置 */
/* Function : pcf_set_time */
/* Input : none */
/* Output : none */
/* Description : */
/* 停止报警寄存器,写PCF8563的前13个寄存器 */
/*******************************************************************************/
void pcf_set_time( void )
{
char buffer[16];
pcf_bcon1 = 0x00; // START PCF8563
pcf_bcon2 = 0x11;
pcf_bminutealarm |= ALARMBIT; // 停止所有报警,在430设定的
pcf_bhouralarm |= ALARMBIT;
pcf_bdayalarm |= ALARMBIT;
pcf_bweekalarm |= ALARMBIT;
buffer[0] = pcf_bcon1;
buffer[1] = pcf_bcon2;
buffer[2] = pcf_bsecond;
buffer[3] = pcf_bminute;
buffer[4] = pcf_bhour;
buffer[5] = pcf_bday;
buffer[6] = pcf_bweek;
buffer[7] = pcf_bmonth;
buffer[8] = pcf_byear;
buffer[9] = pcf_bminutealarm;
buffer[10] = pcf_bhouralarm;
buffer[11] = pcf_bdayalarm;
buffer[12] = pcf_bweekalarm;
ziic_page_write ( buffer,13,ADR_CON1 );
}
/*******************************************************************************/
/* MSP430从PCF8563里得到时间信息 */
/* Function : pcf_get_time */
/* Input : none */
/* Output : none */
/* Description : 将BCD格式的时间信息(不包括week)转换成HEX的, */
/* 并存入MSP430的pcf_wtime和pcf_wdate的相应位 */
/*******************************************************************************/
void pcf_get_time( void )
{
char buffer[16];
char month;
unsigned int nTemp;
// 从PCF8563中获得秒、分、时、天、星期、月、年这七个时间信息
ziic_page_read ( buffer,7,ADR_SECOND );
pcf_bsecond = buffer[0];
pcf_bminute = buffer[1];
pcf_bhour = buffer[2] ;
pcf_bday = buffer[3];
pcf_bweek = buffer[4];
pcf_bmonth = buffer[5];
pcf_byear = buffer[6];
pcf_bsecond &= 0x7F; // Seconds:00~59 in BCD
pcf_bminute &= 0x7F; // Minutes:00~59 in BCD
pcf_bhour &= 0x3F; // Hours:00~23 in BCD
pcf_bday &= 0x3F; // Days:01~31 in BCD
pcf_bweek &= 0x07; // Weekdays:0~6
pcf_bmonth &= 0x9F; // Months:01~12 in BCD;if Century bit=0,indicates 20xx
pcf_byear &= 0x0FF; // Years:00~99 in BCD
pcf_b10ms = 0; // 10ms
nTemp = (unsigned int)(bcd_to_hex(pcf_bsecond));//将pcf_bsecond转换成十六进制
if ( nTemp%2 ) // 求余,Second是奇数?
pcf_b10ms = 100; // 赋值1秒
pcf_wtime = nTemp/2; // seconds:0~29 in HEX->&pcf_wtime,5bits
nTemp = (unsigned int)(bcd_to_hex(pcf_bminute));
nTemp <<= 5;
pcf_wtime += nTemp; // minutes:0~59 in HEX->&pcf_wtime,6bits
nTemp = (unsigned int)(bcd_to_hex(pcf_bhour));
nTemp <<= 11;
pcf_wtime += nTemp; // hours:0~23 in HEX->&pcf_wtime,5bits
nTemp = (unsigned int)(bcd_to_hex(pcf_bday));
pcf_wdate = nTemp; // days:0~31 in HEX->&pcf_wdate,5bits
month = pcf_bmonth & 0x1F; // clear century bit
nTemp = (unsigned int)(bcd_to_hex(month));
nTemp <<= 5;
pcf_wdate += nTemp; // months:0~12 in HEX->&pcf_wdate,4bits
nTemp = (unsigned int)(bcd_to_hex(pcf_byear));
nTemp += 20;
if(pcf_bmonth & 0x80)
nTemp -= 100;
nTemp <<= 9;
pcf_wdate += nTemp; // years:0~99 in HEX->&pcf_wdate,7bits
}
/*******************************************************************************/
/* 开始PCF8563的CLKOUT */
/* Function : pcf_clkout_start */
/* Input : none */
/* Output : none */
/* Description : 设置clkout频率1Hz,写入PCF8563 */
/*******************************************************************************/
void pcf_clkout_start ( void )
{
char buffer[1];
//pcf_bclkoutfreq = 0x83; //设置clkout频率1Hz,Enable CLKOUT
buffer[0] = 0x83;
ziic_page_write(buffer,1,ADR_CLKOUTFREQ);
}
/*******************************************************************************/
/* 停止PCF8563的CLKOUT */
/* Function : pcf_clkout_stop */
/* Input : none */
/* Output : none */
/*******************************************************************************/
void pcf_clkout_stop ( void )
{
char buffer[1];
//pcf_bclkoutfreq = 0x03; //Disable CLKOUT
buffer[0] = 0x03;
ziic_page_write(buffer,1,ADR_CLKOUTFREQ);
}
/*******************************************************************************/
/* 开始PCF8563的定时器 */
/* Function : pcf_timer_start */
/* Input : none */
/* Output : none */
/* Description : */
/*******************************************************************************/
void pcf_timer_start ( void )
{
char buffer[2];
pcf_bcon2 = 0x11; //Set Control/Status2 register
buffer[0] = pcf_bcon2;
ziic_page_write(buffer,1,ADR_CON2);
_NOP();
pcf_btimerfreq = 0x81; //定时器时钟源频率64Hz,Enable Timer
pcf_btimer = 0x64; //计数周期为1秒
buffer[0] = pcf_btimerfreq;
buffer[1] = pcf_btimer;
ziic_page_write(buffer,2,ADR_TIMERFREQ);
_NOP();
}
/*******************************************************************************/
/* 停止PCF8563的定时器 */
/* Function : pcf_timer_stop */
/* Input : none */
/* Output : none */
/* Description : */
/*******************************************************************************/
void pcf_timer_stop ( void )
{
char buffer[1];
pcf_btimerfreq = 0x03; //定时器时钟设为1/60Hz,Disable timer
buffer[0] = pcf_btimerfreq;
ziic_page_write(buffer,1,ADR_TIMERFREQ);
}
/*******************************************************************************/
/* Function : bcd_to_hex */
/* Input : char (in BCD) */
/* Output : char (in HEX) */
/* Description : 把BCD格式转换十六进制格式 */
/*******************************************************************************/
char bcd_to_hex ( char bcd )
{
char high;
char low;
low = bcd & 0x0F;
high = bcd & 0x0F0;
low += (high/16)*10;
return ( low );
}
/*******************************************************************************/
/* Function : hex_to_bcd */
/* Input : char (in HEX) */
/* Output : char (in BCD) */
/* Description : 把BCD格式转换十六进制格式 */
/*******************************************************************************/
char hex_to_bcd ( char hex )
{
char low,high;
if(hex<10)
return hex;
else
{
low = hex%10;
high = (char)(hex/10);
high <<= 4;
low |= high;
return low;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -