智能电子钟LCD显示.docx

上传人:b****8 文档编号:29657318 上传时间:2023-07-25 格式:DOCX 页数:14 大小:77.39KB
下载 相关 举报
智能电子钟LCD显示.docx_第1页
第1页 / 共14页
智能电子钟LCD显示.docx_第2页
第2页 / 共14页
智能电子钟LCD显示.docx_第3页
第3页 / 共14页
智能电子钟LCD显示.docx_第4页
第4页 / 共14页
智能电子钟LCD显示.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

智能电子钟LCD显示.docx

《智能电子钟LCD显示.docx》由会员分享,可在线阅读,更多相关《智能电子钟LCD显示.docx(14页珍藏版)》请在冰豆网上搜索。

智能电子钟LCD显示.docx

智能电子钟LCD显示

注:

本程序并没有显示星期,如有需要,可自行添加。

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

*实验名称:

智能电子钟(LCD显示)

*实验效果:

1602显示时钟,按K1进入时间设置,K2分别选择秒

*分时日月星期年,按K3时间加一

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

#include

#include"ds1302.h"

#include"lcd1602.h"

#defineuintunsignedint

#defineucharunsignedchar

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

**声明:

本实验所有IO口只与“1302时钟按键设置”仿真图配套**

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

sbitK1=P3^2;//接的是INT0K1时钟设置(按一下开始调节时间,再按一下退出调节时间)

sbitK2=P3^3;//接的是INT1K2选择秒分时日月星期年

sbitK3=P3^4;//接的是TOK3加时间

voidCursor();//设置时光标闪烁

voidDelay10ms();

voidInt0Configuration();//外部中断0设置

voidLcdDisplay();//显示函数

ucharSetState,SetPlace;//设置状态、光标位置

voidmain()//主函数

{

uchari;

Int0Configuration();//外部中断0设置

lcd1602Init();//1602初始化

ds1302Init();//1302初始化

while

(1)

{

if(SetState==0)//如果没有键按下,就显示时间

{//SetState的高低由中断控制,按下K1则为1,再次按下则为0

ds1302readtime();

}

else

{

if(K2==0)//消除抖动

{

Delay10ms();

if(K2==0)//如果K2被按下,则光标移动

{

SetPlace++;

if(SetPlace>=7)//年月日星期时分秒共7个时间

SetPlace=0;

}

while((i<50)&&(K2==0))//松手检测

{

Delay10ms();

i++;

}

i=0;

}

if(K3==0)//如果K3被按下,则时间每次加1

{

Delay10ms();//消除抖动

if(K3==0)

{

TIME[SetPlace]++;

if((TIME[SetPlace]&0x0f)>9)//换成BCD码

{

TIME[SetPlace]=TIME[SetPlace]+6;

}

if((TIME[SetPlace]>0x60)&&(SetPlace<2))//分秒只能到59

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>0x24)&&(SetPlace==2))//小时只能到23

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>0x32)&&(SetPlace==3))//日只能到31

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>0x13)&&(SetPlace==4))//月只能到12

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>0x7)&&(SetPlace==5))//周只能到7

{

TIME[SetPlace]=0;

}

if((TIME[SetPlace]>0x99)&&(SetPlace==6))//年只能到2099

{

TIME[SetPlace]=0;

}

}

while((i<50)&&(K3==0))//松手检测

{

Delay10ms();

i++;

}

i=0;

}

}

LcdDisplay();//Lcd1602显示时间

}

}

voidLcdDisplay()//显示函数

