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