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

📄 iic.c

📁 pcf8565驱动
💻 C
字号:
/*****************************************************
This program was produced by the
ICC7.14  Professional

Project :SHS07-I
Version : Vt-1.0.01
Date    : 2008-5-29
Author  : 应志强                           
Company : DUCHY                            
Comments: 测试ok
//完成IIC协议层
***************************************************************************************************/
#include "head.h"
#define  IIC_delay	3
#define  IIC_delay_n	2
/*************************************************
*	Name	:	void I2C_start(void)
*	Function:	provid the start flag in I2C_BUS MODE
*************************************************/
void I2C_start(void)
{
	SDA(1);
	SCL(1);
	delay_uS(IIC_delay_n*IIC_delay);
	SDA(0);
	delay_uS(IIC_delay_n*IIC_delay);
	SCL(0);
//	delay_uS(1);
}
/*************************************************
*	Name	:	void I2C_stop(void)
*	Function:	provid the end flag in I2C_BUS MODE
*************************************************/
void I2C_stop(void)
{
       SCL(0);
	SDA(0);
	delay_uS(IIC_delay_n*IIC_delay);
	SCL(1);
	delay_uS(IIC_delay_n*IIC_delay);
	SDA(1);
	//delay_uS(IIC_delay);
}

/*************************************************************************
*	Name	:	bit I2C_send(unsigned  char I2C_data)
*	Function:	Send a 8_bit data,
				return TRUE if receive ACK,otherwise, return FALSE
*************************************************************************/
void  I2C_send(unsigned  char I2C_data)
{
	unsigned  char cnt=8;
	while(cnt--)
	{
	       SCL(0);
              delay_uS(IIC_delay);
		SDA((I2C_data&0x80));
		I2C_data=I2C_data<<1;
              delay_uS(IIC_delay_n*IIC_delay);
              SCL(1);
	       delay_uS(IIC_delay_n*IIC_delay);
	}
       SCL(0);
}
/******************************************************************************
*
*	Name	:	unsigned  char I2C_receive(void)
*	Function:	Extract and return a byte from I2C_BUS,needn't ACK;
*				The appliance should assume ASD is high before use the function
*******************************************************************************
**/
unsigned  char I2C_receive(void)
{
	unsigned  char cnt=8;
	unsigned  char	I2C_data=0;

	SDA(1);
       SDA_Dir(0);
	while(cnt--)
	{
	            I2C_data <<=1;
                   SCL(0);
                   delay_uS(IIC_delay_n*IIC_delay);
                   SCL(1);
                   delay_uS(IIC_delay_n*IIC_delay);
                   I2C_data |=SDA_In();
	}
	SDA_Dir(1);
	SCL(0);
	
	return(I2C_data);
}
/*************************************************
*	Name	:	void I2C_ACK(void)
*	Function:  Send a ACK signal to data_sender
*************************************************/
void I2C_ACK(unsigned char  En)
{
        	SDA(!En) ;
              delay_uS(IIC_delay_n*IIC_delay);
	       SCL(1) ; 
              delay_uS(IIC_delay_n*IIC_delay);
	       SCL(0);
		//delay_uS(1);
}
//--------------------------------------------------------------------------------
//调用方式:unsigned char I2C_ WaitAck(void)
//函数说明:私有函数,I2C用,等待从器件接收方的应答
//--------------------------------------------------------------------------------
unsigned char I2C_WaitAck(void)
{
	unsigned char errtime=254;//因故障接收方无ACK 超时值为255
	
       SDA(1);
       delay_uS(IIC_delay_n*IIC_delay);
	SCL(1);
	delay_uS(IIC_delay_n*IIC_delay);
	SDA_Dir(0) ;
	while(SDA_In()) 
        {
                errtime--; 
                if (!errtime) 
                {
                        I2C_stop();
			   SDA_Dir(1) ;
                        return 0;
                }
        }
       SDA_Dir(1) ;
	SCL(0);
	return 1;
}
/***************************************************************
*	Name	:	void init_I2C(void)
*	Function:	Initialise I2C_BUS
*	Note	: 	It's firstly used before other I2C_function
***************************************************************/
void init_I2C(void)
{
	SCL(0);
       SDA_Dir(1);
	I2C_stop();
}
/*************************************************
*	Name	:	void I2C_Send_Byte(unsigned char   data)
*	Function:  Send a Byte data and  recive ask
*************************************************/
unsigned char   I2C_Send_Byte(unsigned char   data)
{
        I2C_send(data);
        return (I2C_WaitAck());
}
/*************************************************
*	Name	:	void I2C_Send_Byte(unsigned char   data)
*	Function:  Send a Byte data and  recive ask
*************************************************/
unsigned char   I2C_Receive_Byte(void)
{
        unsigned char   get_data;
        get_data=I2C_receive();
        I2C_ACK(1);
        return get_data;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -