📄 iic.c
字号:
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define IIC_READ 0XA1 //定义读指令
#define IIC_WRITE 0XA0 //定义写指令
#define NOP _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
//==============================
sbit SDA=P0^6;
sbit SCL=P0^7;
//===============================
//define a bit_operation byte to use in shift operation
//use this mode can achieve high operation speed
uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
//========================================
bit IFACK; //record the SDA state to confirn if ACK has happened
bit NO_ACK; //no ack flag
bit BUS_FAULT; //bus fault flag
//========================================
//FUNCTION:ROUTES TO PROVIDE A START SIGNAL
void start(void)
{
SCL=0;SDA=1; NOP;SCL=1;SDA=0;NOP;SCL=0;
}
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
void stop(void)
{
SCL=0;SDA=0;NOP;SCL=1;SDA=1;NOP;SCL=0;
}
//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL
void ack(void)
{
SCL=0;SDA=0;NOP;SCL=1;NOP;SCL=0;
}
//=====================================
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
// OR TO PROVIDE A NO_ACK SIGNAL
//type=1等待应答信号
//type=0 产生无应答信号
void nack(uchar type)
{
SCL=0;SDA=1;NOP;SCL=1;IFACK=SDA; NOP;SCL=0;
if(type)
{
if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
{
NO_ACK=1;//用户可以加入自己的异常处理程序
//while(1);
}
else NO_ACK=0;
}
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
uchar inbyte(void)
{//从IIC器件中读出数据
SDA=1;
SCL=1;a7=SDA;NOP;SCL=0;
SCL=1;a6=SDA;NOP;SCL=0;
SCL=1;a5=SDA;NOP;SCL=0;
SCL=1;a4=SDA;NOP;SCL=0;
SCL=1;a3=SDA;NOP;SCL=0;
SCL=1;a2=SDA;NOP;SCL=0;
SCL=1;a1=SDA;NOP;SCL=0;
SCL=1;a0=SDA;NOP;SCL=0;
return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
void outbyte(uchar outdata)
{//将数据写放IIC器件
bbyte=outdata;
SDA=a7;SCL=1;NOP;SCL=0;
SDA=a6;SCL=1;NOP;SCL=0;
SDA=a5;SCL=1;NOP;SCL=0;
SDA=a4;SCL=1;NOP;SCL=0;
SDA=a3;SCL=1;NOP;SCL=0;
SDA=a2;SCL=1;NOP;SCL=0;
SDA=a1;SCL=1;NOP;SCL=0;
SDA=a0;SCL=1;NOP;SCL=0;
}
/**********************写函数****************************************
** 函数名称: 写数据
** 入口参数:add为读起始地址,ptr数据保存指针,writelen为写出数据长度
********************************************************************/
void writebyteseq(unsigned char page_addr, unsigned char byte_address,uchar *ptr,uchar writelen)
{
uchar temph;
uchar i;
unsigned char x;
x = (page_addr<<1);
temph = (x | IIC_WRITE);
start();
// outbyte(IIC_WRITE);
// nack(1);
outbyte(temph);
nack(1);
outbyte(byte_address);
nack(1);
for(i=0;i<writelen;i++)
{
outbyte(*(ptr+i));
nack(1);
}
stop();
}
/**********************读函数***************************************
** 函数名称: 连续读数据
** 入口参数:add为读起始地址,ptr数据保存指针,readlen为读出数据长度
********************************************************************/
void readbyteseq(unsigned char page_addr, unsigned char byte_address,uchar *ptr,uchar readlen)
{
uchar temph;
uchar i;
unsigned char x;
x = (page_addr<<1); // 2 address bytes.
temph = (x | IIC_WRITE);
start();
// outbyte(IIC_WRITE);
// nack(1);
outbyte(temph);
nack(1);
outbyte(byte_address);
nack(1);
start();
outbyte(IIC_READ);
nack(1);
for(i=0;i<readlen-1;i++)
{
*(ptr+i)=inbyte();
ack();
}
*(ptr+readlen-1)=inbyte();
nack(0);
stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -