📄 shishishizhong.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Delaynop {_nop_();_nop_();_nop_();_nop_();}
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit scl=P1^0;
sbit sda=P1^1;
uchar code SetRtcCode[]={0x93,0x50,0x59,0x23,0x02,0x31,0x12,0x09};
//定义实时时钟的初始化日期
uchar code RtcAddr[]={0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x06};
//地址依次为控制,秒,分,时,星期,日,月,年。
//且所有数据为十进制的,除了年和秒的最高位外其他寄存器的
//最高位没用,都为0,而秒的最高位控制晶振的运行,1表示晶振禁止
//0表示晶振使能,时的Bit6位决定了时钟的24或12运行方式。1:12模式
uchar code table0[]=" 09-05-05 02 ";
uchar code table1[]=" 11:59:00 ";
uchar DisplayPoint[]={0x82,0xCA,0xC7,0xC4,0x8C,0x88,0x85};
//数据指针好像有点乱,但不知这样运行才是正确的。
//有可能读出的第一个数据不是秒,而是年
uchar ReadDat[7]={0,0,0,0,0,0,0};
//定义读出的七个日期数据
void Delay(uchar c);
void Write_com(uchar com);
void Write_dat(uchar dat);
uchar ReadDS1307(uchar Raddr);
void WriteDS8bit(char dswByte);
void WriteDS1307(uchar Waddr,uchar dswdat);
void StartDS1307(void);
void StopDS1307(void);
void init(void);
void main(void)
{
uchar tdat0=0;
uchar tdat1=0;
uchar temp=0;
unsigned char i;
init();
i=0;
while(1)
{
ReadDat[i]=ReadDS1307(RtcAddr[i+1]);
temp=((ReadDat[i]&0x70)>>4)*10+(ReadDat[i]&0x0F);
tdat0=temp/10+'0';
tdat1=temp%10+'0';
Write_com(DisplayPoint[i]);
Write_dat(tdat0);
Write_dat(tdat1);
Delay(50);
//P3=ReadDat[i];
i++;
if(i>6)i=0;
}
}
void Delay(uchar c)
{
uchar i,j;
for(j=c;j>0;j--)
for(i=110;i>0;i--);
}
void Write_com(uchar com)
{
en=1;
rs=0;
rw=1;
P0=com;
Delay(20);
rw=0;
en=0;
}
void Write_dat(uchar dat)
{
en=1;
rs=1;
rw=1;
P0=dat;
Delay(20);
rw=0;
en=0;
}
uchar ReadDS1307(uchar Raddr)
{
uchar i;
uchar dsrdat=0;
StartDS1307();
WriteDS8bit(0xD0);
WriteDS8bit(Raddr);
StopDS1307();
StartDS1307();
WriteDS8bit(0xD1);
for(i=0;i<8;i++)
{
dsrdat<<=1;
scl=1;
if(sda==1)
{dsrdat|=0x01;}
else
{dsrdat&=0xFE;}
scl=0;
}
StopDS1307();
return(dsrdat);
}
void WriteDS8bit(char dswByte)
{
uchar i;
for(i=0;i<8;i++)
{
sda=dswByte&0x80 ? 1:0;
_nop_();
scl=1;
Delaynop;
scl=0;
dswByte<<=1;
}
sda=1;
Delaynop;
scl=1;
Delaynop;
//ack_bit=sda;//读取应答位,也可以不读,用延迟错过就可以
scl=0;
}
void WriteDS1307(uchar Waddr,uchar dswdat)
{
StartDS1307();
WriteDS8bit(0xD0);
WriteDS8bit(Waddr);
WriteDS8bit(dswdat&0x7F);
StopDS1307();
}
void StartDS1307(void)
{
scl=1;
sda=1;
Delaynop;
sda=0;
Delaynop;
scl=0;
}
void StopDS1307(void)
{
sda=0;
Delaynop;
scl=1;
Delaynop;
sda=1;
}
void init(void)
{
uchar i=0;
Write_com(0x38);
Write_com(0x0c);
Write_com(0x06);
Write_com(0x01);
Write_com(0x80);
for(i=0;i<16;i++)
{
Write_dat(table0[i]);
}
Write_com(0x80+0x40);//指针换到下一行
for(i=0;i<16;i++)
{
Write_dat(table1[i]);
}
for(i=0;i<8;i++)
{
WriteDS1307(RtcAddr[i],SetRtcCode[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -