#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit SCLK = P1^6; //*實時時鐘時鐘線引腳
sbit IO = P3^5; //*實時時鐘數(shù)據(jù)線引腳
sbit RST = P1^7; //*實時時鐘復位線引腳
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void delay()
{
uint x,y;
for(x=10;x>0;x--)
for(y=2;y>0;y--);
}
/********************************************************************
* 名稱 : Convert(uchar In_Date)
* 功能 : 因為電路設(shè)計時,P0.0--P0.7接法剛好了資料中的相反,所以設(shè)計該函數(shù)。
* 輸入 : 1602資料上的值
* 輸出 : 送到1602的值
***********************************************************************/
uchar convert(uchar In_Date)
{
uchar i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
/********************************************************************
* 名稱 : enable(uchar del)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void enable(uchar com)
{
P0=convert(com);
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
/********************************************************************
* 名稱 : write(uchar del)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write(uchar date)
{
P0=convert(date);
RS=1;
RW=0;
E=0;
delay();
E=1;
delay();
}
/********************************************************************
* 名稱 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調(diào)用該函數(shù)如下
L1602_char(1,5,'b')
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
void init_1602()
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
}
void input_1302(uchar dat) //向1302中寫入1bytes數(shù)據(jù)
{
uchar i;
ACC=dat;
RST=1;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC>>=1;
}
}
uchar output_1302() //1302輸出1bytes數(shù)據(jù)
{
uint i;
RST=1;
for(i=8;i>0;i--)
{
ACC>>=1;
ACC7=IO;
SCLK=1;
SCLK=0;
}
return ACC;
}
void write_1302(uchar address,uchar date) //向1302某地址寫入1bytes數(shù)據(jù)
{
RST=0;
SCLK=0;
RST=1;
input_1302(address);
_nop_();
_nop_();
input_1302(date);
SCLK=1;
RST=0;
}
uchar read_1302(uchar address) //從1302讀出1bytes數(shù)據(jù)
{
uchar date;
RST=0;
SCLK=0;
RST=1;
input_1302(address);
_nop_();
_nop_();
date=output_1302();
SCLK=1;
RST=0;
return date;
}
uchar BCD_to_DEC(uchar bcd) //二進制轉(zhuǎn)換成十進制
{
uchar data1;
data1 = bcd & 0x0f; //取BCD低4位
bcd = bcd & 0x70; //剔除BCD的最高位和低4位。
data1 += bcd >> 1;
data1 += bcd >> 3; //用位移代替乘法運算
return data1;
}
void init_1302() //往DS1302中寫入數(shù)據(jù)
{
write_1302(0x8e,0);
write_1302(0x80,0x50);//寫入秒
write_1302(0x82,0x59);//寫入分
write_1302(0x84,0x07);//寫入小時
write_1302(0x86,0x08);//寫入日
write_1302(0x88,0x08);//寫入月
write_1302(0x8a,0x05);//寫入星期
write_1302(0x8c,0x08);//寫入年
}
void display_1302() //讀時間并送1602顯示
{
uchar sec,min,hour,day,month,year;
while(1)
{
write_1302(0x8f,0);
sec=BCD_to_DEC(read_1302(0x81));
min=BCD_to_DEC(read_1302(0x83));
hour=BCD_to_DEC(read_1302(0x85));
day=BCD_to_DEC(read_1302(0x87));
month=BCD_to_DEC(read_1302(0x89));
year=BCD_to_DEC(read_1302(0x8d));
L1602_char(2, 6, hour/10 + 48);
L1602_char(2, 7, hour%10 + 48);
L1602_char(2, 8, ':');
L1602_char(2, 9, min/10 + 48);
L1602_char(2, 10, min%10 + 48);
L1602_char(2, 11, ':');
L1602_char(2, 12, sec/10 + 48);
L1602_char(2, 13, sec%10 + 48);
L1602_char(1, 8, year/10 + 48);
L1602_char(1, 9, year%10 + 48);
L1602_char(1, 10, '-');
L1602_char(1, 11, month/10 + 48);
L1602_char(1, 12, month%10 + 48);
L1602_char(1, 13, '-');
L1602_char(1, 14, day / 10 + 48);
L1602_char(1, 15, day % 10 + 48);
}
}
void main()
{
init_1602();
init_1302();
display_1302();
}
你的顯示程序都沒有啊 老兄
秒的最高位沒有置0
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |