#include "1602.h"
#include "eclock.h"
#include "i2c.h"
#include "key.h"
sbit Beep=P2^6;
sbit L1=P1^5;
sbit L2=P1^4;
uchar code error[]="error";
uchar num[7]; /* store the time and date */
uchar time[8]="00:00:00"; /* time showing buffer */
uchar mdate[8]="00/00000"; /* date showing buffer month/day week year */
uchar atime[4]; /* the alarm time buffer */
uchar y1,y2; /* the flag 19 century or 20 century */
/* the delay function */
void delay(uchar tt)
{
while(--tt);
}
void delay10ms(void)
{
uchar i=200;
while(--i)
delay(250);
}
/* the bell function */
void bell(void)
{
I2CRecS(pcfsla,1,num,1);
if((num[0])&0x08) /* judge the alarm */
Beep=1;
if(k4==0)
{
delay10ms();
if(k4==0)
{
Beep=0;
num[0]=0x02;
I2CSendS(pcfsla,1,num,1);
}
}
}
/******************
the lcd1602 display
*******************/
void display(void)
{
uchar i;
lcdsendcommand(LCD_ROW1ADR);
for(i=0;i<5;i++)
lcdsenddata(mdate[i]);
lcdsendcommand(LCD_ROW1ADR+6);
lcdsenddata(mdate[5]);
lcdsendcommand(LCD_ROW1ADR+8);
for(i=0;i<8;i++)
lcdsenddata(time[i]);
lcdsendcommand(LCD_ROW2ADR+2);
lcdsenddata(y1);
lcdsenddata(y2);
lcdsenddata(mdate[6]);
lcdsenddata(mdate[7]);
}
/* lcd1602 initialize */
void initlcd(void)
{
lcdsendcommand(LCD_MODE);
lcdsendcommand(LCD_MODE);
lcdsendcommand(LCD_MODE);
lcdsendcommand(LCD_SHOWMODE);
lcdsendcommand(LCD_CLEAR);
lcdsendcommand(LCD_INPUT);
}
/*
the pcf8563 initialize
*/
void pcf8563init(void)
{
i2cinit();
num[1]=0x02; /* set the alarm */
I2CSendS(pcfsla,0,num,2);
num[3]=0x01; /* 2010-01-01 */
num[5]=0x01;
num[6]=0x10;
I2CSendS(pcfsla,2,num,7);
num[0]=0x80; /* set the alarm disable */
num[1]=0x80;
num[2]=0x80;
num[3]=0x80;
I2CSendS(pcfsla,9,num,4);
delay10ms();
}
/* read time from pcf8563*/
void Readpcf8563(void)
{
uchar pcfsuba;
pcfsuba=0x02;
I2CRecS(pcfsla,pcfsuba,num,7);
num[0]&=0x7f; /* second */
num[1]&=0x7f; /* minute */
num[2]&=0x3f; /* hour */
num[3]&=0x3f; /* day */
num[4]&=0x07; /* week */
num[5]&=0x1f; /* month */
/* year: num[6] */
time[0]=(num[2]/16)+0x30; /* hour */
time[1]=(num[2]%16)+0x30;
time[3]=(num[1]/16)+0x30; /* minute */
time[4]=(num[1]%16)+0x30;
time[6]=(num[0]/16)+0x30; /* second */
time[7]=(num[0]%16)+0x30;
mdate[0]=(num[5]/16)+0x30; /* month */
mdate[1]=(num[5]%16)+0x30;
mdate[3]=(num[3]/16)+0x30; /* day */
mdate[4]=(num[3]%16)+0x30;
mdate[5]=(num[4]%16)+0x31; /* week */
mdate[6]=(num[6]/16)+0x30; /* year */
mdate[7]=(num[6]%16)+0x30;
if(num[5]&0x80)
{
y1=0x31;
y2=0x39;
}
else
{
y1=0x32;
y2=0x30;
}
}
/* the data processing after set the time and date */
void dataprocess(void)
{
num[0]=((time[6]-0x30)<<4)|(time[7]-0x30);
num[1]=((time[3]-0x30)<<4)|(time[4]-0x30);
num[2]=((time[0]-0x30)<<4)|(time[1]-0x30);
num[3]=((mdate[3]-0x30)<<4)|(mdate[4]-0x30);
num[4]=mdate[5]-0x31;
if(y1==0x31)
num[5]=(((mdate[0]-0x30)<<4)|0x80)|(mdate[1]-0x30); /* 19xx */
else
num[5]=((mdate[0]-0x30)<<4)|(mdate[1]-0x30);
num[6]=((mdate[6]-0x30)<<4)|(mdate[7]-0x30);
}
/* the keyscan function */
void keyscan()
{
uchar keyflag,mode,row,alarm;
y1=0x32;
y2=0x30;
Readpcf8563();
if(k1==0)
{
delay10ms();
if(k1==0) /* k1 mode key mode=0,exit; mode=1,set time and date */
{ /* mode=2,set alarm; */
while(k1==0);
mode=1;
atime[0]=time[0];
atime[1]=time[1];
atime[2]=time[3];
atime[3]=time[4];
lcdsendcommand(LCD_CI); /* The LCD cursor return the oringinal postion */
keyflag=0;
row=0; /* the LCD first row */
alarm=1; /* alarm=1: set the time and date; alarm=0: set the alarm */
while(mode!=0)
{
if(k2==0)
{
delay10ms();
if(k2==0) /* add key */
{
while(k2==0);
if(alarm) /* set time and date */
{
if(row==0)
{
switch(keyflag)
{
case 0:
{
if(mdate[0]==0x30) /* month 1-12 */
mdate[0]=0x31;
else if(mdate[0]==0x31)
mdate[0]=0x30;
lcdsenddata(mdate[0]);
lcdsendcommand(LCD_ROW1ADR);
break;
}
case 1:
{
mdate[1]+=1; /*10-12 month*/
if(mdate[0]==0x31)
{
if(mdate[1]>0x32) mdate[1]=0x30;
}
else if(mdate[0]==0x30) /*1-9 month */
{
if(mdate[1]>0x39) mdate[1]=0x31;
}
lcdsenddata(mdate[1]);
lcdsendcommand(LCD_ROW1ADR+1);
break;
}
case 3: /* day 1-31 */
{
mdate[3]+=1;
if((mdate[0]==0x30)&&(mdate[1]==0x32))
{
if(mdate[3]>0x32)
mdate[3]=0x30;
}
else
if(mdate[3]>0x33)
mdate[3]=0x30;
lcdsenddata(mdate[3]);
lcdsendcommand(LCD_ROW1ADR+3);
break;
}
case 4:
{
mdate[4]+=1;
if(mdate[3]==0x33)
{
if(mdate[4]>0x31)
mdate[4]=0x30;
}
else if(mdate[4]>0x39)
mdate[4]=0x31;
lcdsenddata(mdate[4]);
lcdsendcommand(LCD_ROW1ADR+4);
break;
}
case 6: /* week */
{
mdate[5]+=1;
if(mdate[5]>0x37)
mdate[5]=0x31;
lcdsenddata(mdate[5]);
lcdsendcommand(LCD_ROW1ADR+6);
break;
}
case 8: /*hour */
{
time[0]+=1;
if(time[0]>0x32)
time[0]=0x30;
lcdsenddata(time[0]);
lcdsendcommand(LCD_ROW1ADR+8);
break;
}
case 9:
{
time[1]+=1;
if(time[0]==0x32)
{
if(time[1]>0x33)
time[1]=0x30;
}
else
if(time[1]>0x39)
time[1]=0x30;
lcdsenddata(time[1]);
lcdsendcommand(LCD_ROW1ADR+9);
break;
}
case 11: /*minute*/
{
time[3]+=1;
if(time[3]>0x35)
time[3]=0x30;
lcdsenddata(time[3]);
lcdsendcommand(LCD_ROW1ADR+11);
break;
}
case 12:
{
time[4]+=1;
if(time[4]>0x39)
time[4]=0x30;
lcdsenddata(time[4]);
lcdsendcommand(LCD_ROW1ADR+12);
break;
}
case 14: /*second*/
{
time[6]+=1;
if(time[6]>0x35)
time[6]=0x30;
lcdsenddata(time[6]);
lcdsendcommand(LCD_ROW1ADR+14);
break;
}
case 15:
{
time[7]+=1;
if(time[7]>0x39)
time[7]=0x30;
lcdsenddata(time[7]);
lcdsendcommand(LCD_ROW1ADR+15);
break;
}
} /* end switch */
} /* end if(row==0) */
if(row==1) /* set the year */
{
switch(keyflag)
{
case 2:
{
y1+=1;
if(y1>0x32)
y1=0x31;
lcdsenddata(y1);
lcdsendcommand(LCD_ROW2ADR+2);
break;
}
case 3:
{
y2+=1;
if(y1==0x31)
{
if(y2>0x39)
y2=0x30;
}
else
y2=0x30;
lcdsenddata
51电子钟(LCD1602,PCF8563)
5星 · 超过95%的资源 需积分: 31 106 浏览量
2010-04-04
23:30:07
上传
评论 7
收藏 50KB RAR 举报
river0351
- 粉丝: 4
- 资源: 16
最新资源
- 计算机生产实习:OA后台管理(web前端+Java后端)压缩文件包
- greenplum6.10安装时缺失的fpm包
- 缺陷检测-轻量化PCB表面缺陷检测算法实现-工业视觉+六大缺陷检出-优质项目实战.zip
- JAVA 中的Spring框架介绍包括起源、体系结构、核心部分、特点等
- 2024年小米汽车产业链分析及新品上市全景洞察报告
- 基于Qt和C++实现的偏3D风格的异型窗体界面操作+源码(期末大作业&课设&项目开发)
- 基于yolov8的花卉分类系统,包含训练好的权重和推理代码,GUI界面,支持图片、视频、摄像头输入,支持检测结果导出
- 基于图形化编程的单片机教学案例研究
- 基于matlab语音识别的信号灯图像模拟控制技术代码19
- ET200SP-GSD文件-GSDML-V2.43-Siemens-ET200SP-20240209.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页