LCD1602显示秒会跳变...求大神!
时间:10-02
整理:3721RD
点击:
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();
}
}
#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();
}
}
不错的资料,值得分享