LCD1602結(jié)合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數(shù)據(jù)/命令選擇引腳
sbit SDA=P3^4; //DS1302數(shù)據(jù)線
sbit CLK=P3^6; //DS1302時鐘線
sbit RST=P3^5;
uchar Current_Time[6];//時間數(shù)組
//*--------寫字節(jié)函數(shù),向DS1302寫入一個字節(jié)--------*//
void Write_Byte_TO_DS1302(uchar X) // 向DS1302寫入一個字節(jié)
{
uchar i;
for(i=0;i<8;i++)
{
SDA=X&1;
CLK=1;
CLK=0;
X>>=1;
}
}
//*--------讀字節(jié)函數(shù),從DS1302讀取一個字節(jié)--------*//
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碼轉(zhuǎn)換
}
//-------------------------------------------------------------
//從DS1302指定位置讀取數(shù)據(jù) , 讀數(shù)據(jù)
//---------------------------------------------------------------
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(); //在上面寫入的地址中讀取數(shù)據(jù)
CLK=1;
RST=0;
return dat;
}
//-------------------------------------------------------------
//向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
//---------------------------------------------------------------
/* 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); //讀取當前時間秒年
}
//---------------------------------------------------------------------
//設置時間函數(shù),當需要調(diào)整時間時,需要把調(diào)整好的時間寫入時間緩沖數(shù)組中
//---------------------------------------------------------------------
/*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)
* 功能 : 這個是一個讀狀態(tài)函數(shù),讀出函數(shù)是否處在忙狀態(tài)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
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命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void wcmd(uchar del)
{
while(Busy());
RS = 0;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
* 功能 : 1602寫數(shù)據(jù)函數(shù)
***********************************************************************/
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();
}
}
|