找回密码
 立即注册

QQ登录

只需一步,快速开始

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

利用24c02存储数字达到断电保护LCD1602显示程序问题

[复制链接]
跳转到指定楼层
楼主
ID:488631 发表于 2019-12-24 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1602断电后再送电不能实现,请各位大佬帮忙指点一下小弟,错在哪里?

#include<reg52.h>   //头文件
#include<intrins.h>  //头文件
#define uchar unsigned char //宏定义
#define uint  unsigned int  //宏定义
uchar code table[]="I LOVE DIANZI"; //定义编码
uchar code table1[]="   ABCD     ";  //定义编码
uchar code table2[]="DIANZI LOVE I"; //定义编码
uchar code table3[]="     DCBA   ";  //定义编码
uchar num,sec,sce,tcnt;
sbit key1 = P3^0;     //按键一
sbit key2 = P3^1;     //按键二
sbit key3 = P3^2;     //按键三
sbit key4 = P3^3;     //按键四
/* sbit key5 = P3^4;
sbit key6 = P3^5;
sbit key7 = P3^6;
sbit key8 = P3^7;*/
sbit sda = P2^0;      //24c02数据
sbit scl = P2^1;       //24c02时钟
bit write = 0;       //写24c02的标志
/*sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3; */
sbit lcdrs = P2^6;      //1602数据/命令
sbit lcdwr = P2^5;      //1602写/读
sbit lcden = P2^7;       //1602使能
void delay1s(uint z)    //延时
{
  uint x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void delay()     //延时
{;;}
void at_start()    //24c02开始
{
sda = 1;
delay();
scl = 1;
delay();
sda = 0;
delay();
}
void at_stop()      //24c02结束
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}
void at_respons()     //24c02应答
{
uchar i;
scl = 1;
delay();
while((sda==1)&&(i<255))i++;
scl = 0;
delay();
}
void at_init()    //24c02初始化
{
sda = 1;
delay();
scl = 1;
delay();
}
void at_write_byte(uchar date)    //24c02写一个字节
{
uchar i,temp;
temp =date;
for(i=0;i<8;i++)
{
  temp=temp<<1;
  scl = 1;
  delay();
  sda = CY;
  delay();
  scl = 1;
  delay();
}
scl = 0;
delay();
sda = 1;
delay();
}
uchar at_read_byte()      //24c02读一个字节
{
uchar i,k;
scl = 0;
delay();
sda = 1;
delay();
for(i=0;i<8;i++)
{
  scl = 1;
  delay();
  k = (k<<1)|sda;
  scl = 0;
  delay();
  }
  return k;
}
void at_write_add(uchar address,uchar date)    //24c02任意地址写字节
{
at_start();
at_write_byte(0xa0);
at_respons();
at_write_byte(address);
at_respons();
at_write_byte(date);
at_respons();
at_stop();
delay1s(5);
}
uchar at_read_add(uchar address)     //24c02任意地址读字节
{
uchar date;
at_start();
at_write_byte(0xa0);
at_respons();
at_write_byte(address);
at_respons();
at_start();
at_write_byte(0xa1);
at_respons();
date=at_read_byte();
at_stop();
delay1s(5);
return date;
}  
bit lcd_busy()       //1602忙标志
{
  bit result;
  lcdrs = 0;
  lcdwr = 1;
  lcden = 1;
  delay();
  delay();
  delay();
  result=(bit)(P0&0x80);
  lcden = 0;
  return(result);
  }
void lcd_send_com(uchar com)     //1602命令
{
  while(lcd_busy());
  lcdrs = 0;
  lcdwr = 0;
  P0 = com;
  delay1s(5);
  lcden = 1;
  delay1s(5);
  lcden = 0;
  }
void lcd_send_data(uchar date)      //1602写数据
{
  while(lcd_busy());
  lcdrs = 1;
  lcdwr = 0;
  P0 = date;
  delay1s(5);
  lcden=1;
  delay1s(5);
  lcden=0;

  }
void lcd_init()    //1602初始化
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
lcd_send_com(0x38);
lcd_send_com(0x0c);
lcd_send_com(0x06);
lcd_send_com(0x01);
}
uchar keyscan()    //键查询
{
   
  if(key1==0)
  {
   delay1s(5);
   if(key1==0)
   {
   return 1;
  /* lcd_send_com(0x80);
    for(num = 0;num<13;num++)
     {
      lcd_send_data(table[num]);
     delay1s(5);
  }*/   
}  
while(!key1);

   
  }

   else if(key2==0)
    {
     delay1s(5);
     if(key2==0)
    {
return 2;
     
  }
while(!key2);
   
  
}
   
   
  else if(key3==0)
  {
   delay1s(5);
   if(key3==0)
   {
    return 3;
   
}
while(!key3);

}

   else if(key4==0)
    {
     delay1s(5);
     if(key4==0)
    {
     return 4;

  }
while(!key4);

    }
return 0;  
}
void displaychar(uchar n)   //1602显示
{
switch(n)
{
case  1:
  lcd_send_com(0x80);
    for(num = 0;num<13;num++)
     {
      lcd_send_data(table[num]);
     delay1s(5);
  }    break;
  case 2:     
     lcd_send_com(0x80+40);
     for(num = 0;num<11;num++)
     {
      lcd_send_data(table1[num]);
     delay1s(5);
  }   break;
  case 3:
     lcd_send_com(0x80);
      for(num = 0;num<11;num++)
      {
      lcd_send_data(table2[num]);
     delay1s(5);
  }   break;
  case  4:
  lcd_send_com(0x80+40);
    for(num = 0;num<11;num++)
     {
      lcd_send_data(table3[num]);
     delay1s(5);
  }  break;
  default: break;
}
}
void main()    //主程序
{
   at_init();
   lcd_init();
   sec=at_read_add(23);    //将24c02读数据赋值给sec
   
   
   lcd_send_com(0x80);     //指针位置
   
      lcd_send_data(sec);   //1602写数据
   

while(1)
{
displaychar(keyscan());     //1602显示内容
sec= keyscan();        //将按键返回值赋值给sec
at_write_add(23,sec);delay1s(5); //将在24c02存储器23位存储数据sec的值
}
}

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

使用道具 举报

沙发
ID:437615 发表于 2019-12-25 17:36 | 只看该作者
先问下你的板子有没有这个功能
回复

使用道具 举报

板凳
ID:488631 发表于 2019-12-27 20:27 | 只看该作者
板子上有24c02.按照调试程序可以用电脑读24c02中写入字符
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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