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

📄 eeprom.c

📁 此程序可以驱动所有基于iic的器件
💻 C
字号:
    #include	"register.h"
    int index=0,readdata,refe[214],disk[214]={0,1,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,2,1,90,25,0,15,0,20,0,15,0,30,0,45,0,60,0,75,0,90,0,105,0,120,0,135,0,150,0,165,0,180,0,195,0,210,0,225,0,240,0,255,0,14,1,29,1,44,1,59,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,90,25,0,15,0,20,0,0,0,15,0,30,0,45,0,60,0,75,0,90,0,105,0,120,0,135,0,150,0,165,0,180,0,195,0,210,0,225,0,240,0,255,0,14,1,29,1,44,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int  initial()
{
	 asm(" setc	SXM");				// 符号位扩展有效
	 asm(" clrc	OVM");				// 累加器中结果正常溢出
 	 asm(" clrc	CNF");				// B0被配置为数据存储空间
	 *WDCR=0x6F;				//  不使能看门狗  E8?
		     					// 软件禁止看门狗
 	 *SCSR1=0x83FF;				// CLKIN=15M,CLKOUT=4*CLKIN=30M
 	 *IMR=0x0000;				// 禁止所有中断
	 *IFR=0x0FFFF;				// 清除全部中断标志,"写1清0"
   	  WSGR=0X00;				// 禁止所有的等待状态
 	 *MCRA=0x0283;			// IOPA0,2-6,IOPB2-7端口配置为一般的I/O功能
	 *PADATDIR=0x7D03;	    //IOPA2-6输出低电平,B7279时钟,DATA,273CLR,CLK输出低电平
	 *PBDATDIR=0xFD08;  	// IOPB0-2-7端口设置为输出低电平方式,3为高电平
	 *MCRC=0x8014;			//IOPF0-6, IOPE0,1,3,5~7配置为一般的I/O功能,
	 *PFDATDIR=0X87FF;	    // IOPF0-2端口为输出低电平端口,IOPF3-IOPF6为输入端口  
     *PEDATDIR=0XE30B;  	// IOPE0,5-7端口为输出低电平端口	E1输出高电平,E0为EEPROM CLK E1为 SI E3 为SO输入 读为高
     *MCRB=0XFE00;			//IOPC0~7配置为一般的I/O功能,IOPD0为EEPROM片选为高
     *PCDATDIR=0XFF01;	    // IOPC0-7端口为输出低电平端口,0高B7279片选
     *PDDATDIR=0XFF01;	    // IOPD0端口为输出高电平端口 EEPROM片选	
}
void Start()
{
     int i;
	 *PEDATDIR=*PEDATDIR|0x0303;    //SDA高 时钟 SDA输出为高
	 for(i=0;i<0x0015;i++)
	  i=i;
	 *PEDATDIR=*PEDATDIR&0xFFFD;   //SDA输出为低	    
	 for(i=0;i<0x0015;i++)
	  i=i;
}
int SendByte(int databyte)
{
    int k,m,ll,i;
    unsigned j;
    *PEDATDIR=*PEDATDIR|0X0300;       //CLK SDA输出低
	*PEDATDIR=*PEDATDIR&0XFFFC;	 
    j=databyte;  //ACK时输出为低 发命令码
    for(k=0;k<0x0010;k++)//8个时钟  发命令
      {
        if((*PEDATDIR&0x0001)==0)             //IOPE0若为0 时钟
        {
	     for(i=0;i<0x0015;i++)
	      i=i;	     
	     m=j&0X0080;//j的最高位
	     j= j<<1;   //j左移一位           
	     m=m>>6;    //m到相应位置
	     ll=*PEDATDIR&0xFFFD;   //IOPE1 输出SI
         *PEDATDIR=ll|m;   //先发数据,再给时钟高电平	    
	     for(i=0;i<0x0015;i++)
	      i=i;
         *PEDATDIR=*PEDATDIR|0X0101;	                 //IOPE0设置为1. 为了保证低电平时间,给一定时间的延时
        }
	    else
	    {
	     for(i=0;i<0x0030;i++)
	     i=i;	    
	     *PEDATDIR=*PEDATDIR&0XFFFE;       //否则IOPE0设置为0 
	    }
     }
}
int Read()
{
   int databyte=0,k,m,i,ll;
   *PEDATDIR=*PEDATDIR&0xFDFE;//IOPE1改为输入 IOPE0输出低
   *PEDATDIR=*PEDATDIR|0x0002;//IOPE1读为高
   for(k=0;k<0x0010;k++)//8个时钟 
     {
        if((*PEDATDIR&0x0001)==0)             //IOPE0若为0 时钟
        {
	     m=*PEDATDIR&0x0002;   //IOPE1 输出
	     m=m>>1;//m到相应位置
	     databyte=databyte<<1;
	     databyte=databyte+m;
	     for(i=0;i<0x0030;i++)
	       k=k;
         *PEDATDIR=*PEDATDIR|0X0101;	                 //IOPE0设置为1. 为了保证低电平时间,给一定时间的延时	   
        }
	    else 
	    {
	     for(i=0;i<0x0030;i++)
	      i=i;
	     *PEDATDIR=*PEDATDIR&0XFFFE;       //否则IOPE0设置为0
        }
     }
}
int Ack()
{
   int m=0,i;
   *PEDATDIR=*PEDATDIR&0xFDFC;//IOPE1改为输入 IOPE0输出低
  // *PEDATDIR=*PEDATDIR|0x0002;//IOPE1读为高
   for(i=0;i<0x0030;i++)
	 i=i;   
   *PEDATDIR=*PEDATDIR|0X0101;	                 //IOPE0设置为1. 为了保证低电平时间,给一定时间的延时	   
    for(i=0;i<0x0015;i++)
      i=i;    
    m=*PEDATDIR&0x0002;   //IOPE1 输入
    m=m>>1;
    for(i=0;i<0x0015;i++)
      i=i;
    return m;
}
void NoAck()
{
   int i;
   *PEDATDIR=*PEDATDIR|0x0300;//
   *PEDATDIR=*PEDATDIR&0xFFFE;//CLK 输出为低
   for(i=0;i<0x0030;i++)
	 i=i; 
   *PEDATDIR=*PEDATDIR|0x0001;// 输出为高
   for(i=0;i<0x0030;i++)
	 i=i;    
}
void End()
{
    //结束
    int i;
    *PEDATDIR=*PEDATDIR|0X0300;       //CLK SDA输出为低
    *PEDATDIR=*PEDATDIR&0xFFFC;   //CLK SDA输出为低
    for(i=0;i<0x0030;i++)
	  i=i;	
	*PEDATDIR=*PEDATDIR|0x0101;   //CLK输出为高
	for(i=0;i<0x0015;i++)
	  i=i;
	*PEDATDIR=*PEDATDIR|0x0202;   //SDA输出为高	
}
int sendROM(int code,unsigned addr,int databyte)
{
   int codedata;
     Start();
     //建立
    do 
    {
      SendByte(code);
    }
    while(Ack()!=1);
    do 
    {
      SendByte(addr);
    }
    while(Ack()!=1);
    codedata=code&0x0001;
   if(codedata==1)//读数据
   { 
    Start();
    do 
    {
      SendByte(code);
    }
    while(Ack()!=1);
    databyte=Read();
    NoAck();
   }
   else if(codedata==0)//写数据
   {
    do 
    {
      SendByte(databyte);
    }
    while(Ack()!=1);
   }
   End();
   if(codedata==1)//读数据
   return databyte;
}
main()
{
   initial();
  for(index=0;index<0x0040;index++);
   for(index=0;index<=214;index++)
    sendROM(0xA1,index,disk[index]);
   for(index=0;index<=214;index++)
    sendROM(0xA0,index,refe[index]);
   for(index=0;index<0x0040;index++);
   //readdata=
   sendROM(0xA8,1,85);
   //sendROM(0xA1,0,readdata);   
}

⌨️ 快捷键说明

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