📄 func.c
字号:
/********************************************
* 文件名:func.c *
* 实现功能:子程序文件,包括: *
* 作者:xxlxws *
* 日期:2006-08-06 *
* 版本号:1.0 *
********************************************/
#include "ht46r47.h"
#include "main.h"
#include "init.h"
#include "func.h"
#include "inter.h"
#define DLY_TIME 10 /*延时时间,10ms*/
/********************************************
* 函数名:I2C_Start *
* 入口参数:无 *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能: 启动I2C *
********************************************/
void I2C_Start(void)
{
SCL_OUT(); /*设置SCL和SDA为输出端口*/
SDA_OUT();
I2C_SDA = 1;
I2C_SCL = 1;
_delay(DLY_TIME); /*延时*/
I2C_SDA = 0;
_delay(DLY_TIME);
I2C_SCL = 0;
_delay(DLY_TIME);
return;
}
/********************************************
* 函数名:I2C_Sop *
* 入口参数:无 *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能: 停止I2C *
********************************************/
void I2C_Stop(void)
{
SCL_OUT(); /*设置SCL和SDA为输出端口*/
SDA_OUT();
I2C_SDA = 0;
I2C_SCL = 1;
_delay(DLY_TIME); /*延时*/
I2C_SDA = 1;
_delay(DLY_TIME);
I2C_SCL = 0;
_delay(DLY_TIME); /*延时50ms*/
return;
}
/********************************************
* 函数名:I2C_Write_Bit *
* 入口参数:写入位0/1 *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能: I2C写一位 *
********************************************/
void I2C_Write_Bit(bit dat)
{
SCL_OUT(); /*设置SCL和SDA为输出端口*/
SDA_OUT();
I2C_SDA = dat;
I2C_SCL = 1;
_delay(DLY_TIME);
I2C_SCL = 0;
_delay(DLY_TIME);
return;
}
/********************************************
* 函数名:I2C_Write_Byte *
* 入口参数:写入位0/1 *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能: I2C写一字节,高位在前 *
********************************************/
void I2C_Write_Byte(uint8 dat)
{
uint8 i;
bit tmp;
for(i = 0; i<8;i++) /*发送8位数据*/
{
if((dat&0x80) == 0x80)
{
tmp = 1;
}
else if((dat&0x80) == 0x00)
{
tmp = 0;
}
I2C_Write_Bit(tmp);
dat <<= 1;
}
return;
}
/********************************************
* 函数名:I2C_REad_Bit *
* 入口参数:无 *
* 出口参数:返回收到位的值 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能: I2C接收一位 *
********************************************/
uint8 I2C_Read_Bit(void)
{
bit dat;
SCL_OUT(); /*设置SCL和SDA为输出端口*/
SDA_OUT();
I2C_SDA = 1;
I2C_SCL = 1;
_delay(DLY_TIME);
SDA_IN(); /*设置SDA为输入*/
dat = I2C_SDA;
_delay(DLY_TIME);
I2C_SCL = 0;
return dat;
}
/********************************************
* 函数名:I2C_Read_Byte *
* 入口参数:无 *
* 出口参数:返回接收到的一个字节 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能: I2C读一字节,高位在前 *
********************************************/
uint8 I2C_Read_Byte(void)
{
uint8 i,data;
bit tmp;
data = 0;
for(i = 0; i<8;i++) /*发送8位数据*/
{
data <<= 1;
tmp = I2C_Read_Bit();
if(tmp == 0)
{
data &=0xfe;
}
else if(tmp ==1)
{
data |= 0x01;
}
}
return data;
}
/********************************************
* 函数名:I2C_Ack *
* 入口参数:无 *
* 出口参数:返回应答位值 *
* 作者:xxlxws *
* 日期:2006-08-14 *
* 函数功能:应答位检测,正确返回'1',错误返回'0' *
********************************************/
uint8 I2C_Ack(void)
{
bit dat;
SCL_OUT(); /*设置端口为输出*/
SDA_OUT();
I2C_SCL = 1;
I2C_SDA = 1;
SDA_IN();
_delay(DLY_TIME);
dat = I2C_SDA;
I2C_SCL = 0;
_delay(DLY_TIME);
return dat;
}
/********************************************
* 函数名:I2C_Write_N *
* 入口参数:写入数据个数:N *
* 写入起始地址:addr *
* 写入数据:data *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-15 *
* 函数功能:在指定地址写入数据 *
********************************************/
void I2C_Write_N(uint8 N,uint8 addr,uint8 data[])
{
uint8 i;
bit ack;
for(i=0;i<N;i++)
{
I2C_Start();
I2C_Write_Byte(0xa0); /*写控制字*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
I2C_Write_Byte(addr+i); /*写地址*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
I2C_Write_Byte(data[i]); /*写数据*/
ack = I2C_Ack(); /*ACK*/
I2C_Stop();
}
else
{
i -= 1; /*应答错误,重新写如数据*/
}
}
else
{
i -= 1; /*应答错误,重新写如数据*/
}
}
return;
}
/********************************************
* 函数名:I2C_Read_N *
* 入口参数:读如数据个数:N *
读入起始地址:addr *
* 读入数据存放单元:data *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-15 *
* 函数功能:读入指定地址的N个数据 *
********************************************/
void I2C_Read_N(uint8 N,uint8 addr,uint8 data[])
{
uint8 i;
bit ack;
for(i=0; i<N; i++)
{
I2C_Start();
I2C_Write_Byte(0xa0); /*写控制字*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
I2C_Write_Byte(addr+i); /*写地址*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
I2C_Start();
I2C_Write_Byte(0xa1); /*写控制字读取当前地址数据*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
data[i] = I2C_Read_Byte();
I2C_Stop();
}
else
{
i -= 1; /*应答错误重新读入*/
}
}
else
{
i -= 1; /*应答错误重新读入*/
}
}
} /*end of for loop*/
return;
}
/********************************************
* 函数名:I2C_Write_One *
* 入口参数:写入起始地址:addr *
* 写入数据:data *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-15 *
* 函数功能:在指定地址写入一个数据 *
********************************************/
void I2C_Write_One(uint8 addr,uint8 data)
{
bit ack;
I2C_Start();
I2C_Write_Byte(0xa0); /*写控制字*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
I2C_Write_Byte(addr); /*写地址*/
ack = I2C_Ack(); /*ACK*/
if(!ack)
{
I2C_Write_Byte(data); /*写数据*/
ack = I2C_Ack(); /*ACK*/
I2C_Stop();
}
}
I2C_Stop();
return;
}
/********************************************
* 函数名:I2C_Write_Page *
* 入口参数:写入页地址:addr *
* 写入数据:data *
* 出口参数:无 *
* 作者:xxlxws *
* 日期:2006-08-15 *
* 函数功能:在指定地址写入一个数据 *
********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -