EEPROM写入一数组并显示

2019-04-15 15:45发布

class="markdown_views prism-dracula"> ** EEPROM写入有个时间TWR要求,一般是5ms,如果写的间隔过小可能写不进去。为留有一定余量,最好设成10ms**
以后要好好看数据手册啊,这个点卡了一下午… IIC.h #ifndef _IIC_H #define _IIC_H #include #include sbit SCL = P2^1; sbit SDA = P2^0; sbit LE = P1^0;// sbit a = P2^2; sbit b = P2^3; sbit c = P2^4; void delay1s(void); void delay5us(void); void delay1ms(void); void delay10ms(void); //误差 0us void AT24C02Write(unsigned char addr,unsigned char dat); unsigned char AT24C02Read(unsigned char addr); #endif main.c #include "iic.h" #include unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void display(unsigned char i,unsigned char num) { switch(i) { //R->L case 1: a = 1;b = 1;c = 1; break; case 2: a = 0;b = 1; c = 1;break; case 3: a = 1;b = 0;c = 1; break; case 4: a = 0;b = 0;c = 1; break; case 5: a = 1; b = 1;c = 0;break; case 6: a = 0;b = 1;c = 0;break; case 7: a = 1;b = 0;c = 0;break; case 8: a = 0;b = 0; c = 0; break; default:break; } P0 = table[num]; } void main() { unsigned char dat,flag=0,i=0,j=0,num[6] = {9,5,0,8,2,3},key[6]={0,0,0,0,0,0}; //write for(i = 0;i < 6;++i){ AT24C02Write(i,num[i]); delay10ms(); } //read for(i = 0;i < 6;++i){ dat = AT24C02Read(i); key[i]=dat; } //show while(1){ display(j+1,key[j]); ++j; delay1ms(); if(j == 6){ j = 0; P0 = 1; delay1ms(); } } } IIC.c #include "iic.h" void delay1s(void) //误差 0us { unsigned char a,b,c; for(c=167;c>0;c--) for(b=171;b>0;b--) for(a=16;a>0;a--); _nop_(); //if Keil,require use intrins.h } void delay5us(void) //误差 0us { unsigned char a; for(a=1;a>0;a--); } void delay1ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } void I2C_Init() { SCL = 1; _nop_(); SDA = 1; _nop_(); } void I2C_Start() { SDA = 1; _nop_(); SCL = 1; delay5us(); SDA = 0; delay5us(); SCL = 0; delay5us(); } void I2C_Stop() { SDA = 0; _nop_(); SCL = 1; delay5us(); SDA = 1; delay5us(); } unsigned char I2C_SentByte(unsigned char dat) { unsigned char i=0,j=0; for(i = 0;i < 8;i++) { SCL = 0; delay5us(); SDA = dat >> 7; dat = dat<<1; delay5us(); SCL = 1; delay5us(); } SCL = 0; SDA = 1; _nop_(); SCL = 1; _nop_(); while(SDA) { ++j; if(j > 200) { SCL = 0; _nop_(); I2C_Stop(); return 0; } } SCL = 0; delay5us(); return 1; } unsigned char I2C_ReadByte() { unsigned char dat = 0,i = 0; SCL = 0; delay5us(); SDA = 1; delay5us(); for(i = 0; i < 8;++i) { SCL = 1; delay5us(); dat <<= 1; dat |= SDA; delay5us(); SCL = 0; delay5us(); } return dat; } void AT24C02Write(unsigned char addr,unsigned char dat) { I2C_Init(); I2C_Start(); I2C_SentByte(0xa0); I2C_SentByte(addr); I2C_SentByte(dat); I2C_Stop(); } unsigned char AT24C02Read(unsigned char addr) { unsigned char dat; I2C_Init(); I2C_Start(); I2C_SentByte(0xa0); I2C_SentByte(addr); I2C_Start(); I2C_SentByte(0xa1); dat = I2C_ReadByte(); I2C_Stop(); return dat; }