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

📄 iic.c

📁 用AVR单片机和RTL8019实现TCP/IP协议.支持ARP,PING,UDP,TCP,HTML网页显示等功能.
💻 C
字号:
//**********************************
//*版本: Test 1.0
//*作者: XUGUOHONG
//*E-MAIL: KK20Y@YAHOO.COM.CN
//*WEBSITE:microdesign.000webhost.com
//**********************************

#include <iom162v.h>

#define IIC_DDR   DDRE
#define IIC_PORT  PORTE
#define IIC_PIN   PINE
#define SDA       PE2
#define SCL       PE0

//**********************************
//*       延时5US
//**********************************
void delay_5us(void)
{
 unsigned char temp;        
 for(temp=60;temp>0;temp--) //延时约5ms
 {
  asm("nop");
 }
}

//**********************************
//*       IIC初始化
//**********************************
void siic_init(void)
{
 IIC_DDR|=(1<<SDA)|(1<<SCL);    //SDA,SCL设置为输出
 IIC_PORT|=(1<<SDA)|(1<<SCL);   //SDA,SCL设置为输出高电平
}

//**********************************
//*       IIC开始
//**********************************
void siic_start(void)
{
 IIC_PORT|=(1<<SDA);       //SDA=1
 IIC_PORT|=(1<<SCL);       //SCL=1
 delay_5us();
 IIC_PORT&=~(1<<SDA);      //SDA=0
 delay_5us();
 IIC_PORT&=~(1<<SCL);      //SCL=0
}

//**********************************
//*       IIC停止
//**********************************
void siic_stop(void)
{
 IIC_PORT&=~(1<<SDA);      //SDA=0
 IIC_PORT|=(1<<SCL);       //SCL=1
 delay_5us();
 IIC_PORT|=(1<<SDA);       //SDA=1
 delay_5us();
 IIC_PORT&=~(1<<SCL);      //SCL=0
 delay_5us();
}
//**********************************
//*       IIC写"1"S
//**********************************
void siic_wone(void)
{
 IIC_PORT|=(1<<SDA);       //SDA=1
 IIC_PORT|=(1<<SCL);       //SCL=1
 delay_5us();
 IIC_PORT&=~(1<<SCL);      //SCL=0
 IIC_PORT&=~(1<<SDA);      //SDA=0
}
//**********************************
//*      IIC写"0"
//**********************************
void siic_wzero(void)
{
 IIC_PORT&=~(1<<SDA);      //SDA=0
 IIC_PORT|=(1<<SCL);       //SCL=1
 delay_5us();
 IIC_PORT&=~(1<<SCL);      //SCL=0
 IIC_PORT|=(1<<SDA);       //SDA=1
}
//**********************************
//*       IIC检测应答位
//**********************************
void siic_test(void)
{
 IIC_DDR&=~(1<<SDA);       //SDA设置为输入
 IIC_PORT|=(1<<SCL);       //SCL=1,使数据有效
while(IIC_PIN&(1<<SDA))   //如检测应答为"1"则出错警告
 {
  //break;
 }
 IIC_PORT&=~(1<<SCL);      //SCL=0
 IIC_DDR|=(1<<SDA);        //SDA设置为输出
 delay_5us();
}
//**********************************
//*       IIC写一字节
//**********************************

void siic_wbyte(unsigned char data)
{
 unsigned char temp;
 for(temp=8;temp>0;temp--)   //用temp>=0检测回出错,由于0-1=ff形成死循环
 {
  if(data&(1<<(temp-1)))     //从MSB到LSB判断每位的值
    siic_wone();
  else
    siic_wzero();
 }
 IIC_PORT&=~(1<<SCL);      //SCL=0
}
//**********************************
//*       IIC读一字节
//**********************************
unsigned char siic_rbyte(void)
{
 unsigned char data;
 unsigned char temp;
 IIC_DDR&=~(1<<SDA);         //SDA设置为输入
 for(temp=8;temp>0;temp--)
 {
  IIC_PORT|=(1<<SCL);       //SCL=1
  asm("nop");
  if((1<<SDA)&IIC_PIN)      //从MSB到LSB判断每位的值
     data|=1<<(temp-1);
  else
     data&=~(1<<(temp-1));
  IIC_PORT&=~(1<<SCL);      //SCL=0
  asm("nop");
 }
 IIC_DDR|=(1<<SDA);        //SDA设置为输出
 IIC_PORT&=~(1<<SCL);      //SCL=0
 return data;
}

⌨️ 快捷键说明

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