利用字符型LCD1602和时钟芯片DS1302,显示年月日星期时分秒信息。求解啊。求解。大家多多帮忙啊。。

如题所述

#include"DS1302.h"
#include <at89x52.h>
/*DS1302
寄存器命令字(读,写)取值范围各位内容(7~0)
读写
秒80H81H00~59CH(7)10SEC(6~4)SEC(3~0)
分82H83H00~590(7)10MIN(6~4)MIN(3~0)
时84H85H 00~12 00~2412/24(7)0(6)10/AP(5~4) HR(3~0)
日86H87H01~28,29,39,310(7),0(6),10DATE(5~4)DATE(3~0)
月88H89H01~120(7),0(6),0(5),10M(4),MONTH(3~0)
星期8AH8BH01~070(7),0(6),0(5),0(4),DAY(3~0)
年8CH8DH01~9919YEAE(7~4)YEAR(3~0)
写保护8EH8FHWP(7),0(6),0(5),0(4),0(3~0)
慢充电90H91HTCS(7),TCS(6),TCS(5),TCS(4),DS(3),DS(2),RS(1),RS(0)
时钟突发BEHBFH//读写秒,分,时,日,月,周,年,写保护,8字节一个
RAM突发FEHFFH//读写31B的RAM,可以不以8字节为单位
CH时钟开关,0开1关
12/241先12小时,2选24小时,12小时下,位5为AM/PM选择位,此位1表PM,24小时下,位5是第二个小时位(20~23)
WP写保护位,0,允许,1,禁止
TCS1010才允许充电
DS二极管选择位 01 一个10两个00,11禁止
RS选择连接在VCC1,VCC2之间的电阻,00禁止01 2K104K118K
*/
uchar DateTime[8]={0x05,0x02,0x04,0x13,0x06,0x02,0x99,0x00};
//分别为 秒,分,时,日,月,周,年,写保护
//uchar DateTime[8]={0x05,0x03,0x04,0x
/*
函数名称:DS1302写入命令函数
功能描述:将命令写入DS1302
全局变量:无
参数说明:Command为要写入的命令
返回说明:
版本:1.0
说明:
*/
void WriteCommand(uchar Command)
{
uchar i;
RST=0;CLK=0;RST=1;
for(i=8;i>0;i--)//发送命令字
{
CLK=0;
DP=Command&0x01;//取一位送数据口
CLK=1;//产生一个上升沿
Command>>=1;
}
}
/*
函数名称:DS1302写入数据函数
功能描述:将数据写入DS1302
全局变量:无
参数说明:SendDat为要写入的命令
返回说明:
版本:1.0
说明:
*/
void WriteData(uchar SendDat)
{
uchar i;
for(i=8;i>0;i--)//发送数值
{
CLK=0;
DP=SendDat&0x01;
CLK=1;
SendDat>>=1;
}
}
/*
函数名称:DS1302读取数据函数
功能描述:从DS1302读取数据
全局变量:无
参数说明:
返回说明:返回读取的一个字节数据
版本:1.0
说明:
*/
uchar ReadData(void)
{
uchar i,RecDat=0;
for(i=0;i<8;i++)//读入数值
{
CLK=1;CLK=0;//产生一个下降沿
if(DP)RecDat|=0x01<<i;//读入数据
}
return RecDat;
}
/*
函数名称:DS1302向某地址单字写函数
功能描述:向某地址写入数据
全局变量:无
参数说明:Command为地址变量,SendDat为所送的数据
返回说明:
版本:1.0
说明:
*/
void WriteByte(uchar Command,uchar SendDat)
{
WriteCommand(Command);
WriteCommand(SendDat);
RST=0;
}
/*
函数名称:DS1302单字节读取某地址数据函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:Command为地址变量
返回说明:返回读取的指定地址数据
版本:1.0
说明:
*/
uchar ReadByte(uchar Command)//读字节子程序,入口参数,命令字
{
uchar RecDat=0;
WriteCommand(Command);
RecDat=ReadData();
RST=0;
return RecDat;
}
/*
读写保护操作,不能在多字节写模式下写入
SendByte(0x8EH,0x80)//向8EH地址写入0x80H数据,实现禁止写入操作
SendByte(0x8EH,0x00)//向8EH地址写入0x00H数据,实现允许写入操作
*/
//允许时钟启动,CH变为0
void OscCtrl(bit CtrlDat)//振荡起动和停止控制,入口参数1起动或0停止
{
if(CtrlDat)WriteByte(0x80,0x00);
elseWriteByte(0x80,0x80);
}
/*
//单字节传送
SendByte(0x80H,0x85);//启动时钟,秒为5
SendByte(0x81H);//读取时间中的秒数据
SendByte(0x82H,0x06);//写入分钟数据为6
SendByte(0x83H);//读取分钟数据
*/
/*
函数名称:DS1302连续写入数据函数
功能描述:
全局变量:无
参数说明:Command为命令,p发送的数据,longth为字节数据
返回说明:
版本:1.0
说明:当写入时间数据时,长度必须为8才可以,当写入RAM数据时数据长度为0~31
*/
void DS1302_BustWrite(uchar Command,uchar longth,uchar *p)
{
uchar i;
WriteCommand(Command);
for(i=longth;i>0;i--)
{
WriteData(*p);
p++;
}
RST=0;
}
/*
函数名称:DS1302连续读数据函数
功能描述:
全局变量:无
参数说明:Command为命令,longth为读取的数据长度,p读出后写入的数组指针
返回说明:
版本:1.0
说明:当读取RAM数据的时候数据长度为0~31
*/
void DS1302_BustReadByte(uchar Command,uchar longth,uchar *p)
{
uchar i;
WriteCommand(Command);
for(i=longth;i>0;i--)
{
//*p=0;
*p=ReadData();
p++;
}
RST=0;
}来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-03
加锁存芯片了吗?追问

不太清楚。好像是有的。

第2个回答  2013-01-04
我来帮你搞搞
相似回答