|
EEPROM.H :
#ifndef _EEPROM_H_
#define _EEPROM_H_
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0;
sbit SCL=P2^1;
void delay_10us();
void i2c_start();
void i2c_stop();
uchar i2c_sendbyte(uchar dat);
uchar i2c_readbyte();
void write_to_at24c02(uchar addr, uchar dat);
uchar read_from_at24c02(uchar addr);
#endif
EEPROM.C :
#include <reg52.h>
#include "eeprom.h"
void delay10us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void i2c_start()
{
SDA=1;
delay10us();
SCL=1;
delay10us();
SDA=0;
delay10us();
SCL=0;
delay10us();
}
void i2c_stop()
{
SDA=0;
delay10us();
SCL=1;
delay10us();
SDA=1;
delay10us();
}
uchar i2c_sendbyte(uchar dat)
{
uchar i,t;
for(i=0;i<8;i++)
{
dat=dat<<1;
SDA=CY;
delay10us();
SCL=1;
delay10us();
SCL=0;
delay10us();
}
SCL=1;
delay10us();
SDA=1;
delay10us();
while(SDA)
{
t++;
if(t>200)
{
SCL=0;
delay10us();
return 0;
}
}
SCL=0;
delay10us();
SDA=1;
delay10us();
return 1;
}
uchar i2c_readbyte()
{
uchar dat,i;
SCL=0;
delay10us();
for(i=0;i<8;i++)
{
SCL=1;
delay10us();
dat=dat<<1;
dat|=SDA;
delay10us();
SCL=0;
delay10us();
}
return dat;
}
void write_to_at24c02(uchar addr, uchar dat)
{
i2c_start();
i2c_sendbyte(0xa0);
i2c_sendbyte(addr);
i2c_sendbyte(dat);
i2c_stop();
}
uchar read_from_at24c02(uchar addr)
{
uchar dat;
i2c_start();
i2c_sendbyte(0xa0);
i2c_sendbyte(addr);
i2c_start();
i2c_sendbyte(0xa1);
dat=i2c_readbyte();
i2c_stop();
return dat;
}
main 主程序:
/*****************
功能:通过独立键盘控制EEPROM AT24C02的写入、读出以及数据在数码管显示
K1:数据写入AT24C02
K2:数据从AT24C02读出到单片机
K3:数据加1
K4:数据清零
受传送字节限制,只能试验0~255的数据
欢迎交流单片机编程思路,共同提高进步 QQ30777103
*****************/
#include<reg52.h>
#include "eeprom.h"
sbit s1=P1^0; //74HC138 译码器管脚定义
sbit s2=P1^1;
sbit s3=P1^2;
#define DUAN P0 //数码管管脚定义
sbit key1=P2^4;
sbit key2=P2^5;
sbit key3=P2^6;
sbit key4=P2^7;
uint srdata;
uchar smg_duan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
uchar smg_wei[]={0x00,0x01,0x02,0x03,0x04,0x05};
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 delay(uint t)
{
while(t--);
}
void smg_display(uint srdata)
{
uchar i;
for(i=0;i<6;i++)
{
P1=smg_wei[i];
switch(i)
{
case 0: DUAN=~smg_duan[srdata/1000/100]; break;
case 1: DUAN=~smg_duan[srdata/1000/10]; break;
case 2: DUAN=~smg_duan[srdata%10000/1000]; break;
case 3: DUAN=~smg_duan[srdata%1000/100]; break;
case 4: DUAN=~smg_duan[srdata%100/10]; break;
case 5: DUAN=~smg_duan[srdata%10]; break;
}
delay(300);
DUAN=0x00;
}
}
void main()
{
/* LED按照I2C回传的数据显示
write_to_at24c02(11,0xaa);
delay10ms();
P1=read_from_at24c02(11);
while(1);
*/
uchar t;
while(1)
{
key1=1;
key2=1;
key3=1;
key4=1;
t=0;
if(key1==0)
{
delay10ms();
if(key1==0)
{
write_to_at24c02(10,srdata);
delay10ms();
while(key1==0&&t<1000)
t++;
}
}
if(key2==0)
{
delay10ms();
if(key2==0)
{
srdata=read_from_at24c02(10);
delay10ms();
while(key2==0&&t<1000)
t++;
}
}
if(key3==0)
{
delay10ms();
if(key3==0)
{
srdata++;
if(srdata>65535)
srdata=0;
delay10ms();
while(key3==0&&t<1000)
t++;
}
}
if(key4==0)
{
delay10ms();
if(key4==0)
{
srdata=0;
delay10ms();
while(key4==0&&t<1000)
t++;
}
}
smg_display(srdata);
}
}
|
|