/*
液晶显示屏显示时间 : xxxx-xx-xx xxx
xx-xx-xx
可修改时间;
缺陷,无法存贮数据
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define READ 0xa1
#define WRITE 0xa0
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
sbit BUSY=P0^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit beep=P2^3;
sbit SDA=P2^0;
sbit SCL=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uint year,month,day,num;
uint hour,minite,second;
uint mon1[]={31,28,31,30,31,30,31,31,30,31,30,31};
uint mon2[]={31,29,31,30,31,30,31,31,30,31,30,31};
uchar code week[7][3]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
uchar i,j;
uint key,we_ju;
/***************延时*************/
void delay(uint x)
{
uint i,j;
for(i=0;i<110;i++)
for(j=0;j<x;j++);
}
/********************************/
/**************************EEPROM模块**************************************/
/*本来是用来保存时间,但功能无法实现*/
/********************************************************************************/
/*
void delayms(){;;}
void start()
{
SDA=1;
SCL=1;
delayms();
SDA=0;
delayms();
SCL=0;
}
void stop()
{
SDA=0;
SCL=1;
delayms();
SDA=1;
delayms();
SDA=0;
SCL=0;
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dat<<=1;
SCL=0;
delayms();
SDA=CY;
delayms();
SCL=1;
delayms();
}
SCL=0;
delayms();
SDA=1;
delayms();
}
uchar read_byte()
{
uchar i,x;
SCL=0;
delayms();
SDA=1;
delayms();
for(i=0;i<8;i++)
{
SCL=1;
delayms();
x<<=1;
x|=(uchar) SDA;
delayms();
}
return x;
}
void respons()
{
SCL=1;
delayms();
SCL=0;
delayms();
}
void write_add(uchar add,uchar dat)
{
start();
write_byte(WRITE);
respons();
write_byte(add);
respons();
write_byte(dat);
respons();
stop();
delayms();
}
uchar read_add(uchar add)
{
uchar x;
start();
write_byte(WRITE);
respons();
write_byte(add);
respons();
start();
write_byte(READ);
respons();
x=read_byte();
stop();
return x;
}
void write()
{
write_add(0,second%10+'0');
write_add(1,second/10+'0');
write_add(2,minite%10+'0');
write_add(3,minite/10+'0');
write_add(4,hour%10+'0');
write_add(5,hour/10+'0');
write_add(6,day%10+'0');
write_add(7,day/10+'0');
write_add(8,month%10+'0');
write_add(9,month/10+'0');
write_add(10,year%10+'0');
write_add(11,year/10%10+'0');
write_add(12,year/100%10+'0');
write_add(13,year/1000+'0');
}
void read()
{
second=(read_add(0)+read_add(1))-'0';
minite=(read_add(2)+read_add(3))-'0';
hour=(read_add(4)+read_add(5))-'0' ;
day=(read_add(6)+read_add(7))-'0';
month=(read_add(8)+read_add(9))-'0';
year=(read_add(10)+read_add(11)+read_add(12)+read_add(13))-'0';
}
*/
/**************************************************************************/
/***********************闰年判断****************/
int year_juge(uint y)
{
if(y%4==0&&4%100!=0 || y%400==0) return 1;
else return 0;
}
/*********************************************/
/**************判忙************/
void wait()
{
P0=0xff;
do
{
RS=0;
RW=1;
EN=0;
EN=1;
}while(BUSY==1);
EN=0;
}
/*****************************/
/*************写命令********/
void write_cmd(uchar cmd)
{
wait();
EN=0;
P0=cmd;
RS=0;
RW=0;
EN=1;
EN=0;
}
/****************************/
/*************写数据********/
void write_data(uchar dat)
{
wait();
EN=0;
P0=dat;
RS=1;
RW=0;
EN=1;
EN=0;
}
/****************************/
/*************** 日期、时间自然流逝************/
void time_lapses()
{
if(second>=60)
{
second=0;
minite++;
if(minite>=60)
{
minite=0;
hour++;
if(hour>=24)
{
hour=0;
day++;
if(year_juge(year))
{
if(day>=mon2[month])
{
day=0;
month++;
if(month>=12) month=0,year++;
if(year>=9999) year=1;
}
}
else
{
if(day>=mon1[month])
{
day=0;
month++;
if(month>=12) month=0,year++;
if(year>=9999) year=1;
}
}
}
}
}
}
/***************************************************************/
/*************光标闪烁*****************************/
void flicker()
{
if(key==1) write_cmd(0x80+0x4a);
else if(key==2) write_cmd(0x80+0x47);
else if(key==3) write_cmd(0x80+0x44);
else if(key==4) write_cmd(0x80+0x0c);
else if(key==5) write_cmd(0x80+0x0a);
else if(key==6) write_cmd(0x80+0x07);
else if(key==7) write_cmd(0x80+0x04);
if(key!=0) write_cmd(0x0f);
}
/**************************************************/
/***************判断星期几*************************/
uint Week_day(uint y,uint m,uint d)
{
if(m==1||m==2) m+=12,y--;
return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7 ;
}
/************************************************/
/*****************时间显示**********************/
void display_time()
{
we_ju=Week_day(year,month,day);
time_lapses();
write_cmd(0x80+0x01);
write_data(year/1000+'0');
write_data(year/100%10+'0');
write_data(year/10%10+'0');
write_data(year%10+'0');
write_data('-');
write_data(month/10+'0');
write_data(month%10+'0');
write_data('-');
write_data(day/10+'0');
write_data(day%10+'0');
write_data(' ');
for(i=0;i<3;i++) write_data(week[we_ju][i]);
write_cmd(0x80+0x40+0x03);
write_data(hour/10+'0');
write_data(hour%10+'0');
write_data(':');
write_data(minite/10+'0');
write_data(minite%10+'0');
write_data(':');
write_data(second/10+'0');
write_data(second%10+'0');
// write();
}
/************************************************/
/*************自增**********/
void add()
{
if(key==1)
{
second++;
if(second>=60) second=0;
}
else if(key==2)
{
minite++;
if(minite>=60) minite=0;
}
else if(key==3)
{
hour++;
if(hour>=24) hour=0;
}
else if(key==4) we_ju++;
else if(key==5)
{
day++;
if(year_juge(year))
{
if(day>=mon2[month-1]) day=1;
}
else if(day>=mon1[month-1]) day=1;
}
else if(key==6)
{
month++;
if(month>12) month=1;
}
else if(key==7)
{
year++;
if(year>9999) year=1;
}
display_time();
}
/*************************/
/**********自减***********/
void reduce()
{
if(key==1)
{
second--;
if(second<=0) second=59;
}
else if(key==2)
{
minite--;
if(minite<=0) minite=59;
}
else if(key==3)
{
hour--;
if(hour<0) hour=23;
}
else if(key==4) we_ju--;
else if(key==5)
{
day--;
if(day<=0)
{
if(year_juge(year)) day=mon2[month-1];
else day=mon1[month-1];
}
}
else if(key==6)
{
month--;
if(month<=0) month=12;
}
else if(key==7)
{
year--;
if(year<=0) year=9999;
}
display_time();
}
/***************************/
/***************键盘扫描****************/
void keyscan()
{
if(k1==0)
{
delay(10);
beep=0;
if(k1==0)
{
while(!k1);
key++;
if(key==8) key=0;
if(key==0) TR0=1,write_cmd(0x0c);
else TR0=0;
}
beep=1;
}
if(k2==0)
{
delay(10);
beep=0;
if(k2==0)
{
while(!k2);
add();
}
beep=1;
}
if(k3==0)
{
delay(10);
beep=0;
if(k3==0)
{
while(!k3);
reduce();
}
beep=1;
}
}
/**************************************/
/*******************初*始*化****************/
void init()
{
dula=0;
wela=0;
/********定时器初始化*********/
TMOD=0x02;
TH0=6;
TL0=6;
ET0=1;
TR0=1;
EA=1;
/*****************************/
/*******液晶显示屏初始化******/
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);
/***************************/
/*********时间初始化******/
year=2014;
month=7;
day=29;
hour=14;
minite=31;
second=22;
// read();
/************************/
}
/**************************************/
/*************** 主函数 **************/
void main()
{
init();
while(1)
{
keyscan();
if(key==0) display_time();
else flicker();
}
}
/**********************************/
void T0_time() interrupt 1
{
num++;
if(num==4000)
{
num=0;
second++;
}
}