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

📄 定时器万年历.txt

📁 定时器实现电子时钟程序
💻 TXT
字号:
#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P1^2;
sbit s1=P3^2;
sbit s2=P0^0;
sbit s3=P0^1;
sbit s4=P3^3;
uchar count,s1num,s4num,clock;
char n=1;
char miao,shi,fen,zhou,clh,clm,clsw,nian=2008,yue=9,ri=15;
uchar code table[]="  2008-09-15 LY CLOCK:OFF";
uchar code table1[]="  00:00:00 MON  00:00";
uchar mon1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
uchar mon2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
uchar week[]={0x4d,0x4f,0x4e,0x54,0x55,0x45,0x57,0x45,0x44,0x54,0x48,0x55,0x46,0x52,0x49,0x53,0x41,0x54,0x53,0x55,0x4e};
uchar kaiguan[]={"OFFON "};

void delay(uint z)  //延时函数z毫秒
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void write_com(uchar com)  //液晶写指令函数
{
	rs=0;
	lcden=0;
	P2=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void write_date(uchar date) //液晶写数据函数
{
	rs=1;
	lcden=0;
	P2=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void init()   //初始化函数
{
	uchar num;
	lcden=0;
	rw=0;
	write_com(0x38);  //显示模式设置:设置16*2显示,5*7点阵,8位数据接口
	write_com(0x0c);  //开显示,不显示光标
	write_com(0x06);  //当读或写一个字符后地址指针加一,且光标加一
	write_com(0x01);  //显示清屏
	 write_com(0x80); 
 	 for(num=0;num<25;num++)
		{
			write_date(table[num]);
			delay(5);
		}
	 write_com(0x80+0x40);
	 for(num=0;num<21;num++)
		{
			write_date(table1[num]);
			delay(5);
		}
	TMOD=0x01;
	TH0=(65536-50000)/256;  //中断时间设置为50ms
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;  //启动定时器,进入定时中断函数
}

void write_sfm(uchar x,uchar y,uchar date)  //时分秒月日显示函数
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	if(y==0)
	write_com(0x80+x);
	if(y==1)
	write_com(0xc0+x);
	write_date(0x30+shi);
	write_date(0x30+ge);
}

void write_nyr(uchar add,uchar date)  //年显示函数
{
	uchar qian,bai,shi,ge;
	qian=date/1000;
	bai=date/100%10;
	shi=date/10%100;
	ge=date%10;
	write_com(0x80+add);
	write_date(0x30+qian);
	write_date(0x30+bai);
	write_date(0x30+shi);
	write_date(0x30+ge);
}

void write_week(char zhou)   //星期显示,字符显示
{
	char l;
	write_com(0x80+0x40+11);
	for(l=0;l<3;l++)
	{
		write_date(week[3*zhou+l]);							
	}	
}

void write_swich(char clsw)  //开关显示:字符显示
{
	char m;
	write_com(0x80+22);
	for(m=0;m<3;m++)
	{
		write_date(kaiguan[3*clsw+m]);
	}
}

void keyscan()  //键盘检测程序:包括选择校时位,加减按钮
{
	
	if(s1==0)	
	{
		delay(5);
		if(s1==0)
		{
							write_com(0x80+12);
							write_date(0x20);
							write_date(0x4c);							
							write_date(0x59);
							write_date(0x20);
							write_com(0x80+10);	
			while(!s1);
			s1num++;
			if((s4num==0)&&(s1num==1))
			{
				TR0=0;
				write_com(0x80+0x40+9);
				write_com(0x0f);
			}
			if((s4num==0)&&(s1num==2))
			{
				write_com(0x80+0x40+6);
			}
			if((s4num==0)&&(s1num==3))
			{
				write_com(0x80+0x40+3);
			}
			if((s4num==0)&&(s1num==4))
			{
				write_com(0x80+0x40+11);
			}
			if((s4num==0)&&(s1num==5))
			{
				write_com(0x80+11);
			}
			if((s4num==0)&&(s1num==6))
			{
				write_com(0x80+8);
			}
			if((s4num==0)&&(s1num==7))
			{
				write_com(0x80+5);
			}
			if((s4num==0)&&(s1num==8))
			{
				s1num=0;
				write_com(0x0c);
				TR0=1;
			}				
		}
	}
		if(s1num!=0)
		{
			if(s2==0)
			{
				delay(5);
				if(s2==0)
				{
					while(!s2);
					if((s4num==0)&&(s1num==1))
					{
						miao++;
						if(miao==60)
							miao=0;
						write_sfm(8,1,miao);
						write_com(0x80+0x40+8);						
						
					}
					if((s4num==0)&&(s1num==2))
					{
						fen++;
						if(fen==60)
							fen=0;
						write_sfm(5,1,fen);
						write_com(0x80+0x40+5);
					}
					if((s4num==0)&&(s1num==3))
					{
						shi++;
						if(shi==24)
							shi=0;
						write_sfm(2,1,shi);
						write_com(0x80+0x40+2);
					}
					if((s4num==0)&&(s1num==4))
					{
						zhou++;
						if(zhou==7)
							zhou=0;
						write_week(zhou);
						write_com(0x80+0x40+11);
					}
					if((s4num==0)&&(s1num==5))
					{
						ri++;
						if(n==1)
						{
							if(ri==mon1[yue-1]+1)
								ri=1;
						}
						if(n==0)
						{
							if(ri==mon2[yue-1]+1)
								ri=1;
						}
						write_sfm(10,0,ri);																				write_nyr(12,ri);
						write_com(0x80+10);
					}
					if((s4num==0)&&(s1num==6))
					{
						yue++;
						if(yue==13)
							yue=1;
						write_sfm(7,0,yue);
						write_com(0x80+7);
					}
					if((s4num==0)&&(s1num==7))
					{
						nian++;
						if((nian%4==0&&nian%100!=0)||(nian%400==0))
						{
							n=1;
							write_com(0x80+13);
							write_date(0x20);
							write_date(0x20);
							write_com(0x80+13);
						}
						else 
						{
							n=0;
							write_com(0x80+13);
							write_date(0x4c);							
							write_date(0x59);
							write_com(0x80+13);
						}
						write_nyr(2,nian);
						write_com(0x80+2);
					}
				}
			}
			if(s3==0)
			{
				delay(5);
				if(s3==0)
				{
					while(!s3);
					if((s4num==0)&&(s1num==1))
					{
				
						miao--;
						if(miao==-1)
							miao=59;
						write_sfm(8,1,miao);
						write_com(0x80+0x40+8);
					}
					if((s4num==0)&&(s1num==2))
					{
						fen--;
						if(fen==-1)
							fen=59;
						write_sfm(5,1,fen);
						write_com(0x80+0x40+5);
					}
					if((s4num==0)&&(s1num==3))
					{
						shi--;
						if(shi==-1)
							shi=23;
						write_sfm(2,1,shi);
						write_com(0x80+0x40+2);
					}
					if((s4num==0)&&(s1num==4))
					{
						zhou--;
						if(zhou==-1)
							zhou=6;
						write_week(zhou);
						write_com(0x80+0x40+11);
					}
					if((s4num==0)&&(s1num==5))
					{
						ri--;
						if(n==1)
						{
							if(ri==0)  
								ri=mon1[yue-1];
						}
						if(n==0)
						{
							if(ri==0)
								ri=mon2[yue-1];
						}
						write_sfm(10,0,ri);																				write_nyr(12,ri);
						write_com(0x80+10);	
					}
					if((s4num==0)&&(s1num==6))
					{
						yue--;
						if(yue==0)
							yue=12;
						write_sfm(7,0,yue);
						write_com(0x80+7);
					}
					if((s4num==0)&&(s1num==7))
					{
						nian--;
						if((nian%4==0&&nian%100!=0)||(nian%400==0))
						{
							n=1;
							write_com(0x80+13);
							write_date(0x20);
							write_date(0x20);
							write_com(0x80+13);
						}
						else 
						{
							n=0;
							write_com(0x80+13);
							write_date(0x4c);							
							write_date(0x59);
							write_com(0x80+13);
						}
						write_nyr(2,nian);
						write_com(0x80+2);
						
					}
				}
			}
		}
}

/*void clockset()
{
	if(s1==0)	
	{
		delay(5);
		if(s1==0)
		{
			while(!s1);
			s1num++;
			if((s4num==1)&&(s1num==1))
			{
				write_com(0x80+0x40+20);
			}
			if((s4num==1)&&(s1num==2))
			{
				write_com(0x80+0x40+17);
			}
			if((s4num==1)&&(s1num==3))
			{
				write_com(0x80+24);
			}
			if((s4num==1)&&(s1num==4))
			{
				s1num=0;
				write_com(0x0c);       //闹钟设置选位
			}
		}
	}
		if(s1num!=0)
		{
			if(s2==0)
			{
				delay(5);
				if(s2==0)
				{
					while(!s2);
					if((s4num==1)&&(s1num==1))
					{
						clm++;
						if(clm==60)
							clm=0;
						write_sfm(0x13,1,clm);
						write_com(0x80+0x40+0x13);						
						
					}
					if((s4num==1)&&(s1num==2))
					{
						clh++;
						if(clh==24)
							clh=0;
						write_sfm(0x10,1,clh);
						write_com(0x80+0x40+0x10);
					}
					if((s4num==1)&&(s1num==3))
					{
						clsw++;
						if(clsw==2)
							clsw=0;
						write_sfm(0x15,0,clsw);
						write_com(0x80+0x15);
					}
				}
			}
			if(s3==0)
			{
				delay(5);
				if(s3==0)
				{
					while(!s3);
					if((s4num==1)&&(s1num==1))
					{
						clm--;
						if(clm==-1)
							clm=59;
						write_sfm(0x13,1,clm);
						write_com(0x80+0x40+0x13);						
						
					}
					if((s4num==1)&&(s1num==2))
					{
						clh--;
						if(clh==-1)
							clh=23;
						write_sfm(0x10,1,clh);
						write_com(0x80+0x40+0x10);
					}
					if((s4num==1)&&(s1num==3))
					{
						clsw--;
						if(clsw==-1)
							clsw=1;
						write_sfm(0x15,0,clsw);
						write_com(0x80+0x15);
					}
				}
			}
		}
}*/


void screenchang()
{
char num;
	if(s4==0)	
	{
		delay(5);
		if(s4==0)
		{	s4num++;
			if(s4num==2)
				s4num=0;
			while(!s4);
			if(s4num==1)
			{
				write_com(0x80);
				for(num=0;num<16;num++)  //整屏移动
				{
					write_com(0x18);
					delay(20);
				}
				write_com(0x06);   
			}
			if(s4num==0)	//恢复定屏
			{
				write_com(0x80+0x32);
				for(num=0;num<16;num++)
				{
					write_com(0x1c);
					delay(20);
				}
					write_com(0x06);
			}	
		}
	}
}

void main()
{
	init();
	while(1)
	{
		screenchang();
		keyscan();
	//	clockset();
		while(((shi==clh)&&(fen==clm))&&(clsw==1))
		{
			clock=0;
			delay(100);
			clock=1;
			delay(100);
		}
		clock=1;
		
	}
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
if(count==18)
		{
			count=0;
			miao++;
			if(miao==60)
			{
				miao=0;
				fen++;
				if(fen==60)
				{
					fen=0;
					shi++;
					if(shi==24)
					{
						shi=0;
						zhou++;
						if(zhou==7)
						{
							zhou=0;
						}
						write_week(zhou);
						ri++;
						write_sfm(11,0,ri);
						if(n==1)
						{
							if(ri==mon1[yue]+1)
							{
								ri=0;
								yue++;
								if(yue==13)
								{
									yue=1;
									nian++;
									if((nian%4==0&&nian%100!=0)||(nian%400==0))
									{
										n=1;//闰年
										write_com(0x80+13);
										write_date(0x4c);
										write_date(0x59);
									}
									else 
									{
										n=0;//非闰年
										write_com(0x80+13);
										write_date(0x20);
										write_date(0x20);
									}
									write_nyr(2,nian);
								}
								write_sfm(7,0,yue);
							}
								
						}
						if(n==0)
						{
							if(ri==mon2[yue]+1)
								ri=0;
								yue++;
								if(yue==13)
								{
									yue=1;
									nian++;
									if((nian%4==0&&nian%100!=0)||(nian%400==0))
									{
										n=1;//闰年
										write_com(0x80+13);
										write_date(0x4c);
										write_date(0x59);
									}
									else 
									{
										n=0;//非闰年
										write_com(0x80+13);
										write_date(0x20);
										write_date(0x20);
									}
									write_nyr(2,nian);
								}
								write_sfm(7,0,yue);
						}																				write_nyr(12,ri);											
					}					
					write_sfm(2,1,shi);
				}
				write_sfm(5,1,fen);
			}
			write_sfm(8,1,miao);			
		}	
}

⌨️ 快捷键说明

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