📄 iic.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 + -