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

📄 ʦ

📁 液晶时钟程序及仿真图
💻
字号:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint unsigned int
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit BEEP=P1^5;
uint tt1;
long shu;
uchar i=0;
uchar k1num,k2num,k3num,tt,ring=1,gap_ring=1,flag_display_time,flag_display_miaobiao=1,flag_beep=1;
uchar moshi1,moshi2,moshi3,a_hour=12,a_minute=0,a_second=0;				   
uchar year=11,month=6,date=8,day=3,hour=11,minute=59,second=50;
uchar code week[7][3]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};
uchar code table []="  20  -  -      ";
uchar code table1[]="      :  :  ";
uchar code table2[]="   SET  ALARM   ";
uchar code table3[]="    ON   OFF    ";
uchar code table4[]="   MIAO  BIAO   ";
uchar code table5[]="    00:00:00    ";
//*******************************************************************************
//液晶读写及初始化
void delay(uint ms)
{							// 延时子程序
	uint i;
	while(ms--)
	{
		for(i = 0; i< 800; i++)		
			_nop_();					
	}
}
uchar lcd_bz()				// 测试LCD忙碌状态
{							
	uchar result;
	rs = 0;
	rw = 1;
	en = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (P0 & 0x80);
	en = 0;
	return result;	
}
void write_com(uchar com)	// 写入指令到LCD
{							
	while(lcd_bz());
	rs = 0;
	rw = 0;
	en  = 0;
	_nop_();
	_nop_();	
	P0 = com;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	en  = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	en  = 0;		
}
void write_date(uchar dat)	
{							// 写入数据到LCD
	while(lcd_bz());
	rs = 1;
	rw = 0;
	en  = 0;
	P0 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	en  = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	en  = 0;	
}
void lcd_pc(uchar pc)		// 液晶指针
{
	write_com(pc|0x80);
}
void display(uchar add,uchar w[])
{
	uchar i=0;
	write_com(0x06);
	delay(1);
	lcd_pc(add);
	while(w[i] !='\0')											
		write_date(w[i++]);
}
void lcd_init()				// 液晶初始化
{
	en=0;
	write_com(0x38);
	delay(1);
	write_com(0x0c);		// 开显示 无光标 不闪烁
	delay(1);
	write_com(0x01);		// 清屏
	delay(1);
	display(0,table);		// 第一行显示日期
	display(0x40,table1);	// 第二行显示时间		
}
//**********************************************************************************
//液晶显示时分秒、年月日
void display_sfm(uchar add,uchar date)	    //显示 时分秒
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x04);			   			//指针减1
	lcd_pc(0x40+add);
	write_date(0x30+ge);
	write_date(0x30+shi);
}
void display_nyr(uchar add,uchar date)	    //显示 年月日
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x04);			   			//指针减1
	lcd_pc(add);
	write_date(0x30+ge);
	write_date(0x30+shi);
}
void display_week(uchar add,uchar date)	    //显示 星期
{
	uchar num;
	write_com(0x06);			   			//指针加1
	lcd_pc(add);
	for(num=0;num<3;num++)
	{
		write_date(week[date][num]);
		delay(4);
	}
}  
void display_miaobiao()
{
	write_com(0x06);			   			//指针减1
	lcd_pc(0x44);
	write_date(0x30+shu/100000);	
	write_date(0x30+shu%100000/10000);
	write_date(':');
	write_date(0x30+shu%100000%10000/1000);
	write_date(0x30+shu%100000%10000%1000/100);
	write_date(':');
	write_date(0x30+shu%100000%10000%1000%100/10);
	write_date(0x30+shu%10);
}  
//*******************************************************************************
//调整时间
uchar second_plus(uchar second_1)
{
	second_1++;
	if(second_1>=60)					
		second_1=0;
	display_sfm(11,second_1);
	lcd_pc(0x4b);
	return second_1;
}
uchar minute_plus(uchar minute_1)
{
	minute_1++;
	if(minute_1>=60)
		minute_1=0;
	display_sfm(8,minute_1);
	lcd_pc(0x48);
	return minute_1;
}
uchar hour_plus(uchar hour_1)
{
	hour_1++;
	if(hour_1>=24)
		hour_1=0;
	display_sfm(5,hour_1);
	lcd_pc(0x45);
	return hour_1;
}
void date_plus()
{
	date++;
	if(month!=2)	 
	{
		switch(month)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:if(date>=32)date=1;break;									
			case 4:
			case 6:
			case 9:
			case 11:if(date>=31)date=1;break;																						
		}
	}
	else								
	{
		if(year%4==0)
		{
		 	if(date>=30)					//闰年29天													
				date=1;					 
		}
		else
		{
			if(date>=29)			
				date=1;		
		}														
	}
	display_nyr(11,date);
	lcd_pc(0x0b);
}
void month_plus()
{
	month++;
	switch(month)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:				break;
		case 13:	month=1;	break;
		case 4:
		case 6:
		case 9:
		case 11:	if(date>=31)date=1;break;
		case 2:		if(year%4==0)				
						if(date>=30)date=1;				
					else				
						if(date>=29)date=1;				
	}
	display_nyr(8,month);					
	lcd_pc(0x0b);					  
	display_nyr(11,date);	
	lcd_pc(0x08);		
}
void year_plus()
{
	year++;
	if(year>=100)
		year=0;
	display_nyr(5,year);
	lcd_pc(0x05);
}
void day_plus()
{
	day++;
	if(day>=7)
		day=0;
	display_week(13,day);
	lcd_pc(0x0d);
}	 

