用AT89C51与DS1302做的万年历c语言编程 点击:209 | 回复:0



xilinxue

    
发表于:2010-02-27 18:10:58
楼主
//写的时候,是低电平改变数据,上升沿送入数据
//读的时候,是低电平读入数据,下降沿使得从设备把数据放到总线上
//读的时候,是低电平读,但没有读出,提供下降沿使得从设备把数据放到总线上
#include<reg51.h>
#include<intrins.h>
#define uch ar unsigned ch ar
#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;
uch ar str1【】="date of today is:";
uch ar init【】={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年
//
void delay()
{uch ar 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(uch ar cmd)
{
is_ready();
rs=0;
rw=0;
P2=cmd;
en_toggle();
_nop_();
}
void write_data(uch ar indata)
{
is_ready();
rs=1;
rw=0;
P2=indata;
en_toggle();
_nop_();
}
void write_str(uch ar addr,uch ar *p)
{
uch ar i;
write_cmd(addr);
while(p【i】!=‘\0‘)
{write_data(p【i】);
i++;
}
}
void write_position(uch ar row,uch ar col)
{uch ar 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);//清屏幕
}
//------------液晶模块结束---------------------
//-----------ds1302模块开始-------------------
//注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
//读写时都是从第0位开始
void write_byte(uch ar inbyte)
{
uch ar i;
for(i=8;i>0;i--)
{
sclk=0; //写的时候低电平改变数据
if(inbyte&0x01)
io=1;
else
io=0;
sclk=1; //写的时候高电平,把数据写入ds1302
_nop_();
inbyte=inbyte>>1;
}
}
uch ar read_byte() //sclk的下跳沿读数据
{
uch ar 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(uch ar cmd,uch ar indata)
{
reset=1;
write_byte(cmd);
write_byte(indata);
reset=0;
sclk=0;
}
//----------读ds1302某地址的的数据-----------------
uch ar read_ds1302(uch ar addr)
{
uch ar backdata;
reset=1;
write_byte(addr);
backdata=read_byte();//先写地址,然后读数据
reset=0;
sclk=0;
return (backdata);
}
//------------设置初始时间-------------------
void set_ds1302(uch ar addr,uch ar *p,uch ar 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(uch ar addr,uch ar *p,uch ar 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


楼主最近还看过

SSI ļʱ