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

📄 iic-tune.c

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

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


#define DEBUG 1
#define uchar unsigned char
#define uint unsigned int


sbit sdat=P2^1;
sbit sclt=P2^2;

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_t(void);    /*起始*/
void i2c_stop_t(void);     /*停止*/
bit wait_ack_t(void);     /*等待24c02应答*/
//void send_ack(void);     /*向24c02发送应答*/
void sendnot_ack_t(void);    /*向24c02发送非应答*/
void i2c_sendbyte_t(uchar ch);/*写发送移位*/
unsigned char i2c_readbyte_t(void);    /*读移位*/


unsigned char i2c_read_a(unsigned char slave,
                                            unsigned char address);//单字节读
 bit i2c_write_a(unsigned char slave,uchar address,
                            unsigned char fb[],unsigned char sun);//多字节写
 bit i2c_write_b(unsigned char slave, uchar address, unsigned char fb);
 void write_b(unsigned char slave, unsigned char address, unsigned char fb);
 void write_a(unsigned char slave,unsigned char address,
                            unsigned char fb[],unsigned char sun);


 void i2c_start_t(void)
{
  
  sclt=1;   
  sdat=1; 
  delay0();
  sclt=1;
  delay0();
  sdat=0;
  delay0();
  sclt=0;
  delay0();
  }



void i2c_stop_t(void)
{
   sclt=0;     
   _nop_();
   sdat=0;
   delay0();
   sclt=1;
   delay0();
   sdat=1;
   delay0();  
   //    sclt=0;
   //    sdat=0;
       }


bit wait_ack_t(void)
{
   uchar i;
   sclt=0;
   _nop_();
   _nop_();
   sdat=1;
   delay0();
   sclt=1;
   delay0();
   while(sdat)
	         {
				  for(i=0;i<=5;i++)
				             {
								    if(!sdat)
									    {
										  sclt=0;
 										  return(0);
										  }
								  }
				  
				  return(1);
				  }
       sclt=0;
		 return(0);
  }
/*
void send_ack(void)
{
   sdat=0;
   delay0();
   sclt=1;
   delay0();
   sclt=0;
 }
*/

void sendnot_ack_t(void)
{
       sdat=1;
       delay0();
       sclt=1;
       delay0();
       sclt=0;
}


void i2c_sendbyte_t(uchar ch)
{
ACC=ch;  
           sdat=ac7;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac6;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac5;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac4;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac3;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac2;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac1;_nop_();sclt=1;delay0();sclt=0;delay0();
           sdat=ac0;_nop_();sclt=1;delay0();sclt=0;delay0();
}


unsigned char i2c_readbyte_t(void)
{
      uchar sf;
     sdat=1;_nop_();_nop_();
sclt=1;delay0();ac7=sdat;sclt=0;delay0();
sclt=1;delay0();ac6=sdat;sclt=0;delay0();
sclt=1;delay0();ac5=sdat;sclt=0;delay0();
sclt=1;delay0();ac4=sdat;sclt=0;delay0();
sclt=1;delay0();ac3=sdat;sclt=0;delay0();
sclt=1;delay0();ac2=sdat;sclt=0;delay0();
sclt=1;delay0();ac1=sdat;sclt=0;delay0();
sclt=1;delay0();ac0=sdat;sclt=0;delay0();
sf=ACC;
return(sf);
}


unsigned char i2c_read_a(unsigned char slave,
                                            unsigned char address)//单字节读
{
unsigned char dd=slave&0xfe;//写
unsigned char dc=slave|0x01;//读
unsigned char ae;
 delay1(2000);
  i2c_start_t();
     i2c_sendbyte_t(dd);
     if(wait_ack_t())
              {
               i2c_stop_t();
             return(0);
               }
          i2c_sendbyte_t(address);
	  if(wait_ack_t())
            {
               i2c_stop_t();
             return(0);
               }
          i2c_stop_t();
          delay1(300);
          
      i2c_start_t();
         i2c_sendbyte_t(dc);
      if(wait_ack_t())
            {
               i2c_stop_t();
             return(0);
               }
      ae=i2c_readbyte_t();
             sendnot_ack_t();
             i2c_stop_t();
             return(ae);
}



 bit i2c_write_a(unsigned char slave,uchar address,
                            unsigned char fb[],unsigned char sun)//多字节写
 {
   
      uchar dd;//写
        uchar i;
        
     dd=slave&0xfe;//写
      delay1(600);
     i2c_start_t();
    i2c_sendbyte_t(dd);	
      if(wait_ack_t())
            {
               i2c_stop_t();
                #if(DEBUG)
              //    printf("写多字节器件地址off=0x%2x\n",slave);               
                     #endif
             return(0);
               }     
        i2c_sendbyte_t(address);
	  if(wait_ack_t())
            {
               i2c_stop_t();              
             return(0);
               }	  
               
      for(i=0;i<sun;i++)
             {
               i2c_sendbyte_t(fb[i]);
	         if(wait_ack_t())
                   {
                    i2c_stop_t();  
                     #if(DEBUG)
                //  printf("多字节写a,器件地址=0x%2x\n",slave);
               //   printf("多字节写b,address=0x%2x\n",i);
                     #endif
                    return(0);
                   }	
                 delay1(200);  
               }
               i2c_stop_t();    
             return(1);
}

bit i2c_write_b(unsigned char slave, uchar address, unsigned char fb)
{                    //单字节写
  uchar dd;//写     
        
     dd=slave&0xfe;//写
      delay1(600);
     i2c_start_t();
    i2c_sendbyte_t(dd);	
      if(wait_ack_t())
            {
               i2c_stop_t();               
             return(0);
               }     
        i2c_sendbyte_t(address);
	  if(wait_ack_t())
            {
               i2c_stop_t();              
             return(0);
               }	  
      i2c_sendbyte_t(fb);
	  if(wait_ack_t())
             {
               i2c_stop_t();             
             return(0);
               }	
               i2c_stop_t();          
            return(1);   
}

void write_a(unsigned char slave,unsigned char address,
                            unsigned char fb[],unsigned char sun)
 {
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_write_a(slave,address,fb,sun))
     return;
}
  #if(DEBUG)
   printf("多字节写入调谐器失败,器件地址=0x%2x,address=0x%2x\n",slave,address);
  #endif
 }
void write_b(unsigned char slave, unsigned char address, unsigned char fb)
{
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_write_b(slave,address,fb))
    {
     #if(DEBUG)     
 //  printf("单字节写入调谐器成功,器件地址=0x%2x,address=0x%2x,fb=0x%2x\n",slave,address,fb);
  #endif
     return;
     }
}
  #if(DEBUG)
  printf("单字节写入调谐器失败,器件地址=0x%2x,address=0x%2x,fb=0x%2x\n",slave,address,fb);
  #endif
}


⌨️ 快捷键说明

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