C51单片机关于24C02存储读取问题,请大神看看啊!

2019-07-15 22:56发布

下面是I2CEPPROM的程序。为我程序一部分,为什么我读不出来呢?检查了几次都检查不出问题,请大神们看看,小弟谢谢啦!
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;//时钟
sbit SDA=P2^1;//数据
uchar *addw;
uchar *addr;
/**********************************************************
I2C+EPPROM子程序。
***********************************************************
延时程序
******************************/
void Delayms(uchar number)
{
uchar temp;
for(;number!=0;number--)
{
  for(temp=125;temp!=0;temp--)
  {
  }
}
}
/******************************
起始信号程序
******************************/
void start()
{
SDA=1;
Delayms(1);
SCL=1;
Delayms(1);
SDA=0;
Delayms(1);
SCL=0;
Delayms(1);
}
/******************************
终止信号程序
******************************/
void stop()
{
SDA=0;
Delayms(1);
SCL=1;
Delayms(1);
SDA=1;
Delayms(1);
}
/******************************
发送应答信号程序
******************************/
void ack()
{
SDA=0;
Delayms(1);
SCL=1;
Delayms(1);
SDA=0;
Delayms(1);
SCL=1;
Delayms(1);
}
/******************************
发送非应答信号程序
******************************/
void noack()
{
SDA=1;
Delayms(1);
SCL=1;
Delayms(1);
SCL=0;
Delayms(1);
}
/******************************
应答位检查程序
******************************/
bit testack()
{
bit errorbit;
SDA=1;
Delayms(1);
SCL=1;
Delayms(1);
errorbit=SDA;//读入数据线上的应答状态
Delayms(1);
SCL=0;
Delayms(1);
return(errorbit);
}
/******************************
写一个字节数据程序
******************************/
bit writebit(uchar input)
{
uchar mm;
for(mm=0;mm<8;mm++)//循环移位,逐位发送数据
{
  SDA=(bit)(input&0x80);//取数据的最高位
  Delayms(1);
  SCL=1;
  Delayms(1);
  SCL=0;
  Delayms(1);
  input=input<<1;
}
return 1;
}
/******************************
写n字节数据程序
******************************/
void writei2c(uchar *wdata,uchar romaddress,uchar shuzi)
{
start();
writebit(writedeviceaddress);//写器件的寻址地址
testack();//应答检查
writebit(romaddress);//写入I2C器件内部的数据存储首地址
testack();
for(;shuzi!=0;shuzi--)//循环,逐个字节发送
{
  writebit(*wdata);//写一个字节
  testack();//应答检查
  wdata++;//指针增加,指向下一个数据
}
stop();
Delayms(1);
}
/******************************
读一个字节数据程序
******************************/
uchar readbit()
{
uchar mk,rbyte=0;
for(mk=8;mk!=0;mk--)//循环,逐位读入字节数据
{
  SCL=1;
  Delayms(1);
  rbyte=rbyte<<1;//左移一位
  Delayms(1);
  rbyte=rbyte|((uchar)(SDA));//数据线SDA上的数据存入rbyte的最低位
  SCL=0;
  Delayms(1);
}
return (rbyte);//返回读入的字节数
}
/******************************
读n个字节数据程序
******************************/
void readi2c(uchar *ramaddress,uchar romaddress,uchar bytes)
{
start();
writebit(writedeviceaddress);//写内部寻址地址
testack();//应答检查
writebit(romaddress);//写I2C器件内部数据读取首地址
testack();
start();
writebit(readdviceaddress);//写读器件寻址地址
testack();
while(bytes!=1)
{
  *ramaddress=readbit();//读入一个字节
  ack();//应答
  ramaddress++;//地址指针递增
  bytes--;//带读入数据个数递减
}
*ramaddress=readbit();//读入最后一个字节数据
noack();//非应答
stop();//停止
}
void display1() //密码锁(这个是在12864上写的密码锁,我定义一个数组keyjie[6],用遥控器按值送入这个数组,并把这个数组写进EPPROM中,最后将其读出来显示在12864中)
{
uchar x;
    if(dd>5&&dd<16&&bk==1)
{
  if(ll==1)
  {
   x=(dd-6)+0x30;
   lcd_pos(2,1);//写12864地址程序
   keyjie[0]=x;//读取按键密码
   lcd_wdat(keyjie[0]);
   delay1(30);
   lcd_pos(2,1);
   lcd_wdat('*');//12864写数据程序
   
  }
   if(ll==2)
  {
   x=(dd-6)+0x30;
   lcd_pos(2,2);
   keyjie[1]=x;//读取按键密码
   lcd_wdat(keyjie[1]);
   delay1(30);
   lcd_pos(2,2);
   lcd_wdat('*');
   
  }
   if(ll==3)
  {
   x=(dd-6)+0x30;
   lcd_pos(2,3);
   keyjie[2]=x;//读取按键密码
   lcd_wdat(keyjie[2]);
   delay1(30);
   lcd_pos(2,3);
   lcd_wdat('*');
   
  }
   if(ll==4)
  {
   x=(dd-6)+0x30;
   lcd_pos(2,4);
   keyjie[3]=x;//读取按键密码
   lcd_wdat(keyjie[3]);
   delay1(30);
   lcd_pos(2,4);
   lcd_wdat('*');
  }
   if(ll==5)
  {
   x=(dd-6)+0x30;
   lcd_pos(2,5);
   keyjie[4]=x;//读取按键密码
   lcd_wdat(keyjie[4]);
   delay1(30);
   lcd_pos(2,5);
   lcd_wdat('*');
  }
   if(ll==6)
  {
   x=(dd-6)+0x30;
   lcd_pos(2,6);
   keyjie[5]=x;//读取按键密码
   lcd_wdat(keyjie[5]);
   delay1(30);
   lcd_pos(2,6);
   lcd_wdat('*');
  }
} delay1(100);
}
void wmima()//给EPPROM写密码
{
  bit write=1;
  while(1)
  {
   if(write==1)
  {
   addw=keyjie;
   writei2c(addw,0x00,6);
   write=0;
  }
  if(write==0) break;
  }
}
void rmima()//读密码
{
uchar i;
uchar y=0;
uchar z=0;
uchar readbyte[6];
addr=readbyte;
readi2c(addr,0x00,6);
if(dd==16)
{
  for(i=0;i<6;i++)
  {
      lcd_pos(3,y);
   lcd_wdat(readbyte);
   y++;
  }
}
}//延时程序和12864写地址和写数据等程序就没写了,主要是看看这个I2C程序。。还请大神帮忙看下。小弟不胜感激。
来自小组: 单片机学习交流群
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。