?? clock.c
字號:
#include <reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit mode=P3^0;
sbit up=P3^1;
sbit down=P3^2;
u8 a=0x00,flag;
char seconddi,secondgao,minutedi,minutegao,hourdi,hourgao,daydi,daygao,
monthdi,monthgao,yeardi,yeardiyi,yeardier,yeargao;
u16 tick;
u8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
u8 code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
typedef struct {
char hour;
char minute;
char second;
}time;
typedef struct {
int year;
char month;
char day;
}date;
date today={2008,02,25};
time now={23,59,00};
void delay(u16 z)
{
u16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(u16 year,u8 month,u8 day,u8 hour,u8 minute,u8 second)
{
seconddi=second%10;
secondgao=second/10;
minutedi=minute%10;
minutegao=minute/10;
hourdi=hour%10;
hourgao=hour/10;
daydi=day%10;
daygao=day/10;
monthdi=month%10;
monthgao=month/10;
yeardi=year%10;
yeardiyi=year/10%10;
yeardier=year/100%10;
yeargao=year/1000;
if(flag==1)
{
P0=table[seconddi];
P1=0x04&a;
delay(1);
P0=0xff;//每次送完段碼后如果不關閉顯示,就不能正常的仿真(很重要)
P0=table[secondgao];
P1=0x08&a;
delay(1);
P0=0xff;
}
else
{
P0=table[seconddi];
P1=0x04;
delay(1);
P0=0xff;//每次送完段碼后如果不關閉顯示,就不能正常的仿真(很重要)
P0=table[secondgao];
P1=0x08;
delay(1);
P0=0xff;
}
if(flag==2)
{
P0=table[minutedi];
P1=0x10&a;
delay(1);
P0=0xff;
P0=table[minutegao];
P1=0x20&a;
delay(1);
P0=0xff;
}
else
{
P0=table[minutedi];
P1=0x10;
delay(1);
P0=0xff;
P0=table[minutegao];
P1=0x20;
delay(1);
P0=0xff;
}
if(flag==3)
{
P0=table[hourdi];
P1=0x40&a;
delay(1);
P0=0xff;
P0=table[hourgao];
P1=0x80&a;
delay(1);
P1=0x00;//必須加上這一句否則時顯示8
P0=0xff;
}
else
{
P0=table[hourdi];
P1=0x40;
delay(1);
P0=0xff;
P0=table[hourgao];
P1=0x80;
delay(1);
P1=0x00;//必須加上這一句否則時顯示8
P0=0xff;
}
if(flag==4)
{
P0=table[daydi];//日低
P2=0x01&a;
delay(1);
P0=0xff;
P0=table[daygao];//日高
P2=0x02&a;
delay(1);
P0=0xff;
}
else
{
P0=table[daydi];//日低
P2=0x01;
delay(1);
P0=0xff;
P0=table[daygao];//日高
P2=0x02;
delay(1);
P0=0xff;
}
if(flag==5)
{
P0=table[monthdi];//月低
P2=0x04&a;
delay(1);
P0=0xff;
P0=table[monthgao];//月高
P2=0x08&a;
delay(1);
P0=0xff;
}
else
{
P0=table[monthdi];//月低
P2=0x04;
delay(1);
P0=0xff;
P0=table[monthgao];//月高
P2=0x08;
delay(1);
P0=0xff;
}
if(flag==6)
{
P0=table[yeardi];//年
P2=0x10&a;
delay(1);
P0=0xff;
P0=table[yeardiyi];
P2=0x20&a;
delay(1);
P0=0xff;
P0=table[yeardier];
P2=0x40&a;
delay(1);
P0=0xff;
P0=table[yeargao];
P2=0x80&a;
delay(1);
P2=0x00;//必須加上這一句否則年最高位顯示8
P0=0xff;
}
else
{
P0=table[yeardi];//年
P2=0x10;
delay(1);
P0=0xff;
P0=table[yeardiyi];
P2=0x20;
delay(1);
P0=0xff;
P0=table[yeardier];
P2=0x40;
delay(1);
P0=0xff;
P0=table[yeargao];
P2=0x80;
delay(1);
P2=0x00;//必須加上這一句否則年最高位顯示8
P0=0xff;
}
}
char monthofday(char year,char month)
{
if(month==2&&year%4==0)
{
return(29);
}
else
{
return(dayofmonth[month-1]);
}
}
void timer0()interrupt 1
{
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TR0=1;
tick++;
display(today.year,today.month,today.day,now.hour,now.minute,now.second);
if(tick==50)
{
tick=0;
a=~a;//用于讓調整時間的位閃爍
now.second++;
if(now.second==60)
{
now.second=0;
now.minute++;
if(now.minute==60)
{
now.minute=0;
now.hour++;
if(now.hour==24)
{
now.hour=0;
today.day++;
if(today.day>monthofday(today.year,today.month))
{
today.day=1;
today.month++;
if(today.month==13)
{
today.month=1;
today.year++;
}
}
}
}
}
}
}
void timer0_initialize()
{
EA=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
timer0_initialize();
while(1)
{
if(mode==0)//鍵盤掃描
{
delay(20);
if(mode==0)
{
flag++;
if(flag==7)
{
flag=0;
}
while(!mode);
}
}
if(flag==1)
{
if(up==0)
{
delay(20);
if(up==0)
{
now.second++;
if(now.second==60)
now.second=0;
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
now.second--;
if(now.second==-1)
now.second=59;
}
while(!down);
}
}
if(flag==2)
{
if(up==0)
{
delay(20);
if(up==0)
{
now.minute++;
if(now.minute==60)
now.minute=0;
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
now.minute--;
if(now.minute==-1)
now.minute=59;
}
while(!down);
}
}
if(flag==3)
{
if(up==0)
{
delay(20);
if(up==0)
{
now.hour++;
if(now.hour==24)
now.hour=0;
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
now.hour--;
if(now.hour==-1)
now.hour=23;
}
while(!down);
}
}
if(flag==4)
{
if(up==0)
{
delay(20);
if(up==0)
{
today.day++;
if(today.day>monthofday(today.year,today.month))
{
today.day=1;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
today.day--;
if(today.day==1)
{
today.day=monthofday(today.year,today.month);
}
}
while(!down);
}
}
if(flag==5)
{
if(up==0)
{
delay(20);
if(up==0)
{
today.month++;
if(today.month==13)
today.month=1;
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
today.month--;
if(today.month==0)
today.month=12;
}
while(!down);
}
}
if(flag==6)
{
if(up==0)
{
delay(20);
if(up==0)
{
today.year++;
if(today.year==9999)
today.year=1900;
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
today.year--;
if(today.year==1899)
today.year=9999;
}
while(!down);
}
}
// display(today.year,today.month,today.day,now.hour,now.minute,now.second);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -