找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3149|回复: 2
打印 上一主题 下一主题
收起左侧

单片机读取eeprom里面的内容 大神帮忙看一下啊,为什么没办法显示0

[复制链接]
跳转到指定楼层
楼主
ID:227434 发表于 2017-9-29 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序目的 0-9,传入eeprom后,读取eeprom里面的内容,显示到LCD1602里面,但是没办法显示0求解释:
         
  1. #include <reg52.h>
  2. #include "intrins.h"
  3. /*-----------------------宏定义----------------*/
  4. #define uint  unsigned int
  5. #define uchar unsigned char
  6. #define RS_LOW  RS=0
  7. #define RS_HIGH RS=1
  8. #define RW_LOW RW=0
  9. #define RW_HIGH RW=1
  10. #define EN_LOW EN=0
  11. #define EN_HIGH EN=1
  12. #define Read_ATadd 0xa1
  13. #define Write_ATadd 0xa0

  14. /***************设置特殊功能寄存器位变量**********/
  15. sbit SDA = P2^0;
  16. sbit SCL = P2^1;
  17. sbit RS = P1^0;
  18. sbit RW = P1^1;
  19. sbit EN = P2^5;
  20. sbit DU = P2^6;
  21. sbit WE = P2^7;
  22. /***************设置特殊功能寄存器位变量**********/
  23. Check_Busy();
  24. /*-----------------------宏定义----------------*/
  25. //unsigned char display[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//读入的是ASCII码,{"0123456789abcdef"}差别是什么?
  26.   unsigned char display[] =        {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}        ;
  27. /*-----------------------定时函数----------------*/
  28. void delay1ms()
  29. {
  30.          uchar i,j;
  31.         for(i=0;i<10;i++)
  32.                 for(j=0;j<33;j++);
  33. }

  34. void dalaynms(uchar n)
  35. {
  36.         while(n--)
  37.           {
  38.                   delay1ms();
  39.           }
  40. }
  41. /*-----------------------定时函数----------------*/

  42. /*---------------写指令-----------------------*/
  43. void WrAdress(uchar a)
  44. {
  45.         while(Check_Busy());
  46.         RS_LOW;
  47.         RW_LOW;
  48.         EN_HIGH;
  49.         dalaynms(1);
  50.     P0=a;
  51.         EN_LOW;

  52. }
  53. /*---------------写指令-----------------------*/

  54. /*---------------写数据-----------------------*/
  55. void WrData(uchar a)
  56. {
  57.         while(Check_Busy());
  58.         RS_HIGH;
  59.         RW_LOW;
  60.         EN_HIGH;
  61.         dalaynms(1);
  62.     P0=a;
  63.         EN_LOW;

  64. }
  65. /*---------------写数据-----------------------*/

  66. /*---------------读忙指令-----------------------*/
  67. Check_Busy()
  68. {        
  69.         uchar a;
  70.         P0 = 0xff;
  71.         
  72.         RS_LOW;
  73.         RW_HIGH;
  74.         EN_LOW;
  75.         dalaynms(1);
  76.         EN_HIGH;
  77.         a = P0;        
  78.         return (bit)(a&0x80);               
  79. }
  80. /*---------------读忙指令-----------------------*/

  81. /*---------------写字符数据-----------------------*/
  82. void Lcd1602_Wrchar(uchar x,uchar y,uchar z)//定义为行标志,y定义为是第几位,z定义为这个是字符串还是字符
  83. {
  84.         
  85.         if(x==0)
  86.         {
  87.                 WrAdress(0x80 +y);
  88.         }
  89.                 else                        
  90.                          WrAdress(0xC0 +y);                                                        
  91.                         WrData(z);
  92.                         WrAdress(0x0c);                        
  93.         
  94. }
  95. /*---------------写字符数据-----------------------*/

  96. /*-----------------------start----------------*/
  97. void start()
  98. {
  99.           SCL = 1;
  100.          SDA = 1;
  101.          _nop_();
  102.          _nop_();
  103.          _nop_();
  104.          _nop_();
  105.          _nop_();
  106.          SDA = 0;
  107.          _nop_();
  108.          _nop_();
  109.          _nop_();
  110.          _nop_();
  111.          _nop_();
  112.          SCL = 0;//允许SDA进行变化
  113. }
  114.   /*-----------------------start----------------*/

  115.    /*-----------------------stop----------------*/
  116. void stop()
  117. {
  118.          SDA = 0;
  119.         SCL = 1;
  120.         _nop_();
  121.         _nop_();
  122.         _nop_();
  123.         _nop_();
  124.         _nop_();
  125.         SDA = 1;
  126.         _nop_();
  127.         _nop_();
  128.         _nop_();
  129.         _nop_();
  130.         _nop_();
  131. }
  132.    /*-----------------------stop----------------*/
  133. /*-----------------------应答----------------*/
  134. AT24C02_ack()
  135. {
  136.         bit ack;
  137.         SDA = 1;
  138.         _nop_();
  139.         _nop_();
  140.         SCL =1;
  141.         _nop_();
  142.         _nop_();
  143.         _nop_();
  144.         _nop_();
  145.         _nop_();
  146.         ack = SDA;
  147.         SCL =0;
  148. //        while(ack);
  149.         return ack;        
  150. }
  151. /*-----------------------应答----------------*/

  152.    /*-----------------------读一个字节----------------*/
  153. At24c02_Read_bit()
  154. {                        
  155.         uchar i,x;
  156.         for(i =0;i<8;i++)
  157.    {
  158.                    SCL =1;
  159.                 x = (x<<1)|(uchar)SDA;
  160.                 SCL =0;//允许SDA进行变化        
  161.    }
  162.    return(x);
  163. }
  164. /*-----------------------读一个字节----------------*/

  165. /*-----------------------写一个字节----------------*/
  166. void At24c02_write_bit(uchar y)
  167. {                        
  168.         uchar i;
  169.         for(i=0;i<8;i++)
  170.         {
  171.                 SDA = (bit)(y&0x80);
  172.                 _nop_();
  173.                 y<<=1;
  174.                 SCL =1;
  175.                 _nop_();
  176.                 _nop_();
  177.                 SCL = 0;
  178.         }
  179. }
  180. /*-----------------------写一个字节----------------*/


  181. void init()
  182. {
  183.         SDA = 1;
  184.         SCL = 1;

  185.         WE = 1;
  186.         P0 = 0xff;
  187.         WE = 0;

  188.         WrAdress(0x01);//清屏同时,数据指针也会清零即变成0x80;
  189.         WrAdress(0x38);        //设置 16×2 显示,5×7 点阵,8 位数据接口
  190.         WrAdress(0x0f);        // 显示(1 有效)、C 光标显示(1 有效)、B 光标闪烁(1 有效)
  191.         WrAdress(0x06);//读或写一个字符后地址指针加 1 &光标加 1                        
  192. }
  193. /*-----------------------在特定位置读字节----------------*/
  194. At24c02_Read(uchar add)
  195. {
  196.          uchar date;
  197.          start();
  198.          At24c02_write_bit(Write_ATadd);
  199.          AT24C02_ack();        
  200.          At24c02_write_bit(add);
  201.          AT24C02_ack();
  202.          start();
  203.          At24c02_write_bit(Read_ATadd);
  204.          AT24C02_ack();         
  205.            date = At24c02_Read_bit();
  206.          stop();
  207.          return(date);                  
  208. }
  209. /*-----------------------在特定位置读字节----------------*/

  210. /*-----------------------在特定位置写字节----------------*/
  211. void At24c02_write(uchar x,uchar addr )
  212. {
  213.         start();
  214.         At24c02_write_bit(Write_ATadd);
  215.         AT24C02_ack();
  216.         At24c02_write_bit(addr);
  217.         AT24C02_ack();
  218.         At24c02_write_bit(x);
  219.         AT24C02_ack();
  220.         stop();
  221. }

  222. void main()
  223. {        
  224.         uchar i,j;        
  225.         init();        
  226.                    while(1)
  227.                 {
  228.                         for(i=0;i<10;i++)
  229.                         {
  230.                                 At24c02_write(display[i],i);
  231.                         }
  232.                         
  233.                         for(i=0;i<10;i++)
  234.                         {        
  235.                                 j = At24c02_Read(i);               
  236.                                 Lcd1602_Wrchar(0,8,j);
  237.                                 dalaynms(200);
  238.                                 dalaynms(200);
  239.                                 dalaynms(200);
  240.                         
  241.                 }
  242.                 }
  243. }
  244.       
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:232869 发表于 2017-9-30 09:09 | 只看该作者
你读取eeprom的数据对了没有 你先单步调试 看看读写的 数据是不是正确的  然后再看显示的部分  
慢慢来很好解决的
单片机一定要会调试程序查找原因
回复

使用道具 举报

板凳
ID:227434 发表于 2017-9-30 18:30 来自手机 | 只看该作者
caoxiaoyong 发表于 2017-9-30 09:09
你读取eeprom的数据对了没有 你先单步调试 看看读写的 数据是不是正确的  然后再看显示的部分  
慢慢来很 ...

单步调试,在哪儿能看到eeprom的内容,这个是外部的eeprom,所以不知道在哪能看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表