51+DS1302+DS18B20+LCD1602-鏄剧ず鏃堕棿-娓╁害-鍙皟鏃?- 鐧惧害鏂囧簱 下载本文

}

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