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

📄 iic-24c64.c

📁 全数字高清电视数字调谐器
💻 C
字号:

#include<reg51.h>
#include<intrins.h>



sbit sda=P2^7;
sbit scl=P2^6;

sbit ac0=ACC^0;          /*定义ACC的位,利用ACC操作速度最快*/
sbit ac1=ACC^1;
sbit ac2=ACC^2;
sbit ac3=ACC^3;
sbit ac4=ACC^4;
sbit ac5=ACC^5;
sbit ac6=ACC^6;
sbit ac7=ACC^7;


extern void delay1(unsigned int i);
extern void delay0();


void i2c_start(void);    /*起始*/
void i2c_stop(void);     /*停止*/
bit wait_ack(void);     /*等待24c02应答*/
void send_ack(void);     /*向24c02发送应答*/
void sendnot_ack(void);    /*向24c02发送非应答*/
void i2c_sendbyte(unsigned char ch);/*写发送移位*/
unsigned char i2c_readbyte(void);    /*读移位*/

bit i2c_read(unsigned int address,unsigned char fb[],unsigned char su);
bit i2c_write(unsigned int address,unsigned char fb[],unsigned char su);
bit i2c_writea(unsigned int address,unsigned char fb);
unsigned char i2c_reada(unsigned int address);
void wirte_24c64a(unsigned int address,unsigned char fb);
void wirte_24c64(unsigned int address,unsigned char fb[],unsigned char su);
void read_24c64(unsigned int address,unsigned char fb[],unsigned char su);//多字节读

 void i2c_start(void)
{
  
  scl=1;   
  sda=1; 
  delay0();
  scl=1;
  delay0();
  sda=0;
  delay0();
  scl=0;
  delay0();
  }



void i2c_stop(void)
{
   scl=0;     
   _nop_();
   sda=0;
   delay0();
   scl=1;
   delay0();
   sda=1;
   delay0();  
       scl=0;
       sda=0;
       }


bit wait_ack(void)
{
   unsigned char i;
   scl=0;
   _nop_();
   _nop_();
   sda=1;
   delay0();
   scl=1;
   delay0();
   while(sda)
	         {
				  for(i=0;i<=5;i++)
				             {
								    if(!sda)
									    {
										  scl=0;
 										  return(0);
										  }
								  }
				  
				  return(1);
				  }
       scl=0;
		 return(0);
  }

void send_ack(void)
{
   sda=0;
   delay0();
   scl=1;
   delay0();
   scl=0;
 }


void sendnot_ack(void)
{
    sda=1;
	 delay0();
	 scl=1;
	 delay0();
	 scl=0;
}


void i2c_sendbyte(unsigned char ch)
{
ACC=ch;  			
	    sda=ac7;_nop_();scl=1;delay0();scl=0;delay0();
	    sda=ac6;_nop_();scl=1;delay0();scl=0;delay0();
	    sda=ac5;_nop_();scl=1;delay0();scl=0;delay0();
	    sda=ac4;_nop_();scl=1;delay0();scl=0;delay0();
           sda=ac3;_nop_();scl=1;delay0();scl=0;delay0();
           sda=ac2;_nop_();scl=1;delay0();scl=0;delay0();
	    sda=ac1;_nop_();scl=1;delay0();scl=0;delay0();
	    sda=ac0;_nop_();scl=1;delay0();scl=0;delay0();
}


unsigned char i2c_readbyte(void)
{
       unsigned char sf;
     sda=1;_nop_();_nop_();
scl=1;delay0();ac7=sda;scl=0;delay0();
scl=1;delay0();ac6=sda;scl=0;delay0();
scl=1;delay0();ac5=sda;scl=0;delay0();
scl=1;delay0();ac4=sda;scl=0;delay0();
scl=1;delay0();ac3=sda;scl=0;delay0();
scl=1;delay0();ac2=sda;scl=0;delay0();
scl=1;delay0();ac1=sda;scl=0;delay0();
scl=1;delay0();ac0=sda;scl=0;delay0();
sf=ACC;
return(sf);
}




