📄 text1.c
字号:
#include<AT89X52.h>
#include<intrins.h>
#define DELAY_TIME 4
#define uchar unsigned char
#define FALSE 0
#define TRUE 1
sbit SCL=P2^6;
sbit SDA=P2^7;
sbit LED1=P0^0;
void DELAY(unsigned int t)
{
while(t--);
}
void IIC_Start(void) //启动IIC总线,当SCL为高电平时使SDA产生一个负跳变
{
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SDA=0;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void IIC_Stop(void) //终止IIC总线,当SCL为高电平时使SDA产生一个正跳变
{
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SDA=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_0(void) //发送0,在SCL为高电平时使SDA信号为低
{
SDA=0;
DELAY(DELAY_TIME);
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
}
void SEND_1(void) //发送1,在SCL为高电平时始SDA信号为高
{
SDA=1;
DELAY(DELAY_TIME);
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
}
void Write_Byte(uchar b) reentrant //向IIC总线写一个字节
{
uchar i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
uchar Read_Byte(void) reentrant //从IIC总线读一个字节
{
uchar b=0,i;
SDA=1; //释放总线
for(i=0;i<8;i++)
{
b<<=1;
SCL=0; DELAY(DELAY_TIME);
SCL=1; DELAY(DELAY_TIME);
b|=SDA;
}
SCL=0;
return b;
}
bit Check_ACK(void) //发送完一个字节后,检验设备的应答信号
{
uchar errtime=255;
SDA=1; DELAY(DELAY_TIME);
SCL=1; DELAY(DELAY_TIME);
while(SDA)
{
errtime--;
if(!errtime)
{
IIC_Stop();
return FALSE;
}
}
SCL=0;
return TRUE;
}
bit Write_N_Bytes(uchar AddrWr,uchar AddrWord,uchar *buffer,uchar num) reentrant
{
uchar i;
IIC_Start();
Write_Byte(AddrWr);
if(!Check_ACK()) return(FALSE);
Write_Byte(AddrWord);
if(!Check_ACK()) return(FALSE);
for(i=0;i<num;i++)
{
Write_Byte(*buffer);
if(!Check_ACK()) return(FALSE);
buffer++;
}
IIC_Stop();
return TRUE;
}
bit Read_N_Bytes(uchar AddrWr,uchar AddrWord,uchar *buffer,uchar num) reentrant
{
uchar i;
IIC_Start();
Write_Byte(AddrWr);
if(!Check_ACK()) return FALSE;
Write_Byte(AddrWord);
if(!Check_ACK()) return FALSE;
IIC_Start();
Write_Byte(AddrWr+1);
if(!Check_ACK()) return FALSE;
for(i=0;i<num-1;i++)
{
*buffer=Read_Byte();
SEND_0();
buffer++;
}
*buffer=Read_Byte();
SEND_1();
IIC_Stop();
return TRUE;
}
void Public_Delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
for(j=0;j<250;j++);
}
void main(void)
{
uchar r[4]={0x7F,2,3,4};
bit t;
uchar b[4]={0};
t=Write_N_Bytes(0xa0,0x20,r,4);
if(t==TRUE)
P0=0x06;
else
P0=0x5b;
Public_Delay(65500);
Public_Delay(65500);
t=Read_N_Bytes(0xa0,0x20,b,4);
if(b[3]==4)//t==FALSE)
{P0=b[0];}
while(1)
{ }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -