}
void init() { uchar num; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); delay(5); write_com(0x80); for(num=0;num<15;num++) { write_date(table[num]); delay(5);
}
write_com(0x80+0x40); for(num=0;num<15;num++) { write_date(table1[num]);
delay(5);
}
}
void Write1302(uchar dat) {
5
uchar i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delay1(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续写8个二进制位数据 {
DATA=dat&0x01; //取出dat的第0位数据写入1302 delay(2); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据 delay1(2); //稍微等待,使硬件做好准备 SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 } }
void WriteSet1302(uchar Cmd,uchar dat) {
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输
delay1(2); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 }
uchar Read1302(void)
6
{
uchar i,dat;
delay(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续读8个二进制位数据 {
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delay1(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿 delay1(2); //稍微等待 }
return dat; //将读出的数据返回 }
uchar ReadSet1302(uchar Cmd) {
uchar dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递
7
return dat; //将读出的数据返回 }
void Init_DS1302(void) {
WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((45/10)<<4|(45))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((15/10)<<4|(15))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((29/10)<<4|(29))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((11/10)<<4|(11))); //根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((10/10)<<4|(10))); //nian WriteSet1302(0x8a,((4/10)<<4|(4))); }
void DisplaySecond(uchar x) {
uchar i,j; i=x/10; j=x;
write_com(0xc7); write_date(0x30+i); write_date(0x30+j); }
void DisplayMinute(uchar x) {
uchar i,j; i=x/10;
8