📄 i2c.c
字号:
#include <reg51.h>
#include "i2ch.h"
#include "typedef.h"
void Delay10us(void)
{
}
void I2CStart(void)
{
SetBit(I2CPort,SDA);
Delay10us();
SetBit(I2CPort,SCL);
Delay10us();
ClrBit(I2CPort,SDA);
Delay10us();
ClrBit(I2CPort,SCL);
}
void I2CStop(void)
{
ClrBit(I2CPort,SDA);
Delay10us();
SetBit(I2CPort,SCL);
Delay10us();
SetBit(I2CPort,SDA);
}
void I2CAck(unsigned char ack)
{
unsigned char ch;
ClrBit(I2CPort,SDA);
if(ack) SetBit(I2CPort,SDA);
Delay10us();
SetBit(I2CPort,SCL);
Delay10us();
ch=I2CPort;
ch &=(1<<SDA);
ClrBit(I2CPort,SCL);
ClrBit(I2CPort,SCL);
}
void I2CTx(unsigned char ch)
{
unsigned char i;
for(i=0;i<8;i++){
if(ch&0x80) SetBit(I2CPort,SDA);
else ClrBit(I2CPort,SDA);
SetBit(I2CPort,SCL);
Delay10us();
ClrBit(I2CPort,SCL);
ch <<=1;
}
}
unsigned char I2CRx(void)
{
unsigned char i,ch,uc0;
SetBit(I2CPort,SDA);
i=0;
while(1){
SetBit(I2CPort,SCL);
Delay10us();
uc0=I2CPort;
uc0 &=(1<<SDA);
if(uc0) SetBit(ch,0);
else ClrBit(ch,0);
ClrBit(I2CPort,SCL);
i++;
if(i>7) break;
ch <<=1;
}
return(ch);
}
unsigned char I2CRead(unsigned int Addr)
{
unsigned char ch;
I2CSetReadAddr(Addr);
I2CAck(0);
ch=I2CRx();
I2CAck(1);
I2CStop();
return(ch);
}
void I2CSetReadAddr(unsigned int Addr)
{
I2CSetWriteAddr(Addr);
I2CStart();
I2CTx(0xa1);
}
void I2CSetWriteAddr(unsigned char Addr)
{
I2CStart();
I2CTx(0xa0);
I2CAck(0);
I2CTx(Addr/256);
I2CAck(0);
I2CTx(Addr%256);
I2CAck(0);
}
/*
说明:
1: 连续读取起始地址为ADDR的内容.
I2CSetReadaddr(ADDR);
while(1){
I2CAck(0);
tmp=I2CRx();
}
2: 连续写入起始地址为ADDR的内容.
I2CSetReadaddr(ADDR);
while(1){
I2CAck(0);
I2CTx(*ptr++);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -