LCD1602显示秒会跳变...求大神!

2019-07-15 21:37发布

LCD1602结合DS1302显示时间,隔2~3秒,秒显示会突然加快...实在不解啊  看程序吧:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uint t;
int shi=23,fen=3,miao=22,nian=13,yue=11,ri=19;
uchar shijian[16]={"time  00-00-00 t"},shijian1[16]={"date  00-00-00  "};
sbit E=P2^7;        //1602使能引脚
sbit RW=P2^5;       //1602读写引脚  
sbit RS=P2^6;       //1602数据/命令选择引脚
sbit SDA=P3^4;         //DS1302数据线
sbit CLK=P3^6;         //DS1302时钟线
sbit RST=P3^5;
uchar Current_Time[6];//时间数组
//*--------写字节函数,向DS1302写入一个字节--------*//
void Write_Byte_TO_DS1302(uchar X)    // 向DS1302写入一个字节
  {
     uchar i;
         for(i=0;i<8;i++)
           {
             SDA=X&1;
                 CLK=1;
                 CLK=0;
                 X>>=1;
           }
  }
//*--------读字节函数,从DS1302读取一个字节--------*//
uchar Read_Byte_FROM_DS1302()
{
   uchar i,byte,t;
   for(i=0;i<8;i++)
     {
          byte>>=1;
          t=SDA;
          byte|=t<<7;
          CLK=1;
          CLK=0;
         }
         return byte/16*10+byte%16;         //BCD码转换
}
//-------------------------------------------------------------
//从DS1302指定位置读取数据        , 读数据
//---------------------------------------------------------------
uchar Read_Data_FROM_DS1302(uchar addr)
   {
     uchar dat;
         RST=0;
         CLK=0;
         RST=1;
         Write_Byte_TO_DS1302(addr);  //向DS1302写入一个地址
         dat=Read_Byte_FROM_DS1302(); //在上面写入的地址中读取数据
         CLK=1;
         RST=0;
         return dat;
   }
//-------------------------------------------------------------
//向DS1302指定位置写入数据, 写数据
//---------------------------------------------------------------
/* void Write_Data_TO_DS1302(uchar addr,uchar dat)
  {
       CLK=0;
           RST=1;
           Write_Byte_TO_DS1302(addr);
           Write_Byte_TO_DS1302(dat);
           CLK=1;
           RST=0;
  }*/
//-------------------------------------------------------------
//读取当前时间,年月日,小时、分钟、秒钟
//---------------------------------------------------------------
void GET_Time()   
{
     Current_Time[0] =Read_Data_FROM_DS1302(0x81);          //读取当前时间秒
          Current_Time[1] =Read_Data_FROM_DS1302(0x83);          //读取当前时间分钟
          Current_Time[2] =Read_Data_FROM_DS1302(0x85);           //读取当前时间时钟
          Current_Time[3] =Read_Data_FROM_DS1302(0x87);           //读取当前时间日
          Current_Time[4] =Read_Data_FROM_DS1302(0x89);                //读取当前时间月
          //Current_Time[5] =Read_Data_FROM_DS1302(0x8B);           //读取当前时间星期
          Current_Time[5] =Read_Data_FROM_DS1302(0x8D);           //读取当前时间秒年
}         
//---------------------------------------------------------------------
//设置时间函数,当需要调整时间时,需要把调整好的时间写入时间缓冲数组中
//---------------------------------------------------------------------
/*void SET_Time()
{
       Write_Data_TO_DS1302(0x8e,0x00) ;   //写控制字,取消写保护
                Write_Data_TO_DS1302(0x80,(Current_Time[0]/10<<4)|( Current_Time[0]%10));
           Write_Data_TO_DS1302(0x82,(Current_Time[1]/10<<4)|( Current_Time[1]%10)); //写入分钟
           Write_Data_TO_DS1302(0x84,(Current_Time[2]/10<<4)|( Current_Time[2]%10)); //写入时钟
                Write_Data_TO_DS1302(0x86,(Current_Time[3]/10<<4)|( Current_Time[3]%10));
                Write_Data_TO_DS1302(0x88,(Current_Time[4]/10<<4)|( Current_Time[4]%10));
                Write_Data_TO_DS1302(0x8C,(Current_Time[5]/10<<4)|( Current_Time[5]%10));
           Write_Data_TO_DS1302(0x8e,0x80);  //加保护
}*/
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
   uint n=250;

   while(n--);
}
/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
bit Busy(void)
{
    bit busy_flag = 0;
    RS = 0;
    RW = 1;
    E = 1;
    delay();
    busy_flag = (bit)(P0 & 0x80);
    E = 0;
    return busy_flag;
}
/********************************************************************
* 名称 : wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void wcmd(uchar del)
{
    while(Busy());
    RS = 0;
    RW = 0;
    E = 0;
    delay();
    P0 = del;
    delay();
    E = 1;
    delay();
    E = 0;
}
/********************************************************************
* 功能 : 1602写数据函数
***********************************************************************/
void wdata(uchar del)
{
    while(Busy());
    RS = 1;
    RW = 0;
    E = 0;
    delay();
    P0 = del;
    delay();
    E = 1;
    delay();
    E = 0;
}
/********************************************************************
* 功能 : 1602初始化
***********************************************************************/
void L1602_init(void)
{
    wcmd(0x38);
    wcmd(0x0c);
    wcmd(0x06);
    wcmd(0x01);
}
/******************************
****时间显示
*******************************/
void Display()
{
                        uint i;
                   shijian[6]=Current_Time[2]/10+48;
        shijian[7]=Current_Time[2]%10+48;
        shijian[9]=Current_Time[1]/10+48;
        shijian[10]=Current_Time[1]%10%10+48;
        shijian[12]=Current_Time[0]/10+48;
        shijian[13]=Current_Time[0]%10+48;
        shijian[8]=45;
        shijian[11]=45;
        shijian[15]=t+48;

        shijian1[6]=Current_Time[5]/10+48;
        shijian1[7]=Current_Time[5]%10+48;
        shijian1[9]=Current_Time[4]/10+48;
        shijian1[10]=Current_Time[4]%10+48;
        shijian1[12]=Current_Time[3]/10+48;
        shijian1[13]=Current_Time[3]%10+48;
        shijian1[8]=45;
        shijian1[11]=45;

                for(i=0;i<16;i++)
            {               
            wcmd(0xc0+i);
            wdata(shijian[i]);
            wcmd(0x80+i);
            wdata(shijian1[i]);
                }
}
void Main()
{        

        L1602_init();
        while(1)
        {        GET_Time();
                Display();
        }

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。