iic与24c02
偶做人间客 2019-01-06 05:55:25 这个程序是按键显示数字并且写进24c02芯片里,每次启动的时候读取,但是我只能保存一个数据,没办法保存8个数据,麻烦大佬帮忙看看
#include "reg52.h"
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^0; /* 数据线 */
sbit SCL = P2^1; /* 时钟线 */
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//应答位控制
void IIC_Ack(bit ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
#include<reg51.h>
#include"iic.h"
#include "intrins.h"
sbit dula=P2^6;
sbit wela=P2^7;
sbit n=P1^0;
unsigned char duan[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选码1~9
unsigned char wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位选码
unsigned char key_buf[]={0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb}; //键值
unsigned char key_scan[]={0xef,0xdf,0xbf}; //键盘扫描码
unsigned char led[8];
unsigned char buf=0;
unsigned char state=0;
unsigned char t=0;
unsigned char key=0;
unsigned char read_eeprom(unsigned char add)
{
unsigned char d;
IIC_Start();
IIC_SendByte(0xa0);
n=IIC_WaitAck();
IIC_SendByte(add);
n=IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
n=IIC_WaitAck();
d=IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return d;
}
void write_eeprom(unsigned char add,unsigned char d)
{
IIC_Start();
IIC_SendByte(0xa0);
n=IIC_WaitAck();
IIC_SendByte(add);
n=IIC_WaitAck();
IIC_SendByte(d);
n=IIC_WaitAck();
IIC_Stop();
}
void delay(unsigned int a) //1ms
{
unsigned int j=0;
for(;a>0;a--)
for(j=0;j<125;j++);
}
void show(unsigned char i) //显示第i位数
{
dula=0;
P0=led[i];
dula=1;
dula=0;
wela=0;
P0=wei[i];
wela=1;
wela=0;
}
void initial() //定时器初始化
{
TMOD=0x01;
TH0=(65536-2500)/256; //2.5ms
TL0=(65536-2500)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1 //中断函数
{
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
t++;
if(t==8)
t=0;
show(t); //每次中断显示一位数
}
char getkey(void)
{
char i=0;
char j=0;
char m=0;
for(;i<3;i++)
{
P3=key_scan[i];
if((P3&0x07)!=0x07)
{
delay(10);
if((P3&0x07)!=0x07)
if(state==0)
{
{
for(;j<9;j++)
{
if(key_buf[j]==P3)
{state++;return j;}
}
}
}
if(state==1)
{
for(;m<120;m++)
{
if((P3&0x07)!=0x07)
m=0;
}
state=0;
}
}
}
return -1;
}
void run(unsigned char a)
{
led[7]=led[6];
led[6]=led[5];
led[5]=led[4];
led[4]=led[3];
led[3]=led[2];
led[2]=led[1];
led[1]=led[0];
led[0]= duan[a];
}
#include<reg51.h>
#include"iic.h"
#include"fun.h"
#include"intrins.h"
sbit ledx=P1^2;
unsigned char num;
void main()
{
unsigned char i;
initial();
for(i=0;i<8;i++)
{
led[i]=read_eeprom(30+i);
}
while(1)
{
num=getkey();
if(num!=-1)
{
run(num);
for(i=0;i<8;i++)
{
write_eeprom(30+i,led[i]);
}
}
}
}