可用按键修改时间的DS1302时钟显示程序资料.docx

上传人:b****6 文档编号:8035489 上传时间:2023-01-28 格式:DOCX 页数:18 大小:19.06KB
下载 相关 举报
可用按键修改时间的DS1302时钟显示程序资料.docx_第1页
第1页 / 共18页
可用按键修改时间的DS1302时钟显示程序资料.docx_第2页
第2页 / 共18页
可用按键修改时间的DS1302时钟显示程序资料.docx_第3页
第3页 / 共18页
可用按键修改时间的DS1302时钟显示程序资料.docx_第4页
第4页 / 共18页
可用按键修改时间的DS1302时钟显示程序资料.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

可用按键修改时间的DS1302时钟显示程序资料.docx

《可用按键修改时间的DS1302时钟显示程序资料.docx》由会员分享,可在线阅读,更多相关《可用按键修改时间的DS1302时钟显示程序资料.docx(18页珍藏版)》请在冰豆网上搜索。

可用按键修改时间的DS1302时钟显示程序资料.docx

可用按键修改时间的DS1302时钟显示程序资料

#include//52单片机头文件,规定了52单片机的寄存器和IO口等

#include//_nop_空指令及左右循环移位子函数库

#include"lcd1602.h"

sbitsda=P1^1;//位定义1302芯片的接口,数据输出端定义在P1.1引脚

sbitrst=P1^2;//位定义1302芯片的接口,复位端口定义在P1.1引脚

sbitsck=P1^0;//位定义1302芯片的接口,时钟输出端口定义在P1.1引脚

sbits1=P1^3;//定义设置按钮

sbits2=P1^4;//定义调时按钮

sbits3=P1^6;//定义确定按钮

sbits4=P1^7;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

sbitbeep=P3^6;

ucharfen,shi,miao,ri,yue,nian,zhou,s1num,s2num,s4num,flag1,flag2,lshi,lfen;

