I2C通信
i2c.h
c
#ifndef __I2C_H__
#define __I2C_H__
void i2c_start();
void i2c_stop();
void i2c_send(unsigned char byte);
unsigned char i2c_receive();
void i2c_send_ack(bit status);
bit i2c_receive_ack();
#endif
i2c.c
c
#include "i2c.h"
#include <STC89C5xRC.H>
// 需要开漏输出模式
sbit i2c_scl = P0^0;
sbit i2c_sda = P0^1;
void i2c_start() {
i2c_sda = 1;
i2c_scl = 1;
i2c_sda = 0;
i2c_scl = 0;
}
void i2c_stop() {
i2c_sda = 0;
i2c_scl = 1;
i2c_sda = 1;
}
void i2c_send(unsigned char byte) {
unsigned char i = 0;
for(i = 0; i < 8; ++i) {
i2c_sda = byte & (0x80 >> i);
i2c_scl = 1;
i2c_scl = 0;
}
}
unsigned char i2c_receive() {
unsigned char byte = 0x00;
unsigned char i = 0;
i2c_sda = 1;
for(i = 0; i < 8; ++i) {
i2c_scl = 1;
if(i2c_sda) {
byte |= (0x80 >> i);
}
i2c_scl = 0;
}
return byte;
}
void i2c_send_ack(bit status) {
i2c_sda = status;
i2c_scl = 1;
i2c_scl = 0;
}
bit i2c_receive_ack() {
bit ack;
i2c_sda = 1;
i2c_scl = 1;
ack = i2c_sda;
i2c_scl = 0;
return ack;
}