/*使用11.0592MHZ晶体
因此每个机器周期是1.085uS
5个机器周期约为5.4us*/
#include "Branch.h"
/* 全局符号定义 */
#define HIGH 1
#define LOW 0
#define function
#define end_if
#define end_for
#define byte unsigned char
extern unsigned int Count;
extern union datai Addr;
/****************************************************************************
* 函数原型: void function delay(void);
* 功 能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时
* 指令。
****************************************************************************/
void function delay( void )
{
_nop_();
_nop_();
_nop_();
}
/****************************************************************************
* 函数原型: void function I_start(void);
* 功 能: 提供I2C总线工作时序中的起始位。
****************************************************************************/
void function I_start( void )
{
SDA = HIGH ;
SCL = HIGH ;
delay() ;
SDA = LOW ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函数原型: void function I_stop(void);
* 功 能: 提供I2C总线工作时序中的停止位。
****************************************************************************/
void function I_stop( void )
{
SDA = LOW ;
delay() ;
SCL = HIGH ;
delay() ;
SDA = HIGH ;
delay() ;
}
/****************************************************************************
* 函数原型: void function I_init(void);
* 功 能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
* 其它函数。
****************************************************************************/
void I_init( void )
{
SDA = HIGH ;
SCL = HIGH ;
}
/****************************************************************************
* 函数原型: bit function I_send(byte I_data);
* 功 能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
* 则返回1(TRUE), 否则返回0(FALSE)。
****************************************************************************/
bit function I_send( byte I_data )
{
register byte i ;
bit Ack;
/* 发送8位数据 */
for ( i=0 ; i <8 ; i++ )
{
if(I_data & 0x80)SDA = HIGH ;
else SDA = LOW ;
I_data < <= 1 ;
delay();
SCL = HIGH ;
delay();
SCL = LOW ;
delay();
}
SDA = HIGH ;
delay();
SCL = HIGH ;
delay();
Ack = SDA ;
SCL = LOW ;
delay();
return (Ack);
}
/****************************************************************************
* 函数原型: byte function I_receive(void);
* 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
* 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
* 号线处于浮置状态, 即使8051的P3.5脚置1。
****************************************************************************/
byte function I_receive( void )
{
byte I_data = 0 ;
register byte i ;
for ( i=0 ; i <8 ; i++ )
{
SCL = HIGH ;
delay();
I_data < <= 1 ;
if (SDA) I_data |= 0x01 ;
SCL = LOW ;
delay();
}
return ( I_data ) ;
}
/****************************************************************************
* 函数原型: void function I_Ack(void);
* 功 能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
*****************************************************************************/
void function I_Ack( unsigned char Ack )
{
SDA = Ack ;
SCL = HIGH ;
delay();
SCL = LOW ;
}
//写24C04函数,带三个参数,第一个参数为24C04的外部地址和读写命令码
//第二个参数为24C04的存储地址,第三个参数为写入的字符,写入成功返回1;
bit WR_24C04(unsigned char addr1,unsigned char addr2,unsigned char Num)
{
unsigned char i;
bit Ack;
bit FgTimeout=LOW;
I_init(); //I2C总线初始化
for (i=0;i <10;i++)
{
I_start();
Ack=I_send(addr1); //24C的外部地址,0xa0
if(Ack)
{
I_stop();
continue;
}
Ack=I_send(addr2); //24C的存储地址,0
if(Ack)
{
I_stop();
continue;
}
Ack=I_send(Num);
if(Ack)
{
I_stop();
continue;
}
I_stop();
FgTimeout = HIGH ;
if (!Ack ) break;
}
D1ms(10);
return(FgTimeout);
}
//读24C04函数,带二个参数,第一个参数为24C的外部地址和读写命令码
//第二个参数为24C的存储地址,返回读入的值
unsigned char RD_24C04(unsigned char addr1,unsigned char addr2)
{
unsigned char Temp;
I_start();
I_send(addr1);
I_send(addr2);
I_start();
I_send(addr1|0x01); //修改为读入
Temp=I_receive();
I_Ack(1);
I_stop();
return (Temp) ;
}
发表时间:2003年8月22日11:41:21