//-----------ds1302模块开始-------------------
//注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
//读写时都是从第0位开始
void write_byte(uchar inbyte)
{
uchar i;
for(i=8;i>0;i--)
{
sclk=0; //写的时候低电平改变数据
if(inbyte&0x01)
io=1;
else
io=0;
sclk=1; //写的时候高电平,把数据写入ds1302
_nop_();
inbyte=inbyte>>1;
}
}
uchar read_byte() //sclk的下跳沿读数据
{
uchar i,temp=0;
io=1; //设置为输入口
for(i=7;i>0;i--)
{
sclk=0;
if(io==1)
temp=temp|0x80;
else
temp=temp&0x7f;
sclk=1; //产生下跳沿
temp=temp>>1;
}
return (temp);
}
//----------往ds1302的某个地址写入数据-------------
void write_ds1302(uchar cmd,uchar indata)
{
reset=1;
write_byte(cmd);
write_byte(indata);
reset=0;
sclk=0;
}
//----------读ds1302某地址的的数据-----------------
uchar read_ds1302(uchar addr)
{
uchar backdata;
reset=1;
write_byte(addr);
backdata=read_byte();//先写地址,然后读数据
reset=0;
sclk=0;
return (backdata);
}
//------------设置初始时间-------------------
void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据
{
write_ds1302(0x8e,0x00);//写控制字,允许写操作
for(;n>0;n--)
{write_ds1302(addr,*p);
p++;
addr=addr+2;
}
write_ds1302(0x8e,0x80);//写保护,不允许写
}
//----------- 读取当前时间-------------------
void read_nowtime(uchar addr,uchar *p,uchar n)
{
for(;n>0;n--)
{
*p=read_ds1302(addr);
p++;
addr=addr+2;
}
}
void init_ds1302()
{
reset=0;
sclk=0;
write_ds1302(0x80,0x00);//写控制字,允许写
write_ds1302(0x90,0x00);//禁止涡流充电
}
//-----------ds1302模块结束-------------------
void main()
{
init_lcd(); //初始化LCD
write_str(0x80,str1); //液晶显示提示信息
init_ds1302(); //初始化ds1302
set_ds1302(0x80,init,7);//设置初始时间,日期,年月
//如果不设置初始化时间的话,则默认为系统时间
while(1)
{
read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
write_position(2,1);
write_data('0'+((init[2]&0xf0)>>4));
write_position(2,2);
write_data('0'+(init[2]&0x0f)); //读小时
write_position(2,3);
write_data(':');
write_position(2,4);
write_data('0'+((init[1]&0xf0)>>4));
write_position(2,5);
write_data('0'+(init[1]&0x0f)); //读分钟
write_position(2,6);
write_data(':');
write_position(2,7);
write_data('0'+((init[0]&0xf0)>>4));
write_position(2,8);
write_data('0'+(init[0]&0x0f)); //读秒
write_position(2,13);
write_data('0'+((init[6]&0xf0)>>4));
write_position(2,14);
write_data('0'+(init[6]&0x0f)); //读年
write_position(2,15);
write_data('/');
write_position(2,16);
write_data('0'+((init[4]&0xf0)>>4));
write_position(2,17);
write_data('0'+(init[4]&0x0f)); //读月
write_position(2,18);
write_data('/');
write_position(2,19);
write_data('0'+((init[3]&0xf0)>>4));
write_position(2,20);
write_data('0'+(init[3]&0x0f)); //读日
文章评论(0条评论)
登录后参与讨论