智能电子钟LCD显示.docx
- 文档编号:29657318
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:14
- 大小:77.39KB
智能电子钟LCD显示.docx
《智能电子钟LCD显示.docx》由会员分享,可在线阅读,更多相关《智能电子钟LCD显示.docx(14页珍藏版)》请在冰豆网上搜索。
智能电子钟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键没有设置功能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 电子钟 LCD 显示
![提示](https://static.bdocx.com/images/bang_tan.gif)