[51单片机] I2C总线 读取数据出现问题 求大神指导

[复制链接]
 楼主| 15383646831 发表于 2018-1-24 12:46 | 显示全部楼层 |阅读模式
编译没有问题 但是按键k2 读取不出数据 但是检查了很久读取数据的函数没有问题。。。
代码有点多 望大神指导一下 有不规范指出望指正
  1. //这是main.c
  2. #include<reg51.h>
  3. #include<i2c.h>
  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. char num=0;
  8. u8 pros[4];

  9. sbit LSA=P2^2;                                                 //38译码器IO口连接
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;

  12. sbit k1=P3^0;                                                  //独立按键管脚
  13. sbit k2=P3^1;
  14. sbit k3=P3^2;
  15. sbit k4=P3^3;

  16. void delay(u16 i)                                          //延迟函数
  17. {
  18.    while(i--);
  19. }

  20. void Keypros()                                                         //按键的函数
  21. {
  22.    if(k1==0)
  23.    {
  24.       delay(100);
  25.            if(k1==0)
  26.                 {
  27.                    AT24c02Write(1,num);
  28.                 }
  29.                  while(!k1);
  30.           }
  31.           
  32.             if(k2==0)
  33.    {
  34.       delay(100);
  35.            if(k2==0)
  36.                 {
  37.                   num=AT24c02Read(1);
  38.                 }
  39.                 while(!k2);
  40.           }
  41.           
  42.              if(k3==0)
  43.    {
  44.       delay(100);
  45.            if(k3==0)
  46.                 {
  47.                  num++;
  48.                  if(num>255)
  49.                  {
  50.                     num=0;
  51.                  }
  52.                 }
  53.                 while(!k3);
  54.           }
  55.           
  56.              if(k4==0)
  57.    {
  58.       delay(100);
  59.            if(k4==0)
  60.                 {
  61.                   num=0;
  62.                 }
  63.                 while(!k4);
  64.           }
  65.    }

  66. void KeyDown()                                                                        //数码管动态显示
  67. {
  68.    u8 i;
  69.    for(i=0;i<4;i++)
  70.    {
  71.       switch(i)
  72.           {
  73.            case(0):LSA=0;LSB=0;LSC=0;break;
  74.            case(1):LSA=1;LSB=0;LSC=0;break;
  75.            case(2):LSA=0;LSB=1;LSC=0;break;
  76.            case(3):LSA=1;LSB=1;LSC=0;break;          
  77.           }
  78.           P0=pros[i];
  79.           delay(100);
  80.           P0=0X00;
  81.    }
  82. }

  83. void Dispros()
  84. {
  85.   pros[0]=smgduan[num/1000];
  86.   pros[1]=smgduan[num%1000/100];
  87.   pros[2]=smgduan[num%1000%100/10];
  88.   pros[3]=smgduan[num%1000%100%10];  
  89. }

  90. void main()
  91. {
  92.   while(1)
  93.   {
  94.    Keypros();
  95.    KeyDown();
  96.     Dispros();
  97.   }
  98. }
  99. //下面是i2c.c
  100. #include<i2c.h>
  101. void delay10us(void)   //误差 0us
  102. {
  103.     unsigned char a,b;
  104.     for(b=1;b>0;b--)
  105.         for(a=2;a>0;a--);
  106. }


  107. void I2cstart()                   //起始信号  下降沿
  108. {
  109.    SCL=1;
  110.    delay10us();
  111.    SDA=1;
  112.    delay10us();
  113.    SCL=0;
  114.    delay10us();
  115.    SDA=0;
  116.    delay10us();
  117. }

  118. void i2cstop()                 //终止信号 上升沿
  119. {
  120.    SDA=0;
  121.    delay10us();
  122.    SCL=1;
  123.    delay10us();
  124.    SDA=1;
  125.    delay10us();
  126. }

  127. unsigned char I2cSendByte(unsigned char dat)  //用I2c发送一个数据
  128. {
  129.   unsigned char a=0,b=0;
  130.   
  131.   for(a=0;a<8;a++)
  132.   {
  133.      
  134.           SDA=dat>>7;
  135.           dat=dat<<1;
  136.            SCL=1;
  137.           delay10us();
  138.           SCL=0;
  139.           delay10us();
  140.   }
  141.   SDA=1;
  142.   delay10us();
  143.   SCL=1;
  144.   while(SDA)
  145.   {
  146.       b++;
  147.           if(b>200)
  148.            {
  149.            SCL=0;  
  150.      delay10us();
  151.            return 0;
  152.    }
  153.   }
  154.   SCL=0;
  155.   delay10us();
  156.   return 1;
  157. }

  158. unsigned char I2cReadByte()                                    //用i2c读取一个数据
  159. {
  160.     unsigned char a=0,dat=0;
  161.         SDA=1;
  162.     delay10us();
  163.         for(a=0;a<8;a++)
  164.         {
  165.           
  166.            dat<<=1;
  167.            dat|=SDA;
  168.             delay10us();
  169.                 SCL=1;
  170.            delay10us();
  171.            SCL=0;
  172.            delay10us();       
  173.         }
  174.    return dat;
  175.    }

  176. void AT24c02Write(unsigned char addr,unsigned char dat)        //给at24c02写入一个数据

  177. {
  178.    I2cstart();
  179.    I2cSendByte(0xa0);                                           //发送写入器件的地址
  180.    I2cSendByte(addr);                                            //发送器件内储存数据的地址
  181.    I2cSendByte(dat);                                           //发送数据
  182.    i2cstop();
  183.    
  184. }

  185. unsigned char AT24c02Read(unsigned char addr)         //  dat-addr                                从at24c02读取一个数据
  186. {
  187.    unsigned char num;
  188.    I2cstart();                                   //起始型号
  189.    I2cSendByte(0xa0);                   //发送写入器件的地址
  190.    I2cSendByte(addr);                   //发送写入器件内数据的地址
  191.    I2cstart();                                   //反向读取
  192.    I2cSendByte(0xa1);                   //发送所要读取器件的地址
  193.    num=I2cReadByte();                 //(dat)-()
  194.    i2cstop();
  195.    return num;
  196. }





  197. //下面是I2C.H
  198. #ifndef _I2C_H_
  199. #define _I2C_H_
  200. #include<reg51.h>

  201. sbit SDA=P2^0;
  202. sbit SCL=P2^1;


  203. void I2cstart();  //起始信号
  204. void i2cstop();          //终止信号
  205. unsigned char I2cSendByte(unsigned char dat);          //用i2c发送一个数据
  206. unsigned char I2cReadByte();

  207. void AT24c02Write(unsigned char addr,unsigned char dat);
  208. unsigned char AT24c02Read(unsigned char addr);

  209. #endif


 楼主| 15383646831 发表于 2018-1-24 13:11 | 显示全部楼层
这是按下k2读取到的数字

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
Prry 发表于 2018-1-24 13:44 | 显示全部楼层
参考i2c封装代码,方便移动到不同单片机。http://blog.csdn.net/qq_20553613/article/details/78878211
fengfeng的恒 发表于 2018-1-24 13:45 | 显示全部楼层
希望楼主可以分布来找问题,看看到底是显示出问题呢?还是按键反应出问题呢?还是I2C通信的问题的,只保留一部分代码去调试问题吧。
ayb_ice 发表于 2018-1-24 15:22 | 显示全部楼层
读操作都没有应答或非应答信号
dirtwillfly 发表于 2018-1-24 19:27 | 显示全部楼层
建议单独调试iic,调试没问题再和按键等其他代码整合。
wushiye54 发表于 2018-1-31 13:47 | 显示全部楼层
84行改为:P0=pros[3-i];
wangfree 发表于 2019-4-25 21:49 | 显示全部楼层
楼主找到原因了吗?我也是,不管输入什么,按下k2数据始终为255
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部