博客首页 | 排行榜 |

17652925的博客

个人档案
博文分类
铁电存储器FM24C16驱动程序(转)  2010-02-20 16:22

IIC总线的都可以用,注意要是用在AT24C系列的EEPROM 是要添加一定的延时程序~
比较简洁的程序:

#define uchar unsigned char
#define uint unsigned int
#define IIC_READ 0XA1 //定义读指令
#define IIC_WRITE 0XA0 //定义写指令
#define NOP _nop_()

//===============================
sbit SDA=P2^7; //THE SDA BIT IS PORT 2 BIT 7//
sbit SCL=P2^6; //THE SCL BIT IS PORT 2 BIT 6
sbit WP=P2^5;
sbit test=P1^0;
//===============================
//define a bit_operation byte to use in shift operation
//use this mode can achieve high operation speed uchar bdata bbyte;
//定义位操作用数组,采用此方法可提高位操作速度
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
//========================================
bit IFACK; //record the SDA state to confirn if ACK has happened
bit NO_ACK; //no ack flagbit BUS_FAULT; //bus fault flag

//========================================
//FUNCTION:ROUTES TO PROVIDE A START SIGNAL

void start(void) 
{
 SDA=1;
 SCL=1;
 SDA=0;
 SCL=0;
}

//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL

void stop(void)
{
 SCL=0;
 SDA=0;
 SCL=1;
 SDA=1;
}

//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL

void ack(void)
{
 SCL=0;
 SDA=0;
 SCL=1;
 SCL=0;
}

//=====================================
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
// OR TO PROVIDE A NO_ACK SIGNAL
//type=1等待应答信号
//type=0 产生无应答信号

void nack(uchar type)
{
 SCL=0;SDA=1;SCL=1;IFACK=SDA; SCL=0;
 if(type)
 {
  if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
  { NO_ACK=1;//用户可以加入自己的异常处理程序//
    while(1);
  }else NO_ACK=0;
 }
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER

uchar inbyte(void)

 //从IIC器件中读出数据SDA=1;
 SCL=1;a7=SDA;SCL=0;
 SCL=1;a6=SDA;SCL=0;
 SCL=1;a5=SDA;SCL=0;
 SCL=1;a4=SDA;SCL=0;
 SCL=1;a3=SDA;SCL=0;
 SCL=1;a2=SDA;SCL=0;
 SCL=1;a1=SDA;SCL=0;
 SCL=1;a0=SDA;SCL=0;
 return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER

void outbyte (uchar outdata)
{ //将数据写放IIC器件bbyte=outdata;
 SDA=a7;SCL=1;SCL=0;
 SDA=a6;SCL=1;SCL=0;
 SDA=a5;SCL=1;SCL=0;
 SDA=a4;SCL=1;SCL=0;
 SDA=a3;SCL=1;SCL=0;
 SDA=a2;SCL=1;SCL=0;
 SDA=a1;SCL=1;SCL=0;
 SDA=a0;SCL=1;SCL=0;
}

//======================================================
//FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE

void writebyte(uint add,uchar wbyte)//add为写入地址,wbyte为写入数据
{
 uchar temp;
 temp=IIC_WRITE;
 if(add>>8)
 {
  temp|=0x02;
 }
 start(); //开始信号
 outbyte(temp); //写命令nack(1); //等待应答
 outbyte((uchar)add); //写地址
 nack(1); //等待应答
 outbyte(wbyte); //写数据
 nack(1); //等待应答
 stop(); //停止信号
}

//=====================================================
//FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ

uchar readbyte (uint add)//add为读地址
{
 uchar temp,tempr;
 temp=IIC_WRITE;
 tempr=IIC_READ;
 if(add>>8)
 {
 temp|=0x02;
 tempr|=0x02;
 }
 start(); //开始信号
 outbyte(temp); //写命令
 nack(1); //等待应答
 outbyte((uchar)add); //写地址
 nack(1); //等待应答
 start(); //开始信号
 outbyte(tempr); //读命令
 nack(1); //等待应答
 temp=inbyte(); //读数据
 nack(0); //无应答
 stop(); //停止信号
 return(temp);}
//=================================================
//连写函数
//add为读起始地址,ptr数据保存指针,writelen为写入数据长度
void writebyteseq(uint add,uchar *ptr,uint writelen)
{
 uchar temp;
 uint i;
 temp=IIC_WRITE;
 if(add>>8)
 {
  temp|=0x02;}
 start();
 outbyte(temp);
 nack(1);
 outbyte((uchar)add);
 nack(1);
 for(i=0;i
   {
 outbyte(*(ptr+i));nack(1);
 }
 stop();
}
//=================================================
//连读函数
//add为读起始地址,ptr数据保存指针,writelen为读出数据长度

void readbyteseq(uint add,uchar *ptr,uint readlen)
{
 uchar temp,tempr;
 uint i;
 temp=IIC_WRITE;
 tempr=IIC_READ;
 if(add>>8)
 {
 temp|=0x02;tempr|=0x02;
 }
 start();
 outbyte(temp);
 nack(1);
 outbyte((uchar)add);
 nack(1);
 start();
 outbyte(tempr);
 nack(1);
 for(i=0;i
 {
 *(ptr+i)=inbyte();
 ack();
 }
 *(ptr+readlen-1)=inbyte();
 nack(0);
 stop();
}

类别:默认 |
上一篇:LCD1602四位数据线接法的驱动(转) | 下一篇:铁电存储器FRAM(转)
以下网友评论只代表其个人观点,不代表本网站的观点或立场