📄 2402.c
字号:
/*========对2402的读写========*/
/*调用时需要参数DELY_TIME*/
#include <2402.h>
/*
函数:delayus(unsigned int t)
功能:毫秒级的时间延时函数
参数:t:延时的时间
*/
void delayus(unsigned int data t)
{
while(t!=0)
t--;
}
/*
函数:I2C_Start(void)
功能:启动I2C总线
参数:
说明:当SCL为高电平时使SDA产生一个负跳变
*/
void I2C_Start(void)
{
SDA=1;
SCL=1;
delayus(DELAY_TIME);
SDA=0;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函数:I2C_Stop(void)
功能:终止I2C总线
参数:
说明:当SCL为高电平时使SDA产生一个正跳变
*/
void I2C_Stop(void)
{
SDA=0;
SCL=1;
delayus(DELAY_TIME);
SDA=1;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函数:SEND_0(void)
功能:发送0
参数:
说明: 在SCL为高电平时使SDA信号为低
*/
void SEND_0(void)
{
SDA=0;
SCL=1;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函数:SEND_1(void)
功能:发送1
参数:
说明:在SCL为高电平时使SDA信号为高
*/
void SEND_1(void)
{
SDA=1;
SCL=1;
delayus(DELAY_TIME);
SCL=0;
delayus(DELAY_TIME);
}
/*
函数:Check_Acknowledge(void)
功能:发送完一个字节后检验设备的应答信号
参数:
说明:
*/
bit Check_Acknowledge(void)
{
char data F0;
SDA=1;
SCL=1;
delayus(DELAY_TIME/2);
F0=SDA;
delayus(DELAY_TIME/2);
SCL=0;
delayus(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
/*
函数:WriteI2CByte(char b)
功能:向I2C总线写一个字节
参数:b:写入的字节
说明:
*/
void WriteI2CByte(char b)
{
char data i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
/*
函数:ReadI2CByte(void)
功能:从I2C总线读一个字节
参数:
说明:
*/
char ReadI2CByte(void)
{
char data b=0,i,F0;
for(i=0;i<8;i++)
{
SDA=1; /*释放总线*/
SCL=1; /*接受数据*/
delayus(10);
F0=SDA;
delayus(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/*
函数:Write_One_Byte(char addr,char thedata)
功能:向2402写一个字节
参数:addr: 数据存储的地址
thedata:所要存储的数据
说明:
*/
void Write_One_Byte(char addr,char thedata)
{
bit acktemp=1;
I2C_Start(); /*总线开始*/
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
WriteI2CByte(addr); /*向address首地址开始写数据*/
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
WriteI2CByte(thedata); /*把thedata写进去*/
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
I2C_Stop(); /*总线停止*/
}
/*
函数:Write_A_Page(char *buffer,char m,char addr)
功能:向2402写一个数组
参数:*buffer:所要存储的数组
m:存储的字节数
addr: 数据存储的首地址
说明:
*/
void Write_A_Page(char *buffer,char m,char addr)
{
bit acktemp=1;
int i;
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
for(i=0;i<m;i++)
{
WriteI2CByte(buffer[i]);
if(!Check_Acknowledge())
{
I2C_Stop();
}
}
I2C_Stop();
}
/*
函数:Read_One_Byte(char addr)
功能:从2402读一个子节
参数:addr: 数据存储的地址
说明:
*/
char Read_One_Byte(char addr)
{
bit acktemp=1;
char mydata;
I2C_Start(); /*启动I2C总线*/
WriteI2CByte(0xa0); /*向I2C总线写一个字节*/
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
WriteI2CByte(addr); /*向I2C总线写一个字节,addr 是地址*/
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
return mydata;
I2C_Stop(); /*停止I2C总线*/
}
/*
函数:Read_N_Bytes(char *buffer,char n,char addr)
功能:从2402顺序读n个字节到指定的数组
参数:*buffer:读取的字节数据所要存储的数组
n:读取的字节数
addr: 数据所存储的首地址
说明:
*/
void Read_N_Bytes(char *buffer,char n,char addr)
{
bit acktemp=1;
int data i=0;
I2C_Start(); /*启动I2C总线*/
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
for(i=0;i<n;i++)
{
buffer[i]=ReadI2CByte();
if(i!=n-1)
SEND_0(); /*发送应答*/
else
SEND_1(); /*发送非应答*/
}
I2C_Stop(); /*停止I2C总线*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -