⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 93lc66.c

📁 HT1621驱动和EEPROM93LC
💻 C
字号:




#define uchar unsigned char
#define uint unsigned int

sbit CS_93c66=P0^0;
sbit SK_93c66=P0^1;
sbit DI_93c66=P0^2;
sbit DO_93c66=P0^3;

void START_93c66();
void END_93c66();
void EWEN_93c66();
void EWDS_93c66();
unsigned char READ(unsigned int);//定义读操作
unsigned char WRITE(unsigned char address,unsigned int op_data);//定义写操作
void SEND_DATA_93c66(unsigned int,unsigned char);
void delay1(unsigned int);
unsigned char ERAL();
#define  _Nop() _nop_()


/*93c66 操作子程序 */
/* 注意:这里使用的93c66 为8 位结构的EEROM*/
void delay1(unsigned int num)
{
while(num!=0)
{num=num-1;}
}
/***********************************************************************/
/*名称: START_93c66() */
/*说明: 用于93c66 的启动,防止由于CS_93c66 的改动而引起数据时序混乱 */
/***********************************************************************/
void START_93c66()
{
DO_93c66=1; /*防止DO 由于是低电平而无法输入*/
CS_93c66=1;
/*开启93c66*/
CS_93c66=0;
DI_93c66=0;
SK_93c66=0;
CS_93c66=1;
delay1(1000);
}
/***************************************************************************/
/*名称:END_93c66() */
/*说明:用于93c66 的结束,防止由于CS_93c66 的改动而引起数据线为0 而无法输入*/
/***************************************************************************/
void END_93c66()
{
CS_93c66=0;
DI_93c66=1;
SK_93c66=1;
}
/***********************************************************************/
/*名称:SEND_DATA_93c66() */
/*说明:在93c66 启动下,送入指定位数的数据 */
/*输入: op_data 要输入的数据 */
/* num 输入的位数 */
/**********************************************************************/
void SEND_DATA_93c66(unsigned int op_data,unsigned char num)
{
unsigned char temp1;
op_data=op_data<<(16-num); /*左移去掉无用位*/
for(temp1=0;temp1<num;temp1++)
  {
  if( (op_data&0X8000)==00 )
  {DI_93c66=0;}
  else
  {DI_93c66=1;}
  SK_93c66=1;SK_93c66=1;SK_93c66=1;SK_93c66=1;
  SK_93c66=0;
  op_data=op_data<<1;
  }
}
/***********************************************************************/
/*名称: EWEN_93c66() */
/*说明: 93c66 的编程启动.操作码(100 11XX XXXX) */
/***********************************************************************/
void EWEN_93c66()
{
START_93c66();
SEND_DATA_93c66(0X0004,0X03); /*送入3 位操作码*/
SEND_DATA_93c66(0X00c0,0x08); /*送入8 位地址*/
END_93c66();
}
/***********************************************************************/
/*名称: EWDS_93c66() */
/*说明: 93c66 的编程关闭.操作码(100 00XX XXXX) */
/**********************************************************************/
void EWDS_93c66()
{
START_93c66();
SEND_DATA_93c66(0X0004,0X03);
SEND_DATA_93c66(0X0000,0x08);
END_93c66();
}
/***********************************************************************/ 
/*名称:READ() */
/*说明:93c66 的字读取程序 */
/*输入:要读取的字节地址(9 位) */
/*输出:读取的字数值 */
/**********************************************************************/
unsigned char READ(unsigned int address)
{
unsigned char temp1;
unsigned int temp2;
START_93c66();
SEND_DATA_93c66(0X0006,3);
SEND_DATA_93c66(address,8);
temp2=0; /*存放返回数据的缓冲先清零*/
for(temp1=0;temp1<16;temp1++) /*循环读出16个数据*/
  {
  temp2=temp2<<1;
  SK_93c66=1;SK_93c66=0;
  if(DO_93c66==1)
    {temp2=temp2|0X01;
    }
  }
  END_93c66();
  return temp2;
}
/**********************************************************************/
/*名称:WRITE() */
/*说明:93c66 的字写入程序 */
/*输入: address 要写入的字节地址(9 位) */
/* op_data 要写入的数据(16位) */
/*输出: 读取的字数值 */
/**********************************************************************/
unsigned char WRITE(unsigned char address,unsigned int op_data)
{
unsigned char temp1;
unsigned int temp2;
EWEN_93c66();
START_93c66();
SEND_DATA_93c66(0X0005,3);
SEND_DATA_93c66(address,8);
SEND_DATA_93c66(op_data,16);
CS_93c66=1;
CS_93c66=0;
temp1=1;
temp2=50000; /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/
while(!DO_93c66)
  {
  temp2=temp2-1;
  if(temp2==0)
    {temp1=0;//temp1=0则写入失败  
     break; /*最大等待延时后说明擦除失败*/
    }
  }
END_93c66();
EWDS_93c66();
return temp1;
}
/***********************************************************************/
/*名称:ERASE() */
/*说明:93c66 的字擦除程序 */
/*输入: address 要擦除的字地址(9 位) */
/**********************************************************************/
/*unsigned char ERASE(unsigned char address)
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93c66();
START_93c66();
SEND_DATA_93c66(0X07,0X03);
SEND_DATA_93c66(address,0X06);
CS_93c66=1;
CS_93c66=0;
temp1=1;
temp2=50000;
while(!DO_93c66)
     {temp2=temp2-1;
      if(temp2==0)
        {temp1=0;
         break;
        }
     }
END_93c66();
EWDS_93c66(); //返回表示擦除状态的特征
return temp1;
}*/

/**********************************************************************/
/*名称:ERAL() */
/*说明:93c66 的全部擦除程序 */
/**********************************************************************/
/*unsigned char ERAL()
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93c66();
START_93c66();
SEND_DATA_93c66(0X0004,3);
SEND_DATA_93c66(0X0080,8);
CS_93c66=1;
CS_93c66=0;
temp1=1;
temp2=50000;
while(!DO_93c66)
     {temp2=temp2-1;
      if(temp2==0)
        {temp1=0;
         break;
        }
     }
END_93c66();
EWDS_93c66(); //返回表示擦除状态的特征
return temp1;
}*/
/***********************************************************************/
/*名称:WRAL() */
/*说明:93c66 的写全部程序 */
/*输入: op_data 要写入的数据(16 位) */
/*输出: 读取的字数值 */
/***********************************************************************/
/*unsigned char WRAL(unsigned int op_data)
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93c66();
START_93c66();
SEND_DATA_93c66(0X04,0X03);
SEND_DATA_93c66(0X10,0X06);
SEND_DATA_93c66(op_data,0X10);
CS_93c66=1;
CS_93c66=0;
temp1=1;
temp2=50000; //设置一个最大延时等待数值.注意在不同的晶振下延时是不同的
while(!DO_93c66)
     {temp2=temp2-1;
      if(temp2==0)
        {temp1=0;
         break;
        }
     }
END_93c66();
EWDS_93c66();
return op_data;
}*/

⌨️ 快捷键说明

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