⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.c

📁 HT单片机模拟I2C通讯
💻 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 + -