⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 动态显示的万年历
💻 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 + -