|
- /*****单片机模拟I2C总线,并存取I2C串行EEPROM 24C02C****/
- #include <reg52.h>
- #include <string.h>
- #include "I2C_51.h"
- #include "uart.h"
- sbit sda=P2^1;//数据线
- sbit scl=P2^0; //时钟线
- sbit dula=P2^6;
- sbit wela=P2^7;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,
- };
- /********************I2C_51.h***********************************************************
- void I2C_Start(void);
- void I2C_Stop(void);
- bit Check_Acknowledge(void);
- void WriteI2CByte(char b)reentrant;
- char ReadI2CByte(void)reentrant
- ****************************************************************************************/
- /***************write one byte***********************************************************
- 功能:将ch写到地址add处 *
- 输入:地址add,待写字节数据ch *
- 输出:无 *
- ****************************************************************************************/
- void WriteByte(uchar add,uchar ch){
- I2C_Start(); //start
- WriteI2CByte(0xa0); while(!Check_Acknowledge());//control byte:1010+A2+A1+A0+1(write)/0(read)
- WriteI2CByte(add); while(!Check_Acknowledge());//address
- WriteI2CByte(ch); while(!Check_Acknowledge());//data
- I2C_Stop(); //stop
- }
- /***************Read one byte************************************************************
- 功能:从地址ch处读取一字节数据 *
- 输入:地址add *
- 输出:从地址add处读得的一字节数据 *
- ****************************************************************************************/
- char ReadByte(uchar add){
- char b;
- I2C_Start(); //start
- WriteI2CByte(0xa0); while(!Check_Acknowledge());//control byte,
- WriteI2CByte(add); while(!Check_Acknowledge());//address
- I2C_Start(); //start
- WriteI2CByte(0xa1); while(!Check_Acknowledge());//data
- b=ReadI2CByte(); //N0 Acknowledge
- I2C_Stop(); //stop
- return b;
- }
- /***************write string***************************************************************
- 功能:以add为起始地址连续写入字符串p *
- 输入:地址,待写字符串 *
- 输出:无 *
- 注意:字符串p的长度不需小于一页数据(24c02c的一页为16byte)。 *
- 数据字节临时存储在片内页缓冲器中。在主器件发送停止条件之后,这些数据将被写入存储器。*
- 每接收一个字,内部地址计数器加一。如果在停止条件产生前,主器件有超出一页的数据要发送,
- 地址计数器将会翻转,先前写入的数据将被覆盖。 *
- ******************************************************************************************/
- void WriteString(uchar add,uchar *p){ /*224C02C(2kbit),strlen(p)should<=16bit*/
- uchar i;
- I2C_Start();
- WriteI2CByte(0xa0); while(!Check_Acknowledge());
- WriteI2CByte(add); while(!Check_Acknowledge());
- for(i=strlen(p);i!=0;i--){
- WriteI2CByte(*p); while(!Check_Acknowledge());
- p++;
- }
- I2C_Stop();
- }
- /***************read string*************************************************************************
- 功能:以add为起始地址连续读len长字节数据,并通过*P返回 *
- 输入:地址add,读取长度len *
- 输出:字符串*p *
- 说明:连续读操作的起动过程和随机读操作相同,只是在 24XX发送完第一个数据字节后,主器件发出确认信号,*
- 而在随机读操作中发送的是停止条件。确认信号指示 24XX 器件发送下一个连续地址的数据字节(图 8-4)。
- 在24器件向主器件发送完最后一个字节后,主器件不会 产生确认信号,而是产生停止条件。 *
- ***************************************************************************************************/
- void ReadString(uchar add,uchar *p,uchar len){
- I2C_Start(); //start
- WriteI2CByte(0xa0); while(!Check_Acknowledge()); //control byte,
- WriteI2CByte(add); while(!Check_Acknowledge()); //address
- I2C_Start(); //start
- WriteI2CByte(0xa1); while(!Check_Acknowledge()); //data
- while(len--){
- *p=ReadI2CByte();
- SDA=0; //MCU发确认信号,使器件发送下一个连续地址的数据字节
- SCL=1;
- DELAY(DELAY_TIME);
- SCL=0;
- DELAY(DELAY_TIME);
- p++;
- }//读完最后一个字节不确认,停止结束
- I2C_Stop(); //stop
- }
- /*******************main fuction*************************/
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(uchar shu)
- {
- dula=1;
- P0=table[shu];
- dula=0;
- P0=0xff;
-
- wela=1;
- P0=0xfe;
- wela=0;
- delayms(5);
- }
- void main()
- { uchar a;
- uint b;
- UartInit();
- WriteByte(1,'3');
- a=ReadByte(1);
- b=a;
- putchar(a);
- putchar(b);
- display(b-48);
- while(1);
-
- for(;;);
- }
复制代码
|
|