{

writecom(0x80+0x40);

writedata('T');

writedata('I');

writedata('M');

writedata('E');

writedata(':

');

writedata('0'+TIME[2]/16);//时

writedata('0'+(TIME[2]&0x0f));

writedata(':

');

writedata('0'+TIME[1]/16);//分

writedata('0'+(TIME[1]&0x0f));

writedata(':

');

writedata('0'+TIME[0]/16);//秒

writedata('0'+(TIME[0]&0x0f));

writecom(0x80);

writedata('D');

writedata('A');

writedata('T');

writedata('E');

writedata(':

');

writedata('2');//年

writedata('0');

writedata('0'+TIME[6]/16);

writedata('0'+(TIME[6]&0x0f));

writedata('-');

writedata('0'+TIME[4]/16);//月

writedata('0'+(TIME[4]&0x0f));

writedata('-');

writedata('0'+TIME[3]/16);//日

writedata('0'+(TIME[3]&0x0f));

}

voidDelay10ms()//延时10ms

{

uchara,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

voidInt0Configuration()//设置外部中断0

{

IT0=1;//跳变沿触发

EX0=1;//打开外部0中断

EA=1;//打开总中断

}

voidInt0()interrupt0//如果按下K1就进入中断

{

Delay10ms();

if(K1==0)

{

//writecom(0x80+0x40+12);

//writecom(0x0f);

SetState=~SetState;

SetPlace=0;

ds1302Init();//调过时间后再按下K1,调好的时间就被写进DS1302

}

}

------------------------------------------------------分割线------------------------------------------------------

#ifndef_LCD1602_H_

#define_LCD1602_H_

//---包含头文件---//

#include

//---宏定义关键词---//

#ifndefuint

#defineuintunsignedint

#endif

#ifndefuchar

#defineucharunsignedchar

#endif

//---定义1602的IO口---//

sbitE=P2^2;

sbitRW=P2^1;

sbitRS=P2^0;

//---声明全局函数---//

voiddelay1ms(uintz);

voidwritecom(ucharcom);

voidwritedata(uchardat);

voidlcd1602Init();

#endif

#include"lcd1602.h"

/*********函数功能:

延时函数,延时1ms*********/

voiddelay1ms(uintc)

{

uchara,b;

for(;c>0;c--)

for(b=199;b>0;b--)

for(a=1;a>0;a--);

}

/*********函数功能:

向1602写入一个字节的指令*********/

voidwritecom(ucharcom)

{

E=0;//使能端口

RW=0;//低电平选择写入

RS=0;//低电平选择写入指令

P0=com;//放入指令

delay1ms

(1);//等待数据稳定

E=1;//高电平期间写入

delay1ms(5);//保持时间

E=0;//变低

}

/*********函数功能:

向1602写入一个字节的数据*********/

voidwritedata(uchardat)

{

E=0;

RW=0;

RS=1;//高电平选择写入数据

P0=dat;

delay1ms

(1);

E=1;

delay1ms(5);

E=0;

}

/*********函数功能:

初始化LCD1602*********/

voidlcd1602Init()

{

writecom(0x38);//开显示

writecom(0x0c);//开显示,不显示光标

writecom(0x06);//写一个字符指针加1

writecom(0x01);//清屏

writecom(0x80);//设置数据指针起点

}

-------------------------------------------分割线---------------------------------------------------

#ifndef_DS1302_H_

#define_DS1302_H_

//---包含头文件---//

#include

#include

//---宏定义关键词---//

#ifndefuint

#defineuintunsignedint

#endif

#ifndefuchar

#defineucharunsignedchar

#endif

//---定义1302的IO口---//

sbitIO=P2^7;

sbitCE=P2^5;

sbitSCLK=P2^6;

//---声明全局函数---//

voidds1302write(ucharaddr,uchardat);

uchards1302read(ucharaddr);

voidds1302Init();

voidds1302readtime();

//---加入全局变量---//

externucharTIME[7];

#endif

#include"ds1302.h"

ucharREAD_ADDR[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

//DS1302的读取地址,与下面的数组时间对应

ucharWRITE_ADDR[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

//DS1302的写入地址,与下面的数组时间对应

ucharTIME[7]={0x00,0x00,0x12,0x01,0x01,0x02,0x14};

//---TIME[7]数组存储分别是秒分时日月星期年---//

/*********函数功能:

向ds1302写数据*********/

voidds1302write(ucharaddr,uchardat)

{

ucharn;

CE=0;

SCLK=0;//先将SCLK置低电平

_nop_();

CE=1;//然后将CE置高电平

_nop_();

for(n=0;n<8;n++)//开始传送8位地址命令

{

IO=addr&0x01;//从低位开始传送

addr>>=1;

SCLK=1;//上升沿读取数据

_nop_();

SCLK=0;//下降沿放置数据

_nop_();

}

for(n=0;n<8;n++)//写入8位数据

{

IO=dat&0x01;

dat>>=1;

SCLK=1;

_nop_();

SCLK=0;

_nop_();

}

CE=0;//数据传送结束

_nop_();

}

/*********函数功能:

从ds1302读数据*********/

uchards1302read(ucharaddr)

{

ucharn,dat,dat1;

CE=0;

SCLK=0;//先将SCLK置低电平

_nop_();

CE=1;//然后将CE置高电平

_nop_();

for(n=0;n<8;n++)//开始传送八位地址命令

{

IO=addr&0x01;

addr>>=1;

SCLK=1;

_nop_();

SCLK=0;

_nop_();

}

for(n=0;n<8;n++)//读取8位数据

{

dat1=IO;

dat=(dat>>1)|(dat1<<7);

SCLK=1;

_nop_();

SCLK=0;

_nop_();

}

CE=0;

_nop_();//以下为DS1302复位的稳定时间,必须的

SCLK=1;

_nop_();

IO=0;

_nop_();

IO=1;

_nop_();

returndat;

}

/*********函数功能:

初始化DS1302*********/

voidds1302Init()

{

ucharn;

ds1302write(0x8e,0x00);//关闭写保护

for(n=0;n<7;n++)

{

ds1302write(WRITE_ADDR[n],TIME[n]);

}

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

}

/*********函数功能:

读取时钟信息*********/

voidds1302readtime()

{

ucharn;

for(n=0;n<7;n++)

{

TIME[n]=ds1302read(READ_ADDR[n]);//将读取到的时间存入TIME[7]数组里

}

}

以下为仿真图片,K4键没有设置功能

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

当前位置:首页 > 总结汇报

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

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