微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 1602液晶时钟+24C02

1602液晶时钟+24C02

时间:10-02 整理:3721RD 点击:
各位大师有个问题请教下,为什么我这个程序掉电后数据可以保存,但是到了60秒进位时候会出现乱码是怎么回事,24C02是这样保存数据的吗?
#include"main.h"
#include"lcd1602.h"
#include"74hc595.h"
#include"key.h"
#include"time.h"
#include "boardinit.h"
#include"24c02.h"
#include"lcd1602.h"
void main()
{
        lcdinit_1602();
          boardinit();
        time1();
            //shi=At24c02Read(3);
         //if(shi>24)
         //shi=0;
            // fen=At24c02Read(2);
        // if(fen>60)
        // fen=0;
         
         miao=At24c02Read(3);
         if(miao>60)
         miao=0;
        Disp_1602(1,1,"   2017-06-08   ",16);
        Disp_1602(1,2,"    22:06:59    ",16);
   
   while(1)
   {
        keyscan();
          //shi=At24c02Read(3);
         //write_dierhang_1602(5,shi);
          miao=At24c02Read(3);
         write_dierhang_1602(11,miao);
          fen=At24c02Read(2);
         write_dierhang_1602(8,fen);
         
   }        
         
}
#include"time.h"
#include"lcd1602.h"
#include"24c02.h"
#include"74hc595.h"
uchar time,shi,fen,miao;
void time1()
{
   TMOD=0X10;                   //设置定时器方式1(16位定时器)
   TH1=0X4c;                     //定时器高八位装初值
   TL1=0X00;                        //定时器低八位装初值   定时50ms
   ET1=1;                                        //允许定时器 1 产生中断
   TR1=1;                                                //启动定时器 1
   EA=1;                                                //外部中断 0初始化
   EX0=1;                                           // 开外部中断零,EX1=1; 就是开外部中断 0
   IT0=0;                                          // 请求P3.2 跳沿触发方式
}
void zd()interrupt 3
{
  TMOD=0X10;                //设置定时器方式1(16位定时器)
  TH1=0X4c;                        //定时器高八位装初值
  time++;
  if(time>=20)
  {
    time=0;
        miao++;
        if(miao==60)
        {
          miao=0;
          fen++;
          if(fen==60)
          {
           fen=0;
           shi++;
           if(shi==24)
           {
                   shi=0;
           }
                At24c02Write(1,shi);
          }
                At24c02Write(2,fen);  
        }
                At24c02Write(3,miao);            
  }
}
#include"24c02.h"
void Delay10us()
{
        unsigned char a,b;
        for(b=1;b>0;b--)
                for(a=2;a>0;a--);
}
void I2cStart()
{
        SDA=1;
        Delay10us();
        SCL=1;
        Delay10us();//建立时间是SDA保持时间>4.7us
        SDA=0;
        Delay10us();//保持时间是>4us
        SCL=0;                        
        Delay10us();               
}
void I2cStop()
{
        SDA=0;
        Delay10us();
        SCL=1;
        Delay10us();//建立时间大于4.7us
        SDA=1;
        Delay10us();               
}
unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。               
        for(a=0;a<8;a++)//要发送8位,从最高位开始
        {
                SDA=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
                dat=dat<<1;
                Delay10us();
                SCL=1;
                Delay10us();//建立时间>4.7us
                SCL=0;
                Delay10us();//时间大于4us               
        }
        SDA=1;
        Delay10us();
        SCL=1;
        while(SDA)//等待应答,也就是等待从设备把SDA拉低
        {
                b++;
                if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
                {
                        SCL=0;
                        Delay10us();
                        return 0;
                }
        }
        SCL=0;
        Delay10us();
        return 1;               
}
unsigned char I2cReadByte()
{
        unsigned char a=0,dat=0;
        SDA=1;                        //起始和发送一个字节之后SCL都是0
        Delay10us();
        for(a=0;a<8;a++)//接收8个字节
        {
                SCL=1;
                Delay10us();
                dat<<=1;
                dat|=SDA;
                Delay10us();
                SCL=0;
                Delay10us();
        }
        return dat;               
}
void At24c02Write(unsigned char addr,unsigned char dat)
{
        I2cStart();
        I2cSendByte(0xa0);//发送写器件地址
        I2cSendByte(addr);//发送要写入内存地址
        I2cSendByte(dat);        //发送数据
        I2cStop();
}
unsigned char At24c02Read(unsigned char addr)
{
        unsigned char num;
        I2cStart();
        I2cSendByte(0xa0); //发送写器件地址
        I2cSendByte(addr); //发送要读取的地址
        I2cStart();
        I2cSendByte(0xa1); //发送读器件地址
        num=I2cReadByte(); //读取数据
        I2cStop();
        return num;        
}

24C02是双地址的,不然会被刷掉的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top