#include<reg52.h>
#include <INTRINS.H>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit SCL = P3^7;
sbit SDA = P3^6;
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();//用_nop_()需要用INTRINS.H
}
void IIC_init()
{
SDA=1;
SCL=1;
}
void IIC_start()
{
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
void IIC_stop()
{
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void IIC_send(uint8 byte)
{
uint8 mask,i,j;
mask=0x80;
for(i=0;i<8;i++)
{
SCL=0;
delay();
if((mask&&byte)==0)
SDA=0;
else
SDA=1;
delay();
mask>>=1;
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
j=SDA;
SCL=0;
delay();
}
uint8 IIC_read()
{
uint8 byte,i;
byte=0;
for(i=0;i<8;i++)
{
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
if(SDA==1)
{
byte|=0x01;
}
byte<<=1;
}
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();;
SCL=0;
delay();
return byte;
}
void write(uint8 addr,uint8 datebyte)
{
IIC_start();
IIC_send(0xa0);
IIC_send(addr);
IIC_send(datebyte);
IIC_stop();
}
uint8 read(uint8 addr)
{
uint8 datebyte;
IIC_start();
IIC_send(0xa0);
IIC_send(addr);
IIC_start();
IIC_send(0xa1);
datebyte=IIC_read();
IIC_stop();
return datebyte;
}
void UART_init(void)
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
// ES = 1;
// EA = 1;
}
void UART_send_byte(uint8 dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
main()
{
uint8 addr = 0x00, databyte = 0x11;
uint8 c = 0;
uint16 i;
UART_init();
IIC_init();
while(1)
{
write(addr, databyte);
for(i = 0; i < 1000; i++)
{
delay();
}
c = read(addr);
UART_send_byte(c);
addr++; //地址往下加
databyte++;
if(addr == 0xff) {addr = 0;}
if(databyte == 0xff) {databyte = 0;}
for(i = 0; i < 1000; i++)
{
delay();
}
}
}
代码不理解的欢迎留言