//**********************************************************************************
//键盘扫描
void time_scan()
{
	if(moshi1==0)
	{
		if(k1==0)
		{
			delay(5);
			if(k1==0)
			{
				k1num++;
				while(!k1);
				if(k1num==1)
				{
				    TR0=0;
					moshi2=1;
					moshi3=1;
					flag_display_time=1;
					lcd_pc(0x4b); 	  	//指针指向 秒的个位
					write_com(0x0f);  	//开显示 开光标 开闪烁
				}		
				if(k1num==2)				
					lcd_pc(0x48);	  				
				if(k1num==3)			
					lcd_pc(0x45);	  			
				if(k1num==4)
					lcd_pc(0x0b);	  		
				if(k1num==5)				
					lcd_pc(0x08);	  									
				if(k1num==6)		
					lcd_pc(0x05);	 			
				if(k1num==7)			
					lcd_pc(0x0d);	 				
				if(k1num==8)
				{
					k1num=0;					
					write_com(0x0c);  //开显示 无光标 不闪烁	
					TR0=1;
					flag_display_time=0;
					moshi2=0;
					moshi3=0;		
				}
			}
		}		
		if(k1num!=0)				  
		{
			if(k2==0)
			{
				delay(5);
				if(k2==0)
				{
					while(!k2);
					if(k1num==1)			
						second=second_plus(second);																																				 
					if(k1num==2)							 
						minute=minute_plus(minute);													
					if(k1num==3)							   
						hour=hour_plus(hour);									
					if(k1num==4)										
						date_plus();								
					if(k1num==5)										
						month_plus();																				 			
					if(k1num==6)							
						year_plus();													
					if(k1num==7)										
						day_plus();											
				}
			}					
		}
	}
}
void alarm_scan()
{
	if(moshi2==0)
	{
		if(k2==0)
		{
			delay(5);
			if(k2==0)
			{
				k2num++;
				while(!k2);
				if(k2num==1)
				{
					moshi1=1;
					moshi3=1;
					flag_display_time=1;			
					display(0,table2);				//第一行显示" SET ALARM "				
					display_sfm(5,a_hour);			//第二行显示闹钟时间
					display_sfm(8,a_minute);
					display_sfm(11,a_second);
					lcd_pc(0x4b); 	  				//指针指向 秒的个位
					write_com(0x0f);  				//开显示 开光标 开闪烁						
				}
				if(k2num==2)				
					lcd_pc(0x48);	  				
				if(k2num==3)			
					lcd_pc(0x45);
				if(k2num==4)
				{
					display(0x40,table3);
					if(i==1)
						lcd_pc(0x49);
					else
						lcd_pc(0x44);	
				}
				if(k2num==5)
				{
					k2num=0;
					moshi1=0;
					moshi3=0;					
					write_com(0x0c);  				//开显示 无光标 不闪烁															
					display(0,table);				//第一行显示日期
					display(0x40,table1);												
					display_sfm(5,hour);			//第二行显示实时时间
					display_sfm(8,minute);
					display_sfm(11,second);	
					flag_display_time=0;
					if(i==0)
						flag_beep=0;
					else
						flag_beep=1;
				}		
			}
		}
		if(k2num!=0)
		{
			if(k1==0)
			{
				delay(5);
				if(k1==0)
				{
					while(!k1);
					if(k2num==1)			
						a_second=second_plus(a_second);																																				 
					if(k2num==2)							 
						a_minute=minute_plus(a_minute);													
					if(k2num==3)							   
						a_hour=hour_plus(a_hour);
					if(k2num==4)
					{
						i=!i;
						if(i==1)
							lcd_pc(0x49);
						else
							lcd_pc(0x44);
					}
				}
			}
		}
	}
	if(moshi1==1 && moshi2 && moshi3 == 1)
	{
		if(k1==0||k2==0||k3==0)
		{	
			delay(5);
			if(k1==0||k2==0||k3==0)
			{
				flag_beep=1;
				moshi1=0;
				moshi2=0;
				moshi3=0;
				ring=1;
				gap_ring=1;
				TR1=0;
				tt1=0;
			}
			while(!k1||!k2||!k3);
		}
	}
}  
void miaobiao_scan()
{
	if(moshi3==0)
	{
		if(k3==0)
		{
			delay(10);
			if(k3==0)
			{				
				while(!k3);	
				k3num++;
				moshi1=1;
				moshi2=1;
				flag_display_time=1;
				flag_display_miaobiao=0;
				shu=0;
				TR1=0;
				display(0,table4);
				display(0x40,table5);
			}
			if(k3num==2)
			{
				TR1=0;
				k3num=0;
				flag_display_time=0;
				flag_display_miaobiao=1;
				moshi1=0;
				moshi2=0;
				display(0,table);
			}
		}
		if(k3num!=0)
		{
			if(k1==0)
			{
				delay(10);
				if(k1==0)
				{
					k1num++;
					if(k1num==1)
					{
						TR1=1;
					}
					if(k1num==2)
					{
						k1num=0;
						TR1=0;
					}
				}
			}
			if(k2==0)
			{
				delay(10);
				if(k2==0)
				{
					shu=0;
					TR1=0;
				}
			}
		}
	}
}  
//**************************************************************************************
//日期和星期自动调节
void date_judge(uchar date_num)
{
	if(date>=date_num)											  
	{										
		date=1;
		month++;
		if(month>=13)
		{
			month=1;
			year++;
			if(year>=100)			
				year=0;						
		}		
	}	
}
void date_update()							//日月年自动更新函数
{
	if(month!=2)
	{
		switch(month)		   
		{
			case 1:						 //31天的月份
			case 3:						  
			case 5:
			case 7:
			case 8:
			case 10:									   
			case 12:date_judge(32);	break;																									
			case 4:						 //30天的月份
			case 6:
			case 9:																									
			case 11:date_judge(31);	break;																							
		}
	}	
	else														   
	{
		if(year%4==0)					   //二月份要判断是闰年还是平年
			date_judge(30);
		else
			date_judge(29);
	} 
}
void week_update()				  		  //星期自动更新函数
{
	day++;
	if(day>=7)
	{
		day=0;
	}	
}
void beep()
{
	uchar j=3;
	while(j--)
	{
		BEEP=0;
		delay(10);
		BEEP=1;
		delay(10);
	}
	BEEP=1;
	delay(20);
	j=2;
    while(j--)
	{
		BEEP=0;
		delay(30);
		BEEP=1;
		delay(10);
	}
}
//*************************************************************************************
void main()
{
	lcd_init();
	TMOD=0x11;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
	while(1)
	{
		time_scan();
		alarm_scan();
		miaobiao_scan();
		if(flag_beep==0)
		{
			if(second==a_second && minute==a_minute && hour==a_hour)
			{
				TR1=1;				
				ring=0;
				gap_ring=0;				
			}
		}
		if(ring==0)
		{
			beep();
			moshi1=1;
			moshi2=1;
			moshi3=1;
		}
		if(flag_display_time==0)
		{
			display_nyr(5,year);
			display_nyr(8,month);
			display_nyr(11,date);
			display_week(13,day);
			display_sfm(5,hour);
			display_sfm(8,minute);
			display_sfm(11,second);
		}
		if(flag_display_miaobiao==0)
			display_miaobiao();		  
	}
}					  
void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	tt++;
	if(tt==20)
	{
		tt=0;
		second++;
		if(second>=60)
		{
			second=0;
			minute++;
			if(minute>=60)
			{
				minute=0;
				hour++;
				if(hour>=24)
				{
				    hour=0;
					day++;
					date_update();
					week_update();
				}			    			  
			}								
		}
	} 		
}
void timer1() interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	if(gap_ring==0)
	{
		tt1++;
		if(tt1==100)
			ring=1;
		if(tt1==200)
		{
			ring=0;
			tt1=0;
		}
	}
	shu++;
	if(shu==1000000)
		shu=0;		
}

⌨️ 快捷键说明

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