DS1302~时钟总时间是对的,但是秒显示不正常,不是规律的一秒变一次,几个快然后就小停顿一下,求高手~
答案:1 悬赏:40 手机版
解决时间 2021-01-24 15:20
- 提问者网友:雨不眠的下
- 2021-01-23 23:21
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
void Read_RTC(void)
{
unsigned char i,*p,ReadV;
p=read_add;
for(i=0;i<7;i++)
{
ReadV=ReadSet1302(*p);
vary_date[i]=((ReadV&0x70)>>4)*10 + (ReadV&0x0F);
p++;
}
}
void Set_RTC(void)
{
unsigned char i,*p,readv;
WriteSet1302(0x8e,0x00);
p=write_add;
for(i=0;i<7;i++)
{
readv=vary_date[i];
WriteSet1302(*p,((readv/10)<<4|(readv%10)));
p++;
}
WriteSet1302(0x8e,0x80);
}
最佳答案
- 五星知识达人网友:煞尾
- 2021-01-24 00:02
你说总时间是对的,那秒也就是对的,可能是你读时间的频率不对,每隔几秒你漏读了一次,所以显示没有刷新,我用定时器做的,每隔一秒读一次DS1302,实际效果很好,每秒都会初刷新
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