主函數(shù)
#include<reg52.h>
#include<lcd.h>
#include<ds1302.h>
void LcdDisplay();
void main()
{
LcdInit(); //lcd初始化
Ds1302Init(); //Ds1302初始化
while(1)
{
Ds1302ReadTime();
LcdDisplay();
} //lcd顯示
}
void LcdDisplay()
{
LcdWriteCom(0x80); //第一行
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16);
LcdWriteData('0'+(TIME[6]&0x0f)); //年
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16);
LcdWriteData('0'+(TIME[4]&0x0f)); //月
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16);
LcdWriteData('0'+(TIME[3]&0x0f)); //日
LcdWriteCom(0x80+0x40); //第二行
LcdWriteData('0'+TIME[2]/16);
LcdWriteData('0'+(TIME[2]&0x0f)); //時(shí)
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16);
LcdWriteData('0'+(TIME[1]&0x0f)); //分
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16);
LcdWriteData('0'+(TIME[0]&0x0f)); //秒
LcdWriteData(' ');
LcdWriteData(' ');
}
lcd.c
#include<lcd.h>
void Lcd1602_Delay1ms(uint c) //延時(shí)函數(shù)
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
#ifndef LCD1602_4PINS //當(dāng)沒(méi)有定義這個(gè)LCD1602_4PINS的時(shí)候
void LcdWriteCom(uchar com) //寫(xiě)入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫(xiě)入
LCD1602_DATAPINS = com; //發(fā)送命令
Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
LCD1602_E = 1; //寫(xiě)入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //寫(xiě)入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //選擇寫(xiě)入命令
LCD1602_RW = 0; //選擇寫(xiě)入
LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫(xiě)入時(shí)序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
// Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //發(fā)送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫(xiě)入時(shí)序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //寫(xiě)入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫(xiě)入
LCD1602_DATAPINS = dat; //寫(xiě)入數(shù)據(jù)
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫(xiě)入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //寫(xiě)入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇寫(xiě)入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫(xiě)入
LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫(xiě)入時(shí)序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //寫(xiě)入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫(xiě)入時(shí)序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開(kāi)顯示
LcdWriteCom(0x0c); //開(kāi)顯示不顯示光標(biāo)
LcdWriteCom(0x06); //寫(xiě)一個(gè)指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //將8位總線轉(zhuǎn)為4位總線
LcdWriteCom(0x28); //在四位線下的初始化
LcdWriteCom(0x0c); //開(kāi)顯示不顯示光標(biāo)
LcdWriteCom(0x06); //寫(xiě)一個(gè)指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#endif
lcd.h
#ifndef __LCD_H_
#define __LCD_H_
//#define LCD1602_4PINS
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
void Lcd1602_Delay1ms(uint c); /*在51單片機(jī)12MHZ時(shí)鐘下的延時(shí)函數(shù)*/
void LcdWriteCom(uchar com); /*LCD1602寫(xiě)入8位命令子函數(shù)*/
void LcdWriteData(uchar dat); /*LCD1602寫(xiě)入8位數(shù)據(jù)子函數(shù)*/
void LcdInit(); /*LCD1602初始化子程序*/
#endif
ds1302.c
#include<ds1302.h>
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //DS1302寫(xiě)入和讀取時(shí)分秒的地址命令
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //秒分時(shí)日月周年 最低位讀寫(xiě)位
uchar TIME[7] = {0, 0, 0x12, 0x24, 0x11, 0x02, 0x18}; //DS1302時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
_nop_();
SCLK = 0; //先將SCLK置低電平
_nop_();
RST = 1; //然后將RST(CE)置高電平
_nop_();
for (n=0; n<8; n++) //開(kāi)始傳送八位地址命令
{
DSIO = addr & 0x01; //數(shù)據(jù)從低位開(kāi)始傳送
addr >>= 1;
SCLK = 1; //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++) //寫(xiě)入8位數(shù)據(jù)
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1; //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0;
_nop_();
}
RST = 0; //傳送數(shù)據(jù)結(jié)束
_nop_();
}
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0; //先將SCLK置低電平。
_nop_();
RST = 1; //然后將RST(CE)置高電平。
_nop_();
for(n=0; n<8; n++) //開(kāi)始傳送八位地址命令
{
DSIO = addr & 0x01; //數(shù)據(jù)從低位開(kāi)始傳送
addr >>= 1;
SCLK = 1; //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0; //DS1302下降沿時(shí),放置數(shù)據(jù)
_nop_();
}
_nop_();
for(n=0; n<8; n++) //讀取8位數(shù)據(jù)
{
dat1 = DSIO; //從最低位開(kāi)始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0; //DS1302下降沿時(shí),放置數(shù)據(jù)
_nop_();
}
RST = 0;
_nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止寫(xiě)保護(hù),就是關(guān)閉寫(xiě)保護(hù)功能
for (n=0; n<7; n++)//寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打開(kāi)寫(xiě)保護(hù)功能
}
void Ds1302ReadTime() //讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
{
uchar n;
for (n=0; n<7; n++)
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
ds1302.h
#ifndef __DS1302_H_
#define __DS1302_H_
#include<reg52.h>
#include<intrins.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();
extern uchar TIME[7]; //加入全局變量
#endif
|