51单片机时钟
2017-06-21 22:45
246 查看
可以调时间,包括平年润年的情况
#include
#define uchar unsigned char
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit keyen=P2^0;
sbit keyfu=P2^1;
sbit keyjia=P2^2;
sbit keyjian=P2^3;
uchar
year=12,month=2,day=29,week=7;
char hour=23,min=59,sec=50;
uchar count,t,jud;
uchar wek[][3]={"
","Mon","Tue","Wen","Thi","Fri","Sta","Sun"};
void delayms(int a)
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
en=0;
P0=com;
delayms(2);
en=1;
delayms(2);
en=0;
delayms(2);
}
void write_dat(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delayms(2);
en=1;
delayms(2);
en=0;
delayms(2);
}
void write_zfc(uchar *ch)
{
while(*ch!=0)
write_dat(*ch++);
}
void write_nyr(uchar add,uchar
dat)
{
uchar shi=dat/10,ge=dat;
write_com(0x80+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
void write_sfm(uchar add,uchar
dat)
{
uchar shi=dat/10,ge=dat;
write_com(0x80+0x40+add);
writ
4000
e_dat(0x30+shi);
write_dat(0x30+ge);
}
void write_week(uchar dat)
{
write_com(0x80+13);
write_zfc(wek[dat]);
}
void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+2);
write_zfc("20 -
- ");
write_com(0x80+0x40+6);
write_zfc(":
:");
write_nyr(4,year);
write_nyr(7,month);
write_nyr(10,day);
write_week(week);
write_sfm(4,hour);
write_sfm(7,min);
write_sfm(10,sec);
}
int is(uchar year)
{
int temp=20*100+year;
if((temp%4==0&&temp0!=0)||(temp@0==0))
return 1;
return 0;
}
void keyscan()
{
if(keyen==0)
{
jud=1;
delayms(20);
while(!keyen);
TR0=0;
if(t==0)
{
write_com(0x80+0x40+11);
write_com(0x0f);
}
if(t==1)
{
write_com(0x80+0x40+8);
write_com(0x0f);
}
if(t==2)
{
write_com(0x80+0x40+5);
write_com(0x0f);
}
if(t==3)
{
write_com(0x80+13);
write_com(0x0f);
}
if(t==4)
{
write_com(0x80+11);
write_com(0x0f);
}
if(t==5)
{
write_com(0x80+8);
write_com(0x0f);
}
if(t==6)
{
write_com(0x80+5);
write_com(0x0f);
}
t++;
if(t>6)
t=0;
}
if(keyfu==0)
{
delayms(20);
while(!keyfu);
TR0=1;
write_com(0x80+0x40+11);
write_com(0x0c);
jud=t=0;
}
if(jud==1&&keyjia==0)
{
delayms(20);
while(!keyjia);
if(t==1)
{
sec++;
if(sec>59)
sec=0;
write_sfm(10,sec);
write_com(0x80+0x40+11);
}
if(t==2)
{
min++;
if(min>59)
min=0;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(t==3)
{
hour++;
if(hour>23)
hour=0;
write_sfm(4,hour);
write_com(0x80+0x40+5);
}
if(t==4)
{
week++;
if(week>7)
week=1;
write_week(week);
write_com(0x80+13);
}
if(t==5)
{
day++;
if(day>31)
day=1;
write_nyr(10,day);
write_com(0x80+11);
}
if(t==6)
{
month++;
if(month>12)
month=1;
write_nyr(7,month);
write_com(0x80+8);
}
if(t==0)
{
year++;
write_nyr(4,year);
write_com(0x80+5);
}
}
if(jud==1&&keyjian==0)
{
delayms(20);
while(!keyjian);
if(t==1)
{
sec--;
if(sec<0)
sec=59;
write_sfm(10,sec);
write_com(0x80+0x40+11);
}
if(t==2)
{
min--;
if(min<0)
min=59;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(t==3)
{
hour--;
if(hour<0)
hour=23;
write_sfm(4,hour);
write_com(0x80+0x40+5);
}
if(t==4)
{
week--;
if(week<1)
week=7;
write_week(week);
write_com(0x80+13);
}
if(t==5)
{
day--;
if(day<1)
day=31;
write_nyr(10,day);
write_com(0x80+11);
}
if(t==6)
{
month--;
if(month<1)
month=12;
write_nyr(7,month);
write_com(0x80+8);
}
if(t==0)
{
year--;
write_nyr(4,year);
write_com(0x80+5);
}
}
}
void main()
{
t=jud=0;
init_1602();
TMOD=0X10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();
if(count==200)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
week++;
if(week=8)
week=1;
if(is(year)==1)
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case
10:case 12:
if(day>31)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
case 4:case 6:case 9:case
11:
if(day>30)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
default :
if(day>29)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
}
}
else
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case
10:case 12:
if(day>31)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
case 4:case 6:case 9:case
11:
if(day>30)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
default :
if(day>28)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
}
}
write_nyr(10,day);
write_week(week);
}
write_sfm(4,hour);
}
write_sfm(7,min);
}
write_sfm(10,sec);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
count++;
}
#include
#define uchar unsigned char
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit keyen=P2^0;
sbit keyfu=P2^1;
sbit keyjia=P2^2;
sbit keyjian=P2^3;
uchar
year=12,month=2,day=29,week=7;
char hour=23,min=59,sec=50;
uchar count,t,jud;
uchar wek[][3]={"
","Mon","Tue","Wen","Thi","Fri","Sta","Sun"};
void delayms(int a)
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
en=0;
P0=com;
delayms(2);
en=1;
delayms(2);
en=0;
delayms(2);
}
void write_dat(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delayms(2);
en=1;
delayms(2);
en=0;
delayms(2);
}
void write_zfc(uchar *ch)
{
while(*ch!=0)
write_dat(*ch++);
}
void write_nyr(uchar add,uchar
dat)
{
uchar shi=dat/10,ge=dat;
write_com(0x80+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
void write_sfm(uchar add,uchar
dat)
{
uchar shi=dat/10,ge=dat;
write_com(0x80+0x40+add);
writ
4000
e_dat(0x30+shi);
write_dat(0x30+ge);
}
void write_week(uchar dat)
{
write_com(0x80+13);
write_zfc(wek[dat]);
}
void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+2);
write_zfc("20 -
- ");
write_com(0x80+0x40+6);
write_zfc(":
:");
write_nyr(4,year);
write_nyr(7,month);
write_nyr(10,day);
write_week(week);
write_sfm(4,hour);
write_sfm(7,min);
write_sfm(10,sec);
}
int is(uchar year)
{
int temp=20*100+year;
if((temp%4==0&&temp0!=0)||(temp@0==0))
return 1;
return 0;
}
void keyscan()
{
if(keyen==0)
{
jud=1;
delayms(20);
while(!keyen);
TR0=0;
if(t==0)
{
write_com(0x80+0x40+11);
write_com(0x0f);
}
if(t==1)
{
write_com(0x80+0x40+8);
write_com(0x0f);
}
if(t==2)
{
write_com(0x80+0x40+5);
write_com(0x0f);
}
if(t==3)
{
write_com(0x80+13);
write_com(0x0f);
}
if(t==4)
{
write_com(0x80+11);
write_com(0x0f);
}
if(t==5)
{
write_com(0x80+8);
write_com(0x0f);
}
if(t==6)
{
write_com(0x80+5);
write_com(0x0f);
}
t++;
if(t>6)
t=0;
}
if(keyfu==0)
{
delayms(20);
while(!keyfu);
TR0=1;
write_com(0x80+0x40+11);
write_com(0x0c);
jud=t=0;
}
if(jud==1&&keyjia==0)
{
delayms(20);
while(!keyjia);
if(t==1)
{
sec++;
if(sec>59)
sec=0;
write_sfm(10,sec);
write_com(0x80+0x40+11);
}
if(t==2)
{
min++;
if(min>59)
min=0;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(t==3)
{
hour++;
if(hour>23)
hour=0;
write_sfm(4,hour);
write_com(0x80+0x40+5);
}
if(t==4)
{
week++;
if(week>7)
week=1;
write_week(week);
write_com(0x80+13);
}
if(t==5)
{
day++;
if(day>31)
day=1;
write_nyr(10,day);
write_com(0x80+11);
}
if(t==6)
{
month++;
if(month>12)
month=1;
write_nyr(7,month);
write_com(0x80+8);
}
if(t==0)
{
year++;
write_nyr(4,year);
write_com(0x80+5);
}
}
if(jud==1&&keyjian==0)
{
delayms(20);
while(!keyjian);
if(t==1)
{
sec--;
if(sec<0)
sec=59;
write_sfm(10,sec);
write_com(0x80+0x40+11);
}
if(t==2)
{
min--;
if(min<0)
min=59;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(t==3)
{
hour--;
if(hour<0)
hour=23;
write_sfm(4,hour);
write_com(0x80+0x40+5);
}
if(t==4)
{
week--;
if(week<1)
week=7;
write_week(week);
write_com(0x80+13);
}
if(t==5)
{
day--;
if(day<1)
day=31;
write_nyr(10,day);
write_com(0x80+11);
}
if(t==6)
{
month--;
if(month<1)
month=12;
write_nyr(7,month);
write_com(0x80+8);
}
if(t==0)
{
year--;
write_nyr(4,year);
write_com(0x80+5);
}
}
}
void main()
{
t=jud=0;
init_1602();
TMOD=0X10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();
if(count==200)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
week++;
if(week=8)
week=1;
if(is(year)==1)
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case
10:case 12:
if(day>31)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
case 4:case 6:case 9:case
11:
if(day>30)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
default :
if(day>29)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
}
}
else
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case
10:case 12:
if(day>31)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
case 4:case 6:case 9:case
11:
if(day>30)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
default :
if(day>28)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
}
}
write_nyr(10,day);
write_week(week);
}
write_sfm(4,hour);
}
write_sfm(7,min);
}
write_sfm(10,sec);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
count++;
}
相关文章推荐
- 51系列单片机的系统时钟如何产生
- 51单片机-STC89C54波特率以及双时钟探讨
- 51单片机时钟输出
- 时钟一:51单片机用替换的方法在数码管上显示时钟
- 51单片机时钟程序
- 51单片机开发系列四_LED点阵扫描显示
- 51单片机功能模块学习笔记 — 发光二极管
- 飞思卡尔单片机PLL时钟总线模块
- 复习51单片机之如何使用动态内存
- 51单片机中的周期概念
- 51单片机中断学习
- 单片机成长之路(51基础篇) - 010 51单片机的中断系统
- 菜鸟学51单片机之----在笔记本上模拟PC和51串口通信2
- 【手把手教你做智能车】第四节-MCG模块设置单片机的各个时钟
- 51单片机外部中断小练习
- 51单片机课程设计:基于MQ-3的酒精浓度报警器
- 51单片机100次按键
- 51单片机中用中断方式实现串口数据发送与接收
- 51单片机之入门准备
- 【转】51单片机串口程序(C语言版)