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

📄 fm3130.c

📁 用单片机的I/O口模拟I2C协议 I2C用IO模拟程序网上范例最多的就是51的程序了,这些范例的正确性无需怀疑.但是如果直接以它为蓝本将它"AVR化",一不留神,就会有点问题了. 这要从I2C的
💻 C
字号:
#define ENABLE_BIT_DEFINITIONS
#include <inavr.h>
#include <ioavr.h>
#include <stdio.h>
#include <iom16.h>

typedef unsigned char  uint8;
typedef unsigned int uint16;

#define SCL_HIGH {DDRC_Bit0=0;PORTC_Bit0=0;}
#define SCL_LOW  {DDRC_Bit0=1;PORTC_Bit0=0;}
//#define SCL_IN DDRC&=0xFE;
//#define SCL_OUT DDRC|=0x01;

#define SDA_HIGH {DDRC_Bit1=0;PORTC_Bit1=0;}
#define SDA_LOW  {DDRC_Bit1=1;PORTC_Bit1=0;}
#define SDA_IN DDRC&=0xFD;
#define DELAYTIME 10
//#define SDA_OUT DDRC|=0x02;

uint8 DATAR01,DATAR11,DATAR21,DATAR31,DATAR41,flag = 0;
void delay (unsigned int TT) 
{ 
for (;TT!=0;TT--); 
} 
void init(void)
{
  SCL_HIGH;
  delay (DELAYTIME);
  SDA_HIGH;
  delay (DELAYTIME);
}
void IIC_START (void) 
{ 
  //SDA_OUT; 
 // SCL_OUT;
  SCL_HIGH;
  SDA_HIGH;  
  delay (DELAYTIME); 
  SDA_LOW; 
  delay (DELAYTIME); 
 
}  

void IIC_STOP (void) 
{ 
  //SDA_OUT;
  //SCL_OUT;
  SCL_LOW; 
  delay (DELAYTIME);
  SDA_LOW; 
  delay (DELAYTIME); 
  SCL_HIGH; 
  delay (DELAYTIME); 
  SDA_HIGH; 
  delay (DELAYTIME); 
} 

void IIC_ACK (void) 
{ 
  //SDA_OUT;
  //SCL_OUT;
  SCL_LOW;
  delay (DELAYTIME);
  SDA_LOW; 
  delay (DELAYTIME); 
  SCL_HIGH; 
  delay (DELAYTIME); 
  SCL_LOW; 
  delay (DELAYTIME); 
} 

uint8 IIC_TX_DATA (uint8 DATA) 
{
  uint8 Rn=8,RR=0x80; 
//SDA_OUT;
//SCL_OUT; 
for (;Rn!=0;Rn--) 
{ 
SCL_LOW;
delay (DELAYTIME);
if ((DATA&RR)!=0) 
{
SDA_HIGH;
}
else
{
SDA_LOW;
}
delay (DELAYTIME); 
SCL_HIGH; 
delay (DELAYTIME);  
RR>>=1; 
} 
SCL_LOW; 
delay (DELAYTIME);
SDA_HIGH; 
delay (DELAYTIME); 
SCL_HIGH; 
delay (DELAYTIME);
//SDA_IN;
if(!(PINC&0x02))
flag = 1;//收到应答
SCL_LOW; 
delay (DELAYTIME); 
return flag;
} 

uint8 IIC_RX_DATA (void) 
{uint16 Rn=8,DATA=0,RR=0x80; 
//SDA_IN; // 端口为输入
//SCL_OUT;
//delay (DELAYTIME);
 SCL_LOW; 
 SDA_HIGH;
for (;Rn!=0;Rn--) 
{
SCL_LOW;
delay (DELAYTIME); 
SCL_HIGH; 
delay (DELAYTIME); 

if (!(PINC&0x02==0)) 
DATA|=RR; //1
else 
DATA&=~RR;//0
RR>>=1; 
 
delay (DELAYTIME); 
} 
IIC_ACK();
return DATA; 
} 

void WAITBUSY(void)
{
  uint8 i;
  while(1)
  {
  IIC_START();
  i = IIC_TX_DATA(0x00);
  IIC_STOP();
  if(i == 1)
    break;
  }
  return;
}

void WRITE_BITE(uint16 ADDH,uint16 ADDL,uint8 DATA_W,uint16 BYTENUM)
{
  IIC_START();
  IIC_TX_DATA(0xA0);
  if(1 == flag)
  {
    flag = 0;
    IIC_TX_DATA(ADDH);//高地址位
    if(1 == flag)
    {
      flag = 0;
      IIC_TX_DATA(ADDL);//低地址位
      if(1 == flag)
      {
       flag = 0;
       for(uint16 i=0;i<BYTENUM;i++)
      {
         IIC_TX_DATA(DATA_W);//数据
      }
      }
            if(1 == flag)
            {
              flag = 0; 
              IIC_STOP();
              delay(0x6FFF);
            }
       
       }
    }
  
  }

uint8 READ_BETY(uint16 ADDH,uint16 ADDL,uint16 BYTENUM)
{
  uint8 DATA_R;
  IIC_START();
  IIC_TX_DATA(0xA0);
  delay(DELAYTIME);
  if(1 == flag)
  {
    flag = 0;
    IIC_TX_DATA(ADDH);//高地址位
    delay(DELAYTIME);
    if(1 == flag)
    {
      flag = 0; 
      IIC_TX_DATA(ADDL);//低地址位
      delay(DELAYTIME);
    }
      delay(DELAYTIME);
      IIC_START();
      IIC_TX_DATA(0xA1);
      if(1 == flag)
      {
        flag = 0;
      for(uint16 i=0;i<BYTENUM;i++)
      {
      DATA_R = IIC_RX_DATA();
      }
      }
  }
  return DATA_R;
}
  

void main(void)
{
  init();
  WRITE_BITE(0x00,0xEF,0xBF,1);
  READ_BETY(0x00,0xEF,1);
  READ_BETY(0x00,0xF0,1);
  READ_BETY(0x00,0xEE,1);
}

⌨️ 快捷键说明

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