bit i2c_read(unsigned int address,unsigned char fb[],unsigned char su)//多字节读
     {
      unsigned char i;
      unsigned char dd=0xa0;
      unsigned char dc=0xa1;        
      unsigned char s;
      unsigned char c;
	  s=address;
	  c=address>>8;
	  delay1(2000);
	  
     i2c_start();
	  i2c_sendbyte(dd);
     if(wait_ack())
              {
               i2c_stop();
             return(0);
               }
	  i2c_sendbyte(c);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
         i2c_sendbyte(s);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
          i2c_stop();
          
		delay1(300);
      i2c_start();
		i2c_sendbyte(dc);
      if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
for(i=0;i<=su;i++)
    {
     fb[i]=i2c_readbyte();
            send_ack();
            }             
     fb[i]=i2c_readbyte();
		sendnot_ack();
		i2c_stop();	 
      return(1);
 }



 bit i2c_write(unsigned int address,unsigned char fb[],unsigned char su)//多字节写
 {
      unsigned char i;
      unsigned char dd=0xa0;
      unsigned char s;
      unsigned char c;
	 s=address;
	 c=address>>8;	
      delay1(600);
     i2c_start();
     i2c_sendbyte(dd);	
      if(wait_ack())
            {
               i2c_stop();               
             return(0);
               }     
	  i2c_sendbyte(c);
	  if(wait_ack())
            {
               i2c_stop();              
             return(0);
               }	  
        i2c_sendbyte(s);
	   if(wait_ack())
               {
               i2c_stop();             
               return(0);
               }
             if(su>32)
               {
                for(i=0;i<32;i++)
                   {
                     i2c_sendbyte(fb[i]);	
                      if(wait_ack())
                        {
                         i2c_stop();             
                          return(0);
                         } 
                    }                   
                    i2c_stop(); 
                    delay1(600);
                    address=address+32;
                    s=address;
	             c=address>>8;
                    i2c_start();
                    i2c_sendbyte(dd);	
                       if(wait_ack())
                           {
                            i2c_stop();               
                            return(0);
                            }     
	             i2c_sendbyte(c);
	                 if(wait_ack())
                           {
                            i2c_stop();              
                            return(0);
                            }	  
                   i2c_sendbyte(s);
	                 if(wait_ack())
                            {
                             i2c_stop();             
                             return(0);
                            } 
                  for(i=32;i<su;i++)
                       {
                       i2c_sendbyte(fb[i]);	
                        if(wait_ack())
                             {
                             i2c_stop();             
                             return(0);
                             } 
                         }   
                         i2c_stop();
                       return(1);
                   }
        else {           
                for(i=0;i<su;i++)
                   {
                     i2c_sendbyte(fb[i]);	
                    if(wait_ack())
                        {
                        i2c_stop();             
                        return(0);
                        } 
                     }                    
              i2c_stop();
              return(1);
              }
}

unsigned char i2c_reada(unsigned int address)//单字节读
{
      unsigned char dd=0xa0;
      unsigned char dc=0xa1;        
      unsigned char s;
      unsigned char c;
	  s=address;
	  c=address>>8;
	  delay1(2000);
	  
     i2c_start();
	  i2c_sendbyte(dd);
     if(wait_ack())
              {
               i2c_stop();
             return(0);
               }
	  i2c_sendbyte(c);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
         i2c_sendbyte(s);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
          i2c_stop();
          
		delay1(300);
            i2c_start();
		i2c_sendbyte(dc);
        if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
         s=i2c_readbyte();
		sendnot_ack();
		i2c_stop();	 
      return(s);
}

bit i2c_writea(unsigned int address,unsigned char fb)//单字节写
{
        unsigned char dd=0xa0;
	  unsigned char ae;
	  unsigned char ar;
	 ae=address;
	 ar=address>>8;	
      delay1(600);
     i2c_start();
     i2c_sendbyte(dd);	
      if(wait_ack())
            {
               i2c_stop();               
             return(0);
               }     
	  i2c_sendbyte(ar);
	  if(wait_ack())
            {
               i2c_stop();              
             return(0);
               }	  
        i2c_sendbyte(ae);
	   if(wait_ack())
               {
               i2c_stop();             
               return(0);
               }
        i2c_sendbyte(fb);
	     if(wait_ack())
               {
               i2c_stop();             
               return(0);
               }
           i2c_stop();
           return(1);
}

void wirte_24c64(unsigned int address,unsigned char fb[],unsigned char su)
{
unsigned char i;  
  for(i=0;i<4;i++)
    {
  if(i2c_write(address,fb,su))    
     return;
    }
}

void wirte_24c64a(unsigned int address,unsigned char fb)
{
unsigned char i;  
  for(i=0;i<4;i++)
    {
  if(i2c_writea(address,fb))    
     return;
    }
}


void read_24c64(unsigned int address,unsigned char fb[],unsigned char su)//多字节读
{
unsigned char i;
 for(i=0;i<4;i++)
    {
  if(i2c_read(address,fb,su))    
     return;
    }
}

⌨️ 快捷键说明

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