sbit SCL=P1^0; sbit SDA=P1^1;
delay(unsigned long i);
unsigned char a, b, c,d,temp,count; unsigned long address, i,j,k,l; unsigned char stack[];
I2C_START() //I2C 启动 { SDA=1; SCL=1; SDA=0; SCL=0; }
I2C_STOP() //I2C 结束 { SDA=0; SCL=1; SDA=1; }
1 / 6
I2C_WRITE_BYTE() //I2C 写入字节数据,上升沿输入 { for(count=0;count<8;count++) { SCL=0; SDA=temp&0x80; SCL=1; SCL=0; temp=temp<<1; }
SDA=0; SCL=1; SCL=0; SDA=1; }
I2C_READ_BYTE() //I2C 读取数据,上升沿后读取 { for(count=0;count<8;count++) { SDA=1; temp=temp<<1; SCL=1; temp=temp|SDA; SCL=0; } }
I2C_SEND_ACK() //I2C 发出应答 { SDA=0; SCL=1; SCL=0; }
I2C_ADDRESS_WRITE() //I2C 写入的第一个地址位的转换,因为1024的头5个输入固定为10100,然后两位地址,接着读写位,所以要进行变换 { temp=0xa0; for(count=0;count<5;count++) { SCL=0; SDA=temp&0x80;
2 / 6
SCL=1; SCL=0; temp=temp<<1; } SCL=0; SDA=address&0x200000; SCL=1; SCL=0; SCL=0; SDA=address&0x10000; SCL=1; SCL=0; SCL=0; SDA=0; SCL=1; SCL=0; SDA=0; SCL=1; SCL=0; SDA=1; }
I2C_ADDRESS_READ() //I2C 读取的第一个地址位的转换,定为10100,然后两位地址位,接着是读写位,所有要进行变换 { temp=0xa0; for(count=0;count<5;count++) { SCL=0; SDA=temp&0x80; SCL=1; SCL=0; temp=temp<<1; } SCL=0; SDA=address&0x200000; SCL=1; SCL=0;
1024的头5位固 3 / 6 因为
SCL=0; SDA=address&0x10000; SCL=1; SCL=0; SCL=0; SDA=1; SCL=1; SCL=0; SDA=0; SCL=1; SCL=0; SDA=1; }
I2C_WRITE_DATA(unsigned long address, unsigned char d) 堆栈stack[]中的数据存入1024。 { I2C_START(); I2C_ADDRESS_WRITE(); temp=(address&0xff00)>>8; I2C_WRITE_BYTE(); temp=address&0xff; I2C_WRITE_BYTE(); for(c=0;cI2C_READ_DATA(unsigned long address,unsigned char d) stack[]中的数据读出。 { I2C_START();//按指定的地址和长度,把//按指定的地址和长度,把堆栈 4 / 6
I2C_ADDRESS_WRITE(); temp=(address&0xff00)>>8; I2C_WRITE_BYTE(); temp=address&0xff; I2C_WRITE_BYTE(); I2C_START(); I2C_ADDRESS_READ(); for(b=0;bvoid main (void) { SDA = 1; SCL = 1;SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2 TMOD|= 0x20; //定时器工作方式2 PCON|= 0x80; //波特率提高一倍 TH1 = 0xFf; //baud*2 /* 波特率57600、数据位8、停止位1。效验位无 (11.0592M) TL1 = 0xFf; TR1 = 1; //开启定时器1 for(a=0x0;a<;a++) //先给堆栈stack[]设预值 { stack[a]=a+1; temp=stack[a]; SBUF=temp;
5 / 6
while(!TI); delay(1000); } I2C_WRITE_DATA(0x024600,); //在指定地址处写入规定长度的数据; delay(500); //在芯片写入期间不能读取,强行读取会出现错误,必须延时。 dd: I2C_READ_DATA(0x024600,); //重复在指定的位置读取指定长度的数据,并通过串口进行显示。 for(c=0;c<;c++) { temp=stack[c]; SBUF=temp; while(!TI); delay(1000); }
goto dd; }
/************************************************** 延时处理程序
**************************************************/
delay(unsigned long i) { while(i--); }
6 / 6