您的位置 首页 电源

DS1302用1602显现加按键调时

includereg51h>includeintrinsh>*********************************端口定义***************************

#include

#include
/*********************************端口界说**********************************/
sbit sclk = P3^4;
sbit io= P3^3;
sbit rst= P3^5;
sbit rs=P1^0;
sbit en=P1^2;
sbit rw=P1^1;
sbit GND=P2^4;
sbit key=P2^0;
sbit K1=P2^1;
sbit K2=P2^2;
#define uchar unsigned char
#define uint unsigned int
uchar S1num,flag,second,minute,hour,week,day,month,year;//秒、分、时、星期、日、月、年
bitkeyflag=0;

void delay(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
void delayus()
{
_nop_();
_nop_();
_nop_();
_nop_();
}

void write_1602dat(uchar dat)//界说一个带参数的写数据子程序
{
rs=1; //1602的rs为0时,接纳指令,为1时接纳数据
P0=dat;//把void write_shu(uchar shu)中的COM中的数据给P0口
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}

void write_1602com(uchar com)//界说一个带参数的写指令子程序
{
rs=0; //1602的rs为0时,接纳指令,为1时接纳数据
P0=com;//把void write_com(uchar com)中的COM中的数据给P0口
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
void Write1602(uchar add,uchar dat)
{
write_1602com(add);
write_1602dat(dat);
}
void init1602()//界说一个初始化子程序
{
en=0;
rw=0;
write_1602com(0x38);//调用 write_com子程序并把0x38赋给P0口,显现形式翻开
write_1602com(0x0e);//调用 write_com子程序并把“开显现,显现光标,光标闪耀”指令码赋给P0口
write_1602com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
//write_com(0x80+0x10);//数据指针初始化,让指针指向可显现的最右端
write_1602com(0x80);//数据指针初始化,让指针指向最左端,显现从榜首行开端
write_1602com(0x01);//调用 write_com子程序并把”清零指”令码赋给P0口
Write1602(0x80,2);
Write1602(0x81,0);
Write1602(0x80+4,-);
Write1602(0x80+7,-);
Write1602(0x80+0x40+5,:);
Write1602(0x80+0x40+8,:);
}
/********************写一个字节**************/
void write_1302byte(dat)
{
uchar i;
sclk=0;
delayus();
for(i=8;i>0;i–)
{
io=dat&0x01;//只要是从低位取数,向高位必定要和0X01与
delayus();
sclk=1;//为写数据制作上升沿。
delayus();
sclk=0;//为下一次上升沿写下一个字节做预备
dat>>=1;//将数据向左移一位,预备写入下一个数据
}
}

/********************读一个字节***************/
uchar read_1302byte()
{
uchar i,dat;
delayus();
for(i=8;i>0;i–)
{
dat>>=1;
if(io==1)
{
dat|=0x80;//将1取出,写在dat的最高位。
}

sclk=1;//把sclk拉高,为读一个字节的下降沿做预备
delayus();//稍等制作一个高电平
sclk=0;//为读一个字节制作下降沿
delayus();
}
return dat;
}

/*************写入一个时刻位*****************/
void write_1302(uchar add,uchar dat)
{
rst=0;
delayus();
sclk=0;
delayus();
rst=1;
write_1302byte(add);
delayus();
write_1302byte(dat);
delayus();
rst=0;
}
/****************读1302的地址******************/
uchar read_1302add(uchar add)
{
uchar timedat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_1302byte(add);//写入要读的地址
timedat=read_1302byte();//将上面地址中的数据赋给timedat
sclk=1;
_nop_();
rst=0;
return timedat;
}
/****************初始化1302*********************/
void init_1302()
{

flag=read_1302add(0x81);//读秒寄存器的最高位,读出时钟状况
if(flag&0x80)//判别时钟是否封闭,若内部封闭,则初始,若没封闭,不初始化,还在走

{
write_1302(0x8e,0x00);//去除写保护
write_1302(0x80,((55/10)<<4|(55%10)));//写秒寄存器,并写入初值55
write_1302(0x82,((59/10)<<4|(59%10)));//写分寄存器,并写入初值59
write_1302(0x84,((22/10)<<4|(22%10)));//写小时寄存器,并写入初值23
write_1302(0x86,((24/10)<<4|(24%10)));//写日寄存器,并写入初值18
write_1302(0x88,((2/10)<<4|(2%10)));//写月寄存器,并写入初值2
write_1302(0x8a,((5/10)<<4|(5%10)));//写周寄存器,并写入初值5
write_1302(0x8c,((12/10)<<4|(12%10)));//写年寄存器,并写入初值12,不能写2012年
write_1302(0x90,0xa5);//写充电方法
write_1302(0x8e,0x80);//加上写保护
}
}
/*****************读出秒的十进制数***************************/

uchar readsecond()
{
uchar dat;
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
return second;
}

/*****************读出分的十进制数***************************/

uchar readminute()
{
uchar dat;
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
return minute;
}

/*****************读出小时的十进制数***************************/

uchar readhour()
{
uchar dat;
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
return hour;
}
/*****************读出天的十进制数***************************/

uchar readday()
{
uchar dat;
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
returnday;
}

/*****************读出月的十进制数***************************/

uchar readmonth()
{
uchar dat;
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
return month;
}
/*****************读出周的十进制数***************************/

uchar readweek()
{
uchar dat;
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
return week;
}

/*****************读出年的十进制数***************************/

uchar readyear()
{
uchar dat;
dat=read_1302add(0x8d);
year=((dat&0xf0)>>4)*10+(dat&0x0f);
return year;
}

/************************读出一切时刻**********************/
readtime()
{
readsecond();
readminute();
readhour();
readday();
readmonth();
readweek();
readyear();
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部