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

📄 pcf8563.c

📁 8563始终芯片的C举例
💻 C
📖 第 1 页 / 共 2 页
字号:

/*******************************************************************************/
/*  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 + -