ucharcodetable[]={"2014:

:

"};//要写入1602液晶的数据

ucharcodetable1[]={":

:

:

"};//字库中的字可直接以外加""号的形式直接写入

ucharcodetable2[]={"WelcomeToLcd!

"};//欢迎界面

ucharcodetable3[]={"HappyEveryOne!

"};//欢迎界面

/**************************时函数,z的取值为这个函数的延时ms数,

delay(200);大约延时200ms.

delay(500);大约延时500ms

**************************************************************/

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voiddelay20ms(void)//3*i*j+2*i=3*100*60+2*100=20000μs=20ms;

{

unsignedchari,j;

for(i=0;i<100;i++)

for(j=0;j<60;j++)

;

}

/*****************************************************

函数功能:

延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<4;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函数功能:

延时若干毫秒

入口参数:

n

***************************************************/

voiddelaynms(unsignedcharn)

{

unsignedchari;

for(i=0;i

delay1ms();

}

/*********************蜂鸣器函数*****************************/

voiddidi()

{

uchari;

for(i=0;i<60;i++)

{

beep=0;

delay

(1);

beep=1;

delay

(1);

}

}

/*******************************************************************************/

voidgudingtime_1602()

{

ucharnum;

write_com(0x80);//将指针指向初始位置

for(num=0;num<11;num++)//循环函数,用于将"12--"写入液晶

write_data(table[num]);

write_com(0x80+0x40);//将指针指向1602液晶的第二行

for(num=0;num<16;num++)//功能与上同,用于将":

:

:

"写入

write_data(table1[num]);

}

/**************************显示欢迎界面函数*************************************/

voiddisplaystar(void)

{

uchari;

write_com(0x80);

for(i=0;i<16;i++)

write_data(table2[i]);

write_com(0x80+0x40);

for(i=0;i<16;i++)

write_data(table3[i]);

}

/***************************显示时间、日期子函数*********************************/

voidwrite_sfm(ucharadd,uchartime)//用于在1602上显示年、月、日、时、分、秒。

Add为显示位置,time为要显示的内容

{

ucharshiwei,gewei;

shiwei=time/16;//将从DS1302中读取的BCD码数据转化成10进制个位和10

gewei=time%16;//进制十位

write_com(add+0x80);//定义显示在液晶的什么位置

write_data(0x30+shiwei);//由1602液晶字库可知,0~9的数据码分别对应0x30~0x39

write_data(0x30+gewei);//初使化中设定了写一个字符后,地址指针加1,因此这里

}//不用重新光标写位

/**************************显示周子函数*****************************************/

/***voidwrite_zhou(uchartime1)//用于在1602上显示周信息,与显示

{//时间日期子函数类似

uchargewei;

gewei=time1%16;//一周七天,因此只需个位

write_com(0x80+15);

write_data(0x30+gewei);

}

/***************************写数据字节子函数************************************/

voidInput_1byte(ucharTD)//写一字节数据

{

uchari;

ACC=TD;

for(i=8;i>0;i--)

{

sda=ACC0;

sck=1;

sck=0;

ACC=ACC>>1;

}

}

/*************************读数据字节子函数**************************************/

ucharOutput_1byte(void)//读一字节数据

{

uchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;

ACC7=sda;

sck=1;

sck=0;

}

return(ACC);

}

/***************************写DS1302数据函数***********************************/

voidwrite_1302(ucharDS_ADD,ucharDS_DAT)//写操作

{

rst=0;

sck=0;

rst=1;

Input_1byte(DS_ADD);

Input_1byte(DS_DAT);

sck=1;

rst=0;

}

/***************************读DS1302数据函数***********************************/

ucharread_1302(ucharDS_ADD)//读操作

{

ucharDS_INF;

rst=0;

sck=0;

rst=1;

Input_1byte(DS_ADD);

DS_INF=Output_1byte();

sck=1;

rst=0;

return(DS_INF);

}

/*************************初始化DS1302子函数***********************************/

voidinital_1302()

{

write_1302(0x8e,0x00);//禁止写保护

/*write_1302(0x90,0xaa);//定义充电*/

write_1302(0x80,0x53);//秒

write_1302(0x84,0x13);//时

write_1302(0x82,0x43);//分

write_1302(0x8c,0x14);//年

write_1302(0x88,0x09);//月

write_1302(0x86,0x06);//日

write_1302(0x8a,0x06);//星期

write_1302(0xc0,0x08);//闹钟小时初始化

write_1302(0xfc,0x00);//闹钟分钟初始化

write_1302(0x8e,0x80);//开保护

}

/**************扫描函数*******************************************************/

voidkeyscan()

{

if(s1==0&&s4num==0)//按键1按下且s4再次之前未曾按过

{

delay(5);

if(s1==0&&s4num==0)

{

flag1=1;

s1num++;

while(!

s1);

didi();

if(s1num==1)

{

write_com(0x80+0x40+8);//光标移动到**位置

write_com(0x0f);//显示光标

}

if(s1num==2)

{

write_1302(0x8e,0x00);//可以写

write_1302(0x80,miao);//写入秒信息

write_1302(0x8e,0x80);//开写保护

write_com(0x80+0x40+5);

}

if(s1num==3)

{

write_1302(0x8e,0x00);

write_1302(0x82,fen);//分

write_1302(0x8e,0x80);

write_com(0x80+0x40+2);

}

if(s1num==4)

{

write_1302(0x8e,0x00);

write_1302(0x88,yue);//月

write_1302(0x8e,0x80);

write_com(0x80+13);

}

if(s1num==5)

{

write_1302(0x8e,0x00);

write_1302(0x84,shi);//时

write_1302(0x8e,0x80);

write_com(0x80+10);

}

if(s1num==6)

{

write_1302(0x8e,0x00);

write_1302(0x86,ri);//日

write_1302(0x8e,0x80);

write_com(0x80+7);

}

if(s1num==7)

{

write_1302(0x8e,0x00);

write_1302(0x8c,nian);//年

write_1302(0x8e,0x80);

write_com(0x80+4);

}

/*if(s1num==8)

{

flag1=0;

s1num=0;

write_1302(0x8e,0x00);

write_1302(0x8a,zhou);

write_1302(0x8e,0x80);

write_com(0x0c);//不显示光标

}*/

}

}

/*******************************************************************************/

if(s1num!

=0&&s4num==0)//按键1按下*次且s4再次之前未曾按过(按键按下时,时间修改函数)

{

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!

s2);

didi();

if(s1num==1)

{

intx1,x2;

x1=miao%16;

x2=miao/16;

x1++;

if(x1==10)

{

x1=0;

x2++;

if(x2>=6)

x2=0;

}

miao=x1+x2*16;//秒

write_sfm(0x40+7,miao);//将修改的数送到1602显示

}

write_com(0x80+0x40+8);//挪回光标

}

if(s1num==2)

{

intx3,x4;

x3=fen%16;

x4=fen/16;

x3++;

if(x3==10)

{

x3=0;

x4++;

if(x4>=6)

x4=0;

}

fen=x3+x4*16;

write_sfm(4+0x40,fen);

write_com(0x80+0x40+5);//分

}

if(s1num==3)

{

intx5,x6;

x5=shi%16;

x6=shi/16;

x5++;

if(x6>=2&&x5>=4)

{

x5=0;

x6=0;

}

if(x5==10)

{

x5=0;

x6++;

}

shi=x5+x6*16;

write_sfm(1+0x40,shi);//时

write_com(0x80+0x40+2);

}

/*if(s1num==4)

{

zhou++;

if(zhou==8)

zhou=1;

write_zhou(zhou);

write_com(0x80+15);

}*/

if(s1num==4)

{

intx5,x6;

x5=ri%16;

x6=ri/16;

x5++;

if(x6>=3&&x5>=1)

{

x5=1;

x6=0;

}

if(x5==10)

{

x5=0;

x6++;

}

ri=x5+x6*16;

write_sfm(9,ri);//日

write_com(0x80+10);

}

if(s1num==5)

{

intx5,x6;

x5=yue%16;

x6=yue/16;

x5++;

if(x6>=1&&x5>=3)

{

x5=1;

x6=0;

}

if(x5==10)

{

x5=0;

x6++;

}

yue=x5+x6*16;

write_sfm(6,yue);//月

write_com(0x80+7);

}

if(s1num==6)

{

intx5,x6;

x5=nian%16;

x6=nian/16;

x5++;

if(x6>=2&&x5>=1)

{

x5=1;

x6=0;

}

if(x5==10)

{

x5=0;

x6++;

}

nian=x5+x6*16;

write_sfm(3,nian);//年

write_com(0x80+4);

}

}

}

/**********************时间调整模式**************************************/

if(s1num!

=0||s4num!

=0)//在调整模式下

{

if(s3==0)//如果确定键按下

{

delay(5);

if(s3==0)//延时并重新检测S3是否按下,用于差小误差

{

if(s1num!

=0)

{

while(!

s3);

didi();//在松手时将调整后的时间、日期及周信息写入DS1302,退出调整模式并隐藏光标,按键次数清0

write_1302(0x8e,0x00);

write_1302(0x80,miao);

write_1302(0x84,shi);

write_1302(0x82,fen);

write_1302(0x8a,zhou);

write_1302(0x8c,nian);//年

write_1302(0x88,yue);//月

write_1302(0x86,ri);

write_1302(0x8e,0x80);

flag1=0;

write_com(0x0c);

s1num=0;

}

if(s4num!

=0)

{

while(!

s3);

didi();//在松手时将调整后的时间、日期及周信息写入DS1302,退出调整模式并隐藏光标,按键次数清0

write_1302(0x8e,0x00);

write_1302(0xc0,lshi);

write_1302(0xfc,lfen);

write_1302(0x8e,0x80);

flag2=0;

s4num=0;

write_com(0x0c);

}

}

}

}

if(s4==0&&s1num==0)//按键4按下*次且s1再次之前未曾按过(闹钟位置已改好的)

{

delay(5);

if(s4==0&&s1num==0)

{

s4num++;

flag2=1;

while(!

s4);

didi();

if(s4num==1)

{

write_com(0x80+0x40+14);

write_com(0x0f);

}

if(s4num==2)

{

write_1302(0x8e,0x00);//可以写

write_1302(0xfc,lfen);//闹钟初始化

write_1302(0x8e,0x80);//开写保护

write_com(0x80+0x40+11);

}

if(s4num==3)

{

s4num=0;

flag2=0;

write_1302(0x8e,0x00);//可以写

write_1302(0xc0,lshi);//闹钟初始化

write_1302(0x8e,0x80);//开写保护

write_com(0x0c);//不显示光标

}

}

}

if(s4num!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1