您的位置 首页 数字

ds1302液晶显示

#includereg51.h>#includeintrins.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P3^3;sb

#include

#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^3;
sbit rw=P3^4;
sbit en=P3^5;
sbit bflag=P2^7;
sbit reset=P3^0;
sbit sclk=P3^1;
sbit io=P3^2;
uchar str1[]=”date of today is:”;
uchar init[]={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年
//
void delay()
{
uchar j;
for(j=250;j>0;j–);
}
//——————-液晶模块—————–//
void en_toggle()
{
en=0;
//_nop_();
delay();
en=1;
delay();
// _nop_();
en=0;
} //留意有必要加延时,不然会出问题的
void is_ready()
{
P2=0x00;//设置为输进口
rs=0;
rw=1;
en=1;
while(bflag);
en=0;
}

void write_cmd(uchar cmd)
{
is_ready();
rs=0;
rw=0;
P2=cmd;
en_toggle();
}
void write_data(uchar indata)
{
is_ready();
rs=1;
rw=0;
P2=indata;
en_toggle();
_nop_();
}
void write_str(uchar addr,uchar *p)
{
uchar i;
write_cmd(addr);
while(p[i]!=\0)
{write_data(p[i]);
i++;
}
}
void write_position(uchar row,uchar col)
{uchar p;
if(row==1)
{p=0x80+col-1;
write_cmd(p);}
else
{p=0xc0+col-1;
write_cmd(p);
}
}
void init_lcd()
{
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);//清屏幕
delay();
}
//————液晶模块完毕———————

//———–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;
_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;
}
//sclk=0;
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); //读出当时时刻

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));//读秒
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/266157.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部