www.pudn.com > fm3164.rar > FM3164.C


 
#include  
#include  
#include  
#define FM3164_DIR P3DIR  //将来用P6.0,P6.1 
#define FM3164_OUT P3OUT 
#define FM3164_IN  P3IN 
#define SDA        BIT0 
#define SCL        BIT1 
unsigned char *x1,xx,aa,bb,cc,dd; 
unsigned int *m1; 
float *f1; 
struct str 
{ 
unsigned int aaa,ccc; 
float bbb,ddd; 
}qqq; 
 
//开始子程序 
void Start_FM3164(void) 
{ 
  FM3164_DIR |=SDA+SCL; //端口置为输出 
  FM3164_OUT &=~SCL;    //时钟置低 
  FM3164_OUT |=SDA;     //数据置高 
  FM3164_OUT |=SCL;     //时钟置高 
  FM3164_OUT &=~SDA;    //数据置低 
  FM3164_OUT &=~SCL;    //时钟置低 
} 
//停止子程序 
void Stop_FM3164(void) 
{ 
  FM3164_OUT &=~SCL;    //时钟置低 
  FM3164_OUT &=~SDA;    //数据置低 
  FM3164_OUT |=SCL;     //时钟置高 
  FM3164_OUT |=SDA;     //数据置高 
  FM3164_OUT &=~SCL;    //时钟置低 
} 
//主应答子程序(Ack=0:应答,Ack=1:非应答) 
void Answer_FM3164(unsigned char Ack) 
{ 
  FM3164_DIR |=SDA;     //端口置为输出 
  FM3164_OUT &=~SCL;    //时钟置低 
  if(Ack==0) 
  {FM3164_OUT &=~SDA;}  //数据置低(应答信号) 
  else 
  {FM3164_OUT |=SDA;}   //数据置高(非应答信号) 
  FM3164_OUT |=SCL;     //时钟置高 
  FM3164_OUT &=~SCL;    //时钟置低 
} 
//接收应答信号 
unsigned char RAnswer(void) 
{ 
  FM3164_OUT |=SDA;     //数据口置高,释放SDA信号 
  FM3164_DIR &=~SDA;    //P3.1置为输入 
  FM3164_OUT |=SCL;     //时钟置高 
  if((FM3164_IN & SDA)==0)//判断FM3164是否发出应答信号,SDA=0,应答 
  { 
    FM3164_OUT &=~SCL;  //时钟置低 
    FM3164_DIR |=SDA;   //P3.1置为输出 
    return(0); 
  } 
  else 
  { 
    FM3164_OUT &=~SCL; 
    FM3164_DIR |=SDA; 
    return(1); 
  } 
} 
//发送字节子程序,Byte为要发送的字节 
void Send_FM3164_Byte(unsigned char Byte) 
{ 
  unsigned char i; 
  for(i=0;i<8;i++) 
  { 
    FM3164_OUT &=~SCL;  //时钟置低 
    if(Byte & 0x80) 
    {FM3164_OUT |=SDA;}//如果最高位为1,则数据输出高 
    else 
    {FM3164_OUT &=~SDA;}//如果最高位为0,则数据输出低 
    FM3164_OUT |=SCL;   //时钟置高 
    FM3164_OUT &=~SCL;  //时钟置低 
    Byte<<=1;           //发送字节左移一位 
  } 
  FM3164_OUT |=SDA;     //发送完字节后,释放总线准备接收3164应答 
  FM3164_OUT |=SCL;     //发一个时钟信号,SDA上的数据即是从机应答位 
  FM3164_OUT &=~SCL;   
} 
//接收字节子程序 
unsigned char Read_FM3164_Byte(void) 
{ 
  unsigned char Byte=0,i; 
  FM3164_OUT |=SDA;     //释放SDA 
  FM3164_DIR &=~SDA;    //数据口置为输入 
  FM3164_OUT &=~SCL;    //时钟置低 
  for(i=0;i<8;i++) 
  { 
    FM3164_OUT |=SCL;   //时钟置高 
    Byte<<=1;           //读入的数据左移一位    
    Byte|=(FM3164_IN & SDA);//读SDA状态,与Byte按位或,存入Byte 
    FM3164_OUT &=~SCL;  //时钟置低 
  } 
  return(Byte);         //返回读出的字节 
} 
 
//写FM3164FRAM子程序 
void Write_FM3164_FRAM(unsigned char HFRAM,unsigned char LFRAM,unsigned char * Hand,unsigned char Num) 
{ 
  unsigned char i; 
  Start_FM3164();             //发送开始信号 
  Send_FM3164_Byte(0xa0);     //发送FRAM写指令 
  Send_FM3164_Byte(HFRAM);    //发送内存高字节地址 
  Send_FM3164_Byte(LFRAM);    //发送内存低字节地址  
  for(i=0;i