how to include assembler in keil
/*********************定义调节阀结束*****************************/
/*********************定义24C04开始*****************************/
#define WR 0xa0
#define RD 0xa1
/* 常,变量定义区 */
uchar Byte_[8]; /*端口位定义*/
sbit SDA=P1^3; /*模拟I2C数据传送位*/
sbit SCL=P1^2; /*模拟I2C时钟控制位*/
bit CSI24C021RWBYTE(uchar *Byte_,uchar BCount,uchar Address,uchar rw);
/****************************定义24C04结束******************************/
//———————START——I2C—————————————————
/*————————————————————————————————
调用方式:void I2CWait(void)
函数说明:私有函数,I2C专用 2002-08-15
————————————————————————————————*/
void I2CWait(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*———————————————————————————————
方式:void I2CStart(void)
函数说明:私有函数,I2C专用 2002-08-15
————————————————————————————————*/
void I2CStart(void)
{
SDA=1; SCL=1; I2CWait();
SDA=0; I2CWait();
SCL=0;
}
/*————————————————————————————————
调用方式:void I2CStop(void)
函数说明:私有函数,I2C专用 2002-08-15
————————————————————————————————*/
void I2CStop(void)
{
SCL=0;SDA=0;I2CWait();//INT
SCL=1;I2CWait();SDA=1;//STOP
}
/*————————————————————————————————
调用方式:bit WaitAck(void)
函数说明:私有函数,I2C专用,等待从器件接收方的应答 2002-08-15
————————————————————————————————*/
bit WaitAck(void)
{
uchar errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;I2CWait();
SCL=1;I2CWait();
while(SDA){errtime--;if(!errtime){I2CStop();return false;}}
SCL=0;
return true;
}
/* ————————————————————————————————
调用方式:void SendAck(void) 2002-08-15
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号
————————————————————————————————*/
void SendAck(void)
{
SDA=0;I2CWait();
SCL=1;I2CWait();
SCL=0;
}
/* ————————————————————————————————
调用方式:void SendNoAck(void) 2002-08-15
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号
————————————————————————————————*/
void SendNoAck(void)
{
SDA=1;I2CWait();
SCL=1;I2CWait();
SCL=0;
}
/* ————————————————————————————————
调用方式:void I2CSend(uchar ch,uchar H_L)
函数说明:私有函数,I2C专用
————————————————————————————————*/
void I2CSendByte(uchar ch,uchar H_L)
{
uchar i=8;
while(i--)
{
SCL=0;_nop_();
if (H_L==1)
{ SDA=(bit)(ch&0x80);ch<<=1;}//从高到低MSB->LSB
else
{ SDA=(bit)(ch&0x01);ch>>=1;};//从低到高LSB->MSB
I2CWait();
SCL=1;I2CWait();
}
SCL=0;
}
/* ————————————————————————————————
调用方式:void I2CReceive(uchar H_L)
函数说明:私有函数,I2C专用
————————————————————————————————*/
uchar I2CReceiveByte(uchar H_L)
{
uchar i;//=8;
uchar ddata=0;
uchar ddata1=0;
SDA=1;
for(i=0;i<=7;i++)
{
if (H_L==1){ddata<<=1;};
SCL=0;I2CWait();
SCL=1;I2CWait();
ddata1=0;
ddata1|=SDA;
if (H_L!=1){ddata1<<=i;};
ddata|=ddata1;
}
SCL=0;
return ddata;
}
bit CSI24C021RWBYTE(uchar *Byte_,uchar BCount,uchar Address,uchar rw) //读写csi24c021
{
uchar i;
i=0x0A0;
I2CStart();
I2CSendByte(i,1); //写入控制字(SLAVE地址)
if(!WaitAck())return 1; //写入控制字失败重来
I2CSendByte(Address,1); //地址低8位
if(!WaitAck())return 1;
switch(rw)
{
case 1: //WRITE
for(i=0;i<BCount;i++)
{
I2CSendByte(Byte_,1);
if(!WaitAck())return 1;
}
break;
case 0: //READ
I2CStart(); //再次启动I2C
I2CSendByte(i+1,1);//写入控制字,传送OxA1的地址,即“读出的SLAVE地址
if(!WaitAck()) return 1;
for(i=0;i<BCount;i++)
{
Byte_=I2CReceiveByte(1);
if(i!=BCount-1){SendAck();}
}
SendNoAck();
}
I2CStop();
I2CWait();
return 0;
}