找回密码
 立即注册

QQ登录

只需一步,快速开始

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

按键按下一次1602显示字符内容,断电后送电显示器1602继续显示停电前的字符内容

[复制链接]
跳转到指定楼层
楼主
ID:488631 发表于 2019-12-19 19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按对应按钮时1602显示对应字符内容,断电在送电又恢复初始状态,不能实现利用24c02读写达到断电保护的目的。请各位大佬指点一下小弟错在何处。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. uchar code table[]="I LOVE DIANZI";
  6. uchar code table1[]="   ABCD     ";
  7. uchar num,sec;
  8. sbit key1 = P3^0;
  9. sbit key2 = P3^1;
  10. sbit key3 = P3^2;
  11. sbit key4 = P3^3;
  12. /* sbit key5 = P3^4;
  13. sbit key6 = P3^5;
  14. sbit key7 = P3^6;
  15. sbit key8 = P3^7;*/
  16. sbit sda = P2^0;
  17. sbit scl = P2^1;
  18. bit write = 0;
  19. bit k1 = 0;
  20. bit k2 = 0;
  21. sbit lcdrs = P2^6;
  22. sbit lcdwr = P2^5;
  23. sbit lcden = P2^7;
  24. void delay1s(uint z)
  25. {
  26.   uint x,y;
  27.   for(x=z;x>0;x--)
  28.    for(y=110;y>0;y--);
  29. }
  30. void delay()
  31. {;;}
  32. void at_start()
  33. {
  34. sda = 1;
  35. delay();
  36. scl = 1;
  37. delay();
  38. sda = 0;
  39. delay();
  40. }
  41. void at_stop()
  42. {
  43. sda = 0;
  44. delay();
  45. scl = 1;
  46. delay();
  47. sda = 1;
  48. delay();
  49. }
  50. void at_respons()
  51. {
  52. uchar i;
  53. scl = 1;
  54. delay();
  55. while((sda==1)&&(i<255))i++;
  56. scl = 0;
  57. delay();
  58. }
  59. void at_init()
  60. {
  61. sda = 1;
  62. delay();
  63. scl = 1;
  64. delay();
  65. }
  66. void at_write_byte(uchar date)
  67. {
  68. uchar i,temp;
  69. temp =date;
  70. for(i=0;i<8;i++)
  71. {
  72.   temp=temp<<1;
  73.   scl = 1;
  74.   delay();
  75.   sda = CY;
  76.   delay();
  77.   scl = 1;
  78.   delay();
  79. }
  80. scl = 0;
  81. delay();
  82. sda = 1;
  83. delay();
  84. }
  85. uchar at_read_byte()
  86. {
  87. uchar i,k;
  88. scl = 0;
  89. delay();
  90. sda = 1;
  91. delay();
  92. for(i=0;i<8;i++)
  93. {
  94.   scl = 1;
  95.   delay();
  96.   k = (k<<1)|sda;
  97.   scl = 0;
  98.   delay();
  99.   }
  100.   return k;
  101. }
  102. void at_write_add(uchar address,uchar date)
  103. {
  104. at_start();
  105. at_write_byte(0xa0);
  106. at_respons();
  107. at_write_byte(address);
  108. at_respons();
  109. at_write_byte(date);
  110. at_respons();
  111. at_stop();
  112. }
  113. uchar at_read_add(uchar address)
  114. {
  115. uchar date;
  116. at_start();
  117. at_write_byte(0xa0);
  118. at_respons();
  119. at_write_byte(address);
  120. at_respons();
  121. at_start();
  122. at_write_byte(0xa1);
  123. at_respons();
  124. date=at_read_byte();
  125. at_stop();
  126. return date;
  127. }  
  128. bit lcd_busy()
  129. {
  130.   bit result;
  131.   lcdrs = 0;
  132.   lcdwr = 1;
  133.   lcden = 1;
  134.   delay();
  135.   delay();
  136.   delay();
  137.   result=(bit)(P0&0x80);
  138.   lcden = 0;
  139.   return(result);
  140.   }
  141. void lcd_send_com(uchar com)
  142. {
  143.   while(lcd_busy());
  144.   lcdrs = 0;
  145.   lcdwr = 0;
  146.   P0 = com;
  147.   delay1s(5);
  148.   lcden = 1;
  149.   delay1s(5);
  150.   lcden = 0;
  151.   }
  152. void lcd_send_data(uchar date)
  153. {
  154.   while(lcd_busy());
  155.   lcdrs = 1;
  156.   lcdwr = 0;
  157.   P0 = date;
  158.   delay1s(5);
  159.   lcden=1;
  160.   delay1s(5);
  161.   lcden=0;

  162.   }
  163. void lcd_init()
  164. {
  165. lcden = 0;
  166. lcdrs = 0;
  167. lcdwr = 0;
  168. lcd_send_com(0x38);
  169. lcd_send_com(0x0c);
  170. lcd_send_com(0x06);
  171. lcd_send_com(0x01);
  172. }
  173. uchar keyscan()
  174. {
  175.    
  176.   if(key1==0)
  177.   {
  178.    delay1s(5);
  179.    if(key1==0)
  180.    {
  181.    k1 = 1;
  182.    lcd_send_com(0x80);
  183.     for(num = 0;num<13;num++)
  184.      {
  185.       lcd_send_data(table[num]);
  186.      delay1s(5);
  187.   }   
  188. }  
  189. while(!key1);

  190.    
  191.   }

  192.    else if(key2==0)
  193.     {
  194.      delay1s(5);
  195.      if(key2==0)
  196.     {
  197.     k1 = 2;
  198.      lcd_send_com(0x80);
  199.        for(num = 0;num<13;num++)
  200.        {
  201.           lcd_send_data(table[num]);
  202.         delay1s(5);
  203.      }   
  204.   }
  205. while(!key2);
  206. }
  207.     return k1;
  208. }
  209. void displaychar()
  210. { uchar p1;

  211. p1=at_read_add(8);
  212. delay1s(20);
  213. if(p1==1)
  214. {
  215.   lcd_send_com(0x80);
  216.     for(num = 0;num<13;num++)
  217.      {
  218.       lcd_send_data(table[num]);
  219.      delay1s(5);
  220.   }
  221. }
  222. else if(p1==2)
  223. {
  224.   lcd_send_com(0x80);
  225.     for(num = 0;num<13;num++)
  226.      {
  227.       lcd_send_data(table1[num]);
  228.      delay1s(5);
  229.   }
  230. }

  231. }
  232. void main()
  233. {
  234.    at_init();
  235.    lcd_init();
  236.    displaychar();

  237. while(1)
  238. {
  239. keyscan();
  240.     at_write_add(8,k2);

  241. }
  242. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2019-12-20 08:24 | 只看该作者
全程无备注看得太眼花,提供点思路:
没存进的可能,没读出的可能,被初始化的可能。
回复

使用道具 举报

板凳
ID:661787 发表于 2019-12-21 10:03 | 只看该作者
建议写程序时给程序添加解释说明
回复

使用道具 举报

地板
ID:664105 发表于 2019-12-21 14:54 | 只看该作者
有条理的写程序,每一段要明白自己要干什么
回复

使用道具 举报

5#
ID:488631 发表于 2019-12-25 14:48 | 只看该作者
好的,谢谢各位大佬指教,我从新添加注释又发了,谢谢!
回复

使用道具 举报

6#
ID:437615 发表于 2019-12-25 17:09 | 只看该作者
你的板子有没有问题,有没有延时断电功能
回复

使用道具 举报

7#
ID:475247 发表于 2019-12-25 20:54 | 只看该作者
思路是这样的,你按键按下后让24c02记下按键值,开机后用24c02读出的值来执行显示任务,这样能起到开机恢复断电前画面。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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