📄 i2c.c
字号:
#include <pic.h>
#include <pic1687x.h>
#define scl RB4
#define sda RB5
//**********************************//
void delay(unsigned char i);
void initialz(void);
void start(void);
void ack(void);
void no_ack(void);
void stop(void);
void write_data_byte(unsigned char w_data_byte);
void read_data_byte(void);
void write_address(unsigned char address);
void write(void);
void read(void);
//*********************************************************************************************//
//********短延时************//
void delay(unsigned char n)
{
while(--n);
}
//********初始化I/0口及空闲状态*******//
void initialz(void)
{
INTCON=0X00;
TRISC=0X00;
PORTC=0X00;
TRISB4=0;
TRISB5=0;
scl=1;
delay(1)
sda=1;
delay(1)
}
//********开始信号*******//
void start(void)
{
sda=1;
delay(1)
scl=1; //sda与此同时scl都为高状态为空闲//
delay(1)
sda=0; //起始信号//
delay(1)
scl=0; //准备发送及接收信号//
delay(1)
}
//********应答信号,在第九个时钟周期把SDA拉低表示应答信号*****//
void ack(void)
{
unsigned char i;
scl=1;
delay(1)
sda=1;
delay(1)
if((sda==1)&&(i<200))
i++;
scl=0;
delay(1)
}
//********没有应答信号,在第九个时钟周期把SDA拉低表示没有应答信号*****//
void no_ack(void)
{
sda=1; //起始信号//
delay(1)
scl=1;
delay(1)
scl=0;
delay(1)
}
//***停止信号,时钟线保持高电平期间,数扰线电平从低到高的跳变****//
void stop(void)
{
sda=0;
delay(1)
scl=1;
delay(1)
sda=1;
delay(1)
}
//*********写一个数据到I2C上*****************//
void write_data_byte(unsigned char w_data_byte)
{
unsigned char i;
w_data_byte=w_data_byte&0xff;
for(i=8;i!=0;i--)
{
if(w_data_byte&0x80)
{
sda=1; //数据送到总线上//
delay(1)
scl=1; //使数据有效//
delay(1)
scl=0; //准备接收//
delay(1)
}
else
{
sda=0; //数据送到总线上//
delay(1)
scl=1; //使数据有效//
delay(1)
scl=0; //准备接收//
delay(1)
}
w_data_byte<<=1;
}
}
//****************读一个字节数据*************//
void read_data_byte(void)
{
unsigned char i,read_data;
read_data=0x00;
TRISB5=1;
scl=0; //读入数据//
delay(1)
sda=1;
delay(1)
for(i=8;i!=0;i--)
{
scl=1; //置时钟使数据有效//
delay(1)
read_data=(read_data<<1)|sda;
scl=0; //读入数据//
delay(1)
}
PORTC=read_data;
}
//*********写命令地址到I2C上***************//
void write_address(unsigned char address)
{
unsigned char i;
address=address&0xff;
for(i=8;i!=0;i--)
{
if(address&0x80)
{
scl=0; //使数据有效//
delay(1)
sda=1; //数据送到总线上//
scl=1; //准备接收//
delay(1)
}
else
{
scl=0; //使数据有效//
delay(1)
sda=0; //数据送到总线上//
scl=1;//准备接收//
delay(1)
}
address<<=1;
}
scl=0; //使数据有效//
delay(1)
sda=1;
delay(1)
}
void write(void)
{
unsigned char a,b,c;
a=0xa0;
b=0x03;
c=0xb3;
start();
write_address(a);
ack();
write_address(b);
ack();
write_data_byte(c);
ack();
stop();
}
void read(void)
{
unsigned char d,e,f;
d=0xa0;
e=0x03;
f=0xa1;
start();
write_address(d);
ack();
write_address(e);
ack();
start();
write_address(f);
ack();
read_data_byte();
stop();
}
void main(void)
{
while(1)
{
initialz();
write();
read();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -