www.pudn.com > msp430_pcf8563.rar > main.c


#include   
#include  
#include   
#include  
 
#include "xtype.h" 
 
#define PCF8563_ADDR 0xa2 
 
#define IICSDA 0x01 
#define IICSCL 0x20 
 
#define IICSDAIn()   P2DIR &= ~IICSDA 
#define IICSDAOut()  P2DIR |= IICSDA 
 
#define IICSetSDA()  P2DIR |= IICSDA;P2OUT |= IICSDA 
#define IICClrSDA()  P2DIR |= IICSDA;P2OUT &= ~IICSDA 
#define IICReadSDA() P2IN & IICSDA  
 
#define IICSetSCL()  P1OUT |= IICSCL;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP() 
#define IICClrSCL()  P1OUT &= ~IICSCL;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP() 
 
 
/******************************************************************************************************** 
** 函数名称: WriteDelay 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
void WriteDelay(void) 
{ 
  uint16 i; 
  for(i=0;i<8000;i++); 
} 
void Delay(uint16 i) 
{ 
    while(i-->0); 
} 
/******************************************************************************************************** 
** 函数名称: IICStart 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------  
********************************************************************************************************/ 
void IICStart(void) 
{ 
  IICSetSDA(); 
  Delay(10); 
  IICSetSCL(); 
  Delay(10); 
  IICClrSDA(); 
  Delay(10);   
  IICClrSCL(); 
} 
/******************************************************************************************************** 
** 函数名称: IICStop 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
void IICStop(void) 
{ 
  IICClrSDA(); 
  Delay(10);   
  IICSetSCL(); 
  IICSetSDA(); 
  IICSetSCL(); 
} 
/******************************************************************************************************** 
** 函数名称: IICReadAck 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
bit IICReadAck(void) 
{ 
  bit status; 
  IICSetSDA(); 
  IICSDAIn(); 
   
  IICSetSCL();   
  status=IICReadSDA(); 
   
  IICClrSCL(); 
  IICSDAOut(); 
   
  return(status); 
} 
/******************************************************************************************************** 
** 函数名称: IICWriteAck 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
void IICWriteAck(void) 
{ 
  IICSDAOut();  
  IICClrSDA(); 
  Delay(10);   
  IICSetSCL(); 
  Delay(10);     
  IICClrSCL();   
  IICSetSDA(); 
} 
/******************************************************************************************************** 
** 函数名称: IICNoAck 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
void IICNoAck(void) 
{ 
  IICSDAOut(); 
  IICSetSDA(); 
   
  IICSetSCL(); 
  IICClrSCL(); 
} 
/******************************************************************************************************** 
** 函数名称: IICWriteByte 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
bit IICWriteByte(uint8 v) 
{ 
  uint8 i; 
  for(i=0;i<8;i++) 
  { 
    if(v &0x80) 
    { 
      IICSetSDA(); 
    } 
    else 
    { 
      IICClrSDA(); 
    } 
    IICSetSCL(); 
    IICClrSCL(); 
    v=v<<1; 
  }; 
 
//  IICSetSDA(); 
  IICSDAIn(); 
   
  IICSetSCL();  
   
  i =IICReadSDA(); 
  IICClrSCL(); 
   
  IICSDAOut(); 
   
  return(i); 
} 
/******************************************************************************************************** 
** 函数名称: IICReadByteWithAck 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
uint8 IICReadByteWithAck(void) 
{ 
  uint8 rc,i; 
  rc=0; 
   
  IICSDAOut(); 
  IICSetSDA(); 
   
  IICSDAIn(); 
  for(i=0;i<8;i++) 
  { 
    rc=rc<<1; 
    IICSetSCL(); 
    rc=(IICReadSDA())?(rc | 0x01):(rc); 
    IICClrSCL(); 
  }; 
   
  IICWriteAck(); 
  return(rc); 
} 
/******************************************************************************************************** 
** 函数名称: IICReadByteWithoutAck 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
uint8 IICReadByteWithoutAck(void) 
{ 
  uint8 rc,i; 
  rc=0; 
   
  IICSDAOut(); 
  IICSetSDA(); 
   
  IICSDAIn(); 
  for(i=0;i<8;i++) 
  {  
    rc=rc<<1; 
    IICSetSCL();     
     
    rc=(IICReadSDA())?(rc | 0x01):(rc); 
    IICClrSCL(); 
  }; 
  IICNoAck(); 
  return(rc); 
} 
 
/******************************************************************************************************** 
** 函数名称: PCF8563WriteData 
** 功能描述:  
** 输 入: 无 
** 输 出: 无 
** 全局变量: 无 
*------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
bit PCF8563WriteData(uint8 word_address,uint8 *p,uint8 count) 
{ 
    uint8 i; 
    uint8 slave_address; 
   
    slave_address = PCF8563_ADDR; 
    slave_address &= 0xfe; 
   
    P1DIR |= IICSCL;  //define to output  
    IICSDAOut(); //define to output 
   
    IICStart(); 
     
    if(IICWriteByte(slave_address))return(1); 
    if(IICWriteByte(word_address))return(1); 
     
    for(i=0;i0;k--);        
    } 
    while((IFG1&OFIFG)!=0);  
    
    stat = PCF8563ReadData(0, Buf, 1); 
    printf("%x\n", Buf[0]); 
   
    Buf[0]|=0x20;   
    PCF8563WriteData(0, Buf, 1); 
 
    stat = PCF8563ReadData(0, Buf, 1); 
    printf("%x\n", Buf[0]); 
   
    Buf[0]&=~0x20;   
    PCF8563WriteData(0, Buf, 1); 
 
    stat = PCF8563ReadData(0, Buf, 1); 
    printf("%x\n", Buf[0]); 
 
    memset(Buf,0,sizeof(Buf)); 
    stat = PCF8563WriteData(0x02, Buf, 7);     
   
    while(1) 
    {     
        stat = PCF8563ReadData(0x02, Buf, 7);      
         
        Buf[5] = Buf[5]&0x1f; 
        Buf[3] = Buf[3]&0x3f; 
        Buf[2] = Buf[2]&0x3f; 
        Buf[1] = Buf[1]&0x7f; 
        Buf[0] = Buf[0]&0x7f; 
         
        printf("%02X-%02X-%02X %02X:%02X:%02X\n",Buf[6], Buf[5],Buf[3], Buf[2], Buf[1], Buf[0]);     
        for(i=0;i<0x3fff;i++);        
    }; 
}