找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1742|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

利用24c02存儲數(shù)字達(dá)到斷電保護(hù)LCD1602顯示程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:488631 發(fā)表于 2019-12-24 22:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1602斷電后再送電不能實現(xiàn),請各位大佬幫忙指點一下小弟,錯在哪里?

#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數(shù)據(jù)
sbit scl = P2^1;       //24c02時鐘
bit write = 0;       //寫24c02的標(biāo)志
/*sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3; */
sbit lcdrs = P2^6;      //1602數(shù)據(jù)/命令
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結(jié)束
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}
void at_respons()     //24c02應(yīng)答
{
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寫一個字節(jié)
{
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讀一個字節(jié)
{
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任意地址寫字節(jié)
{
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任意地址讀字節(jié)
{
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忙標(biāo)志
{
  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寫數(shù)據(jù)
{
  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讀數(shù)據(jù)賦值給sec
   
   
   lcd_send_com(0x80);     //指針位置
   
      lcd_send_data(sec);   //1602寫數(shù)據(jù)
   

while(1)
{
displaychar(keyscan());     //1602顯示內(nèi)容
sec= keyscan();        //將按鍵返回值賦值給sec
at_write_add(23,sec);delay1s(5); //將在24c02存儲器23位存儲數(shù)據(jù)sec的值
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:437615 發(fā)表于 2019-12-25 17:36 | 只看該作者
先問下你的板子有沒有這個功能
回復(fù)

使用道具 舉報

板凳
ID:488631 發(fā)表于 2019-12-27 20:27 | 只看該作者
板子上有24c02.按照調(diào)試程序可以用電腦讀24c02中寫入字符
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表