main.c

来自「IAR WorkBench下」· C语言 代码 · 共 392 行

C
392
字号
#include  <msp430x14x.h>
#include <in430.h>
#include  <string.h>
#include <stdio.h>

#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;i<count;i++)
    {
        if(IICWriteByte(*p))return(1);
        p++;
    };
    
    IICStop();
    return(0);
}

/********************************************************************************************************
** 函数名称: PCF8563ReadData
** 功能描述: 
** 输 入: 无
** 输 出: 无
** 全局变量: 无
*-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit PCF8563ReadData(uint8 word_address,uint8  *p,uint8 count)
{
    uint8 i;
    uint8 slave_address;
  
    slave_address=PCF8563_ADDR;
  
    P1DIR |= IICSCL;  //define to output 
    IICSDAOut(); //define to output
    
    IICStart();
  
    slave_address &= 0xfe;
    if(IICWriteByte(slave_address)) return(1);
    if(IICWriteByte(word_address)) return(1);
  
    IICStart();
    slave_address |= 0x01;
    if(IICWriteByte(slave_address))return(1);
  
    for(i=1;i<count;i++)
    {
        *p=IICReadByteWithAck();
        p++;  
    };
    *p=IICReadByteWithoutAck();
    
    IICStop();
    
    return(0);
}

//main
void main(void)
{
    uint8 Buf[128],stat;
    uint16 i;
  
    WDTCTL = WDTPW + WDTHOLD;             // Stop WDT  

    BCSCTL1&=~XT2OFF;       //XT2 available         
    BCSCTL2|=SELM1;         //Mclk,SMCLK=8M
    BCSCTL2|=SELS; 

    do              
    { 
        int k = 0xff;
        IFG1 &= ~OFIFG;              
        for(k=0xff; k>0;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++);       
    };
}







⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?