原创 用AT89C51与DS1302做的万年历c语言编程

2008-7-28 19:30 4404 5 3 分类: MCU/ 嵌入式
//写的时候,是低电平改变数据,上升沿送入数据
//
读的时候,是低电平读入数据,下降沿使得从设备把数据放到总线上
//
读的时候,是低电平读,但没有读出,提供下降沿使得从设备把数据放到总线上

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs="P2"^4;
sbit rw="P2"^5;
sbit en="P3"^6;
sbit reset="P3"^3;
sbit sclk="P3"^0;
sbit io="P3"^1;
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;//
设置为输入口 //注意:现实中应该送0xff
   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();
  _nop_();
}
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!='\0')
{write_data(p);
  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(0x<?XML:NAMESPACE PREFIX = ST1 />0c);
write_cmd(0x06);
write_cmd(0x01);//
清屏幕

}
//------------
液晶模块结束---------------------

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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条