|
#include"reg52.h"
#include "DS1302.h"
#include "LCD1602.h"
uint x;
extern void delay10us(void) //誤差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=1;a>0;a--);
}
uchar DS1302_ZhiLing_DuQu(uchar dat) //指令,讀取
{
uchar K;
DS1302_RST=0; //RST置零
DS1302_SCLK=0;//脈沖置零
DS1302_RST=1; //0x80=10000000開放RST
delay10us();
for(x=0;x<=7;x++) //寫指令//將8位字節用高低電平方式表現出來
{
delay10us();
if(dat & 0x01)
{DS1302_IO =1;}
else
{DS1302_IO =0;}
DS1302_SCLK=1;
delay10us();
DS1302_SCLK=0;
dat>>=1; }
for(x=0;x<=7;x++) //讀數據 //高低電平方儲存將一個字節中
{
K>>=1; //必須在前面,只移位7次不是8次,從第0移到7;不能移位8次
delay10us();
if(DS1302_IO)
{K|=0x80;}
DS1302_SCLK=1;
delay10us();
DS1302_SCLK=0;
delay10us();
}
DS1302_RST=0;
return K;
}
void DS1302_ZhiLing_XieRu(uchar ZhiLing,uchar ShuJu) //指令,寫入數據
{
DS1302_RST=0; //RST置零
DS1302_SCLK=0;//脈沖置零
delay10us();;
DS1302_RST=1;
delay10us();
for(x=0;x<=7;x++) //寫指令
{
delay10us();
if(ZhiLing & 0x01) //將8位字節用高低電平方式表現出來
{DS1302_IO =1;}
else
{DS1302_IO =0;}
DS1302_SCLK=1;
delay10us();
DS1302_SCLK=0;
ZhiLing>>=1;
}
for(x=0;x<=7;x++) //寫數據
{
delay10us();
if(ShuJu & 0x01) //將8位字節用高低電平方式表現出來
{DS1302_IO =1;}
else
{DS1302_IO =0;}
DS1302_SCLK=1;
delay10us();
DS1302_SCLK=0;
ShuJu >>= 1;
}
delay10us();
DS1302_RST=0;
}
void DS1302_LCD1602_DuQU(uchar MingLing)//數據處理
{
uchar GeiWei,ShiWei,x;
uchar ShuZi1[]="0123456789";
x=DS1302_ZhiLing_DuQu(MingLing);// 將命令指令轉換成讀取命令
if(MingLing==0x8B) //針對星期,星期用4位BCD可以應付
{
GeiWei=x&0x0f;
GeiWei=GeiWei%10;
LCD1602_XieShuJu(ShuZi1[GeiWei]); }
else
{
GeiWei=x&0x0f; //必要提取低4位字節
GeiWei=GeiWei%10; //取余,提取數字
ShiWei=x>>4; //提取高4位字節
ShiWei=ShiWei%10; //取余,提取數字
LCD1602_XieShuJu(ShuZi1[GeiWei]);
LCD1602_XieShuJu(ShuZi1[ShiWei]);
}
}
//2020-04-26 00:00:00
void DS1302_ChuShiHua() //DS1302初始化
{ //2020-04-26 星期7 00:00:00
char DS1302_ChuShiShuJu[]={0x20,0x04,0x26,0x07,0x00,0x00,0x00};//初始數據
DS1302_ZhiLing_XieRu(0x8e,0x00); //關閉寫入保護
DS1302_ZhiLing_XieRu(0x80,0x80); //暫停運行
DS1302_ZhiLing_XieRu(Nian, DS1302_ChuShiShuJu[0]); //年份
DS1302_ZhiLing_XieRu(Yue, DS1302_ChuShiShuJu[1]); //月
DS1302_ZhiLing_XieRu(Ri, DS1302_ChuShiShuJu[2]); //日
DS1302_ZhiLing_XieRu(XingQi, DS1302_ChuShiShuJu[3]);//星期7
DS1302_ZhiLing_XieRu(XiaoShi, DS1302_ChuShiShuJu[4]); //小時
DS1302_ZhiLing_XieRu(FenZhong,DS1302_ChuShiShuJu[5]); //分鐘
DS1302_ZhiLing_XieRu(miao, DS1302_ChuShiShuJu[6]); //秒
DS1302_ZhiLing_XieRu(0x8e,0x80); //開啟寫入保護
}
void DS1302_KaiShiYunXing()//開始運行
{
LCD1602_ShuRuMoShi(0,0);
LCD1602_WeiXuanXianShi(2,15);
DS1302_LCD1602_DuQU(0x81);
delay10us();
LCD1602_WeiXuanXianShi(2,12);
DS1302_LCD1602_DuQU(0x83);
LCD1602_WeiXuanXianShi(2,9);
DS1302_LCD1602_DuQU(0x85);
LCD1602_WeiXuanXianShi(2,5);
DS1302_LCD1602_DuQU(0x8B);
LCD1602_WeiXuanXianShi(1,9);
DS1302_LCD1602_DuQU(0x87);
LCD1602_WeiXuanXianShi(1,6);
DS1302_LCD1602_DuQU(0x89);
LCD1602_WeiXuanXianShi(1,3);
DS1302_LCD1602_DuQU(0x8D);
}
|
|