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

📄 lcd_clock.c

📁 用Led显示时间,年月日和时分秒。 动态显示的数码管。用定时器控制
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
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};
u8 code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};



u8 flag;
char secondlow,secondhigh,minutelow,minutehigh,hourlow,hourhigh,daylow,dayhigh,monthlow,monthhigh,
	 yearlow,yearsecondlow,yearthirdlow,yearhigh;
u16 tick;
sbit rs=P3^5;
sbit rw=P3^6;
sbit en=P3^7;
sbit mode=P3^0;
sbit up=P3^1;
sbit down=P3^2;
#define lcdcommand 0
#define lcddate 1

char monthofday(char month,int year)//返回月的天数
{
	if(month==2&&year%4==0)
	{
		return(29);	
	}
	else
	{
		return(dayofmonth[month-1]);
	}
}
void delay(u8 z)
{
	u8 x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void timer0()interrupt 1
{
	TMOD=0x01;
	TH0=(65536-5000)/256;
	TL0=(65536-5000)%256;
	TR0=1;
	EA=1;
	tick++;
	if(tick==200)
	{
		tick=0;
		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.month,today.year))
					{
						today.day=1;
						today.month++;
						if(today.month==13)
						{
							today.month=1;
						    today.year++;
							if(today.year==9999)
							{
								today.year=1900;
							}
						}	
					}
				}
			}
		}
	}
}

void write_lcd(bit writestyle,u8 input)
{
	rw=0;
	rs=writestyle;
	_nop_();
	P1=input;
	en=1;
	delay(5);//这一句延时要足够长才行。
	en=0;	
	
}

/*void write_sfr(char second,char minute,char hour,char day,char month,int year)
{

}*/
void initialize()
{
	write_lcd(lcdcommand,0x38);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x01);
	write_lcd(lcdcommand,0x80);
}

void timer0_initialize()
{
	EA=0;
	TMOD=0x01;
	TH0=(65536-5000)/256;
	TL0=(65536-5000)%256;
	ET0=1;
	TR0=1;
	tick=0;
	EA=1;
	
}
void write_second_nocursor()
{
	write_lcd(lcdcommand,0x80+0x40+11);
	write_lcd(lcddate,secondhigh+0x30);
	write_lcd(lcddate,secondlow+0x30);
}
void write_second()
{
	write_lcd(lcdcommand,0x80+0x40+11);
	write_lcd(lcddate,secondhigh+0x30);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0e);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcddate,secondlow+0x30);
}
void write_minute()
{
	write_lcd(lcdcommand,0x38);
	write_lcd(lcdcommand,0x80+0x40+8);
	write_lcd(lcddate,minutehigh+0x30);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0e);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcddate,minutelow+0x30);
	write_lcd(lcddate,0x30+10);//加上冒号
}
void write_hour()
{
	write_lcd(lcdcommand,0x80+0x40+5);
	write_lcd(lcddate,hourhigh+0x30);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0e);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcddate,hourlow+0x30);
	write_lcd(lcddate,0x30+10);//加上冒号
}
void write_day()
{
	write_lcd(lcdcommand,0x80+12);
	write_lcd(lcddate,dayhigh+0x30);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0e);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcddate,daylow+0x30);
}
void write_month()
{
	write_lcd(lcdcommand,0x80+9);
	write_lcd(lcddate,monthhigh+0x30);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0e);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcddate,monthlow+0x30);
}
void write_year()
{
	write_lcd(lcdcommand,0x80+4);
	write_lcd(lcddate,yearhigh+0x30);
	write_lcd(lcddate,yearthirdlow+0x30);
	write_lcd(lcddate,yearsecondlow+0x30);
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0e);
	write_lcd(lcdcommand,0x0c);//这三句用来在最末位显示光标
	write_lcd(lcddate,yearlow+0x30);
}
void keyscan()
{
	if(mode==0)
	{
		delay(20);
		if(mode==0)
		{
			flag++;
			if(flag==7)
			{
				flag=0;
			}
		}
		while(!mode);
	}
	if(flag==6)
	{
		TR0=0;
		write_lcd(lcdcommand,0x0c);
		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);
		}
		write_second();
		TR0=1;
	}
	if(flag==5)
	{
		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);	
		}
		write_minute();
		write_second_nocursor();
	}

	if(flag==4)
	{
		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.minute==-1)
				{
					now.minute=23;
				}
			}
			while(!down);	
		}
		write_hour();
		write_second_nocursor();
	}	

	if(flag==3)
	{
		if(up==0)
		{
			delay(20);
			if(up==0)
			{
				today.day++;
				if(today.day==monthofday(today.month,today.year))
				{
					today.day=1;
				}
			}
			while(!up);
		}	
		if(down==0)
		{
			delay(20);
			if(down==0)
			{
				today.day--;
				if(today.day==0)
				{
					today.day=monthofday(today.month,today.year);
				}
			}
			while(!down);	
		}
		write_day();
		write_second_nocursor();
	}

	if(flag==2)
	{
		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);	
		}
		write_month();
		write_second_nocursor();
	}

	if(flag==1)
	{
		if(up==0)
		{
			delay(20);
			if(up==0)
			{
				today.year++;
				if(today.year==9999)
				{
					today.year=0;
				}
			}
			while(!up);
		}	
		if(down==0)
		{
			delay(20);
			if(down==0)
			{
				today.year--;
				if(today.year==1899)
				{
					today.year=9999;
				}
			}
			while(!down);	
		}
		write_year();
		write_second_nocursor();
	}
}

void calculate()
{
	secondlow=now.second%10;
	secondhigh=now.second/10;
	minutelow=now.minute%10;
	minutehigh=now.minute/10;
	hourlow=now.hour%10;
	hourhigh=now.hour/10;
	daylow=today.day%10;
	dayhigh=today.day/10;
	monthlow=today.month%10;
	monthhigh=today.month/10;
	yearlow=today.year%10;
	yearsecondlow=today.year/10%10;
	yearthirdlow=today.year/100%10;
	yearhigh=today.year/1000;	
}

void write_sfr()
{
	write_lcd(lcdcommand,0x06);
	write_lcd(lcdcommand,0x0c);
	write_lcd(lcdcommand,0x80+4);
	write_lcd(lcddate,yearhigh+0x30);
	write_lcd(lcddate,yearthirdlow+0x30);
	write_lcd(lcddate,yearsecondlow+0x30);
	write_lcd(lcddate,yearlow+0x30);
	write_lcd(lcdcommand,0x80+9);
	write_lcd(lcddate,monthhigh+0x30);
	write_lcd(lcddate,monthlow+0x30);
	write_lcd(lcdcommand,0x80+12);
	write_lcd(lcddate,dayhigh+0x30);
	write_lcd(lcddate,daylow+0x30);
	write_lcd(lcdcommand,0x80+0x40+5);
	write_lcd(lcddate,hourhigh+0x30);
	write_lcd(lcddate,hourlow+0x30);
	write_lcd(lcddate,0x30+10);//加上冒号
	write_lcd(lcdcommand,0x80+0x40+8);
	write_lcd(lcddate,minutehigh+0x30);
	write_lcd(lcddate,minutelow+0x30);
	write_lcd(lcddate,0x30+10);//加上冒号
    write_lcd(lcdcommand,0x80+0x40+11);
	write_lcd(lcddate,secondhigh+0x30);
	write_lcd(lcddate,secondlow+0x30);
}
void main()
{
	initialize();
	timer0_initialize();
	while(1)//不加这一句while()循环,光标会一直在闪。
	{
		calculate();
		keyscan();
		if(flag==0)
		{
			write_sfr();
		}
	}

}


		   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -