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

📄 ʦ

📁 液晶时钟程序及仿真图
💻
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>
#define uchar unsigned char 
#define uint unsigned int
sbit rs=P2^0;
sbit en=P2^1;
sbit s1=P2^2;
sbit s2=P2^3;
sbit s3=P2^4;
sbit s4=P2^5;
sbit beep=P2^7;														   //moshi1:时间设置模式 
sbit irq=P3^2;														   //moshi2:闹钟设置模式
sbit cs=P3^4;														   //moshi3:秒表设置模式
sbit as=P3^5;
sbit rw=P3^6;
sbit ds=P3^7;
uchar num,c,s1num,s3num,s4num,flag,flag1=1,flag2,flag3=1,flag4=1,moshi1,moshi2,moshi3;	 	   
uchar second=0,minute=0,hour=0,day=1,date=1,month=1,year=1;										
uchar a_second,a_minute,a_hour;																
uint  tt;																					
unsigned long shu;
uchar miaobiao_shifen,miaobiao_fen,miaobiao_shimiao,miaobiao_miao,miaobiao_baihao,miaobiao_shihao;
uchar code week[8][3]={"   ","MON","TUS","WEN","THU","FRI","SAT","SUN"};		
uchar code table[]="  20  -  -      ";											
uchar code table1[]="      :  :  ";					//flag=0 液晶显示实时时间     		=1暂停显示						
uchar code table2[]="   SET  ALARM   ";				//flag1=0闹钟响               		=1不响							
uchar code table3[]="   MIAO  BIAO   ";				//flag2=0读并显示上次闹钟设定的时间 =1不读不显示	  	
uchar code table4[]="    00:00:00    ";				//flag3=0液晶显示秒表         		=1不显示				
void delay(uint z)									//flag4=0响一段时间停   再响		=1不响  
{													
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void write_com(uchar com)  //写指令
{
	rs=0;				   //选择指令端	rs为0
	en=0;				   //使能	低
	P1=com;				   //送指令
	delay(1);			   //延时
	en=1;				   //使能	高
	delay(1);			   //延时
	en=0;				   //使能	低
}

void write_date(uchar date)	 //写数据
{
	rs=1;					 //选择数据端 rs为1
	en=0;					 //使能	低
	P1=date;				 //送数据
	delay(1);				 //延时
	en=1;					 //使能	高
	delay(1);				 //延时
	en=0;					 //使能	低
}

void write_ds(uchar add,uchar date)		 //写时钟芯片
{
	cs=0;	
	ds=1;
	rw=1;
	as=1;
	P0=add;
	as=0;
	rw=0;
	P0=date;
	rw=1;
	as=1;
	cs=1;				
}

uchar read_ds(uchar addr)				 //读时钟芯片
{
 	uchar ds_date;
	cs=0;
	rw=1;	
	ds=1;
	as=1;
	P0=addr;
	as=0;
	ds=0;	
	P0=0xFF;	
	ds_date=P0;
	ds=1;
	as=1;
	cs=1;
	return ds_date;	
}

void lcd_init()					  //液晶初始化
{
	en=0;
	write_com(0x38);
	write_com(0x0c);		  //开显示 无光标 不闪烁
	write_com(0x06);		  //指针加1 整屏不移动
	write_com(0x01);		  //清屏
	write_com(0x80);		  //指针指向第一行第一个
	for(num=0;num<16;num++)
	{
		write_date(table[num]);
		delay(1);
	}
	write_com(0x80+0x40);	  //指针指向第二行
	for(num=0;num<12;num++)
	{
		write_date(table1[num]);
		delay(1);
	}
}

void ds_init()				  //DS12CR887初始化
{
	as=0;
	ds=0;
	rw=0;
	write_ds(0x0a,0x20);	  //DS12CR887寄存器A功能设置,开启时钟振荡	
}

void interrupt_init()
{
	TMOD=1;
	TH0=(65536-10000)/256;
	TL0=(65536-10000)%256;
	EA=1;	
	EX0=1;
	IT0=1;//下降沿出发方式
	ET0=1;
}

void set_time()				  //设定时间
{	
	write_ds(0x0b,0x26);      //设置寄存器B
	write_ds(9,0);		      //	年
	write_ds(8,1);		      //	月
	write_ds(7,1);		      //	日
	write_ds(6,1);		      //	星期
	write_ds(4,23);		      //	时
	write_ds(2,59);		      //	分
	write_ds(0,59);		      //	秒
}

void set_alarm()
{
	write_ds(5,0);
	write_ds(3,0);
	write_ds(1,0);
}

void display_sfm(uchar add,uchar date)	    //显示 时分秒
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x04);			   			//指针减1
	write_com(0x80+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
	write_com(0x80+add);
	write_date(0x30+ge);
	write_date(0x30+shi);
}
void display_week(uchar add,uchar date)	    //显示星期
{
	uchar num;
	write_com(0x06);			   			//指针加1
	write_com(0x80+add);
	for(num=0;num<3;num++)
	{
		write_date(week[date][num]);
		delay(1);
	}
}

void display_miaobiao(uchar add)
{
	miaobiao_shifen =shu/100000;
	miaobiao_fen    =shu%100000/10000;
	miaobiao_shimiao=shu%100000%10000/1000;
	miaobiao_miao   =shu%100000%10000%1000/100;
	miaobiao_baihao =shu%100000%10000%1000%100/10;
	miaobiao_shihao =shu%10;
	write_com(0x04);			   			//指针减1
	write_com(0x80+0x40+add);
	write_date(0x30+miaobiao_shihao);	
	write_date(0x30+miaobiao_baihao);
	write_date(':');
	write_date(0x30+miaobiao_miao);
	write_date(0x30+miaobiao_shimiao);
	write_date(':');
	write_date(0x30+miaobiao_fen);
	write_date(0x30+miaobiao_shifen);
}

void time_keyscan()
{
	if(s2==0)
	{
		flag1=1;					   //关闭闹钟
		TR0=0;
	}
	if(moshi1==0)
	{
		if(s1==0)	
		{
			delay(2);
			if(s1==0)
			{
				moshi2=1;
				moshi3=1;
				s1num++;				  //S1按下一次
				flag=1;					  //暂停显示时间
				while(!s1);
				if(s1num==1)
				{
					write_com(0x80+0x40+11); //指针指向 秒的个位
					write_com(0x0f);		 //开显示 开光标 开闪烁
				}		
				if(s1num==2)
				{
					write_com(0x80+0x40+8);	  //指针指向 分的个位
				}
				if(s1num==3)
				{
					write_com(0x80+0x40+5);	  //指针指向 时的个位
				}
				if(s1num==5)
				{
					write_com(0x80+8);	  //指针指向 月的个位
				}
				if(s1num==4)
				{
					write_com(0x80+11);	  //指针指向 日的个位
				}			
				if(s1num==6)
				{
					write_com(0x80+5);	  //指针指向 年的个位
				}
				if(s1num==7)
				{
					write_com(0x80+13);	  //指针指向 星期的第一位
				} 
				if(s1num==8)
				{
					s1num=0;
					write_com(0x0c);		  //开显示 无光标 不闪烁				
					write_ds(9,year);		      //	年
					write_ds(8,month);		      //	月
					write_ds(7,date);		      //	日
					write_ds(6,day);		      //	星期
					write_ds(4,hour);		      //	时
					write_ds(2,minute);		      //	分
					write_ds(0,second);		      //	秒 
					flag=0;
					moshi2=0;
					moshi3=0;
				}
			}				
		}
	}
	if(s1num!=0)						  //s1有按下
	{
		if(s2==0)
		{
			delay(2);
			if(s2==0)
			{
				while(!s2);
				if(s1num==1)
				{
					second++;
					if(second>=60)						 //秒+
						second=0;
					display_sfm(11,second);
					write_com(0x80+0x40+11);			//指针还原到秒的个位
				}																												 
				if(s1num==2)							 //分+
				{
					minute++;
					if(minute>=60)
						minute=0;
					display_sfm(8,minute);
					write_com(0x80+0x40+8);				 //指针还原到分的个位
				}				
				if(s1num==3)							   //时+
				{
					hour++;
					if(hour>=24)
						hour=0;
					display_sfm(5,hour);
					write_com(0x80+0x40+5);				  //指针还原到时的个位
				}
				if(s1num==4)								//日+
				{
					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;							
						}
						display_nyr(11,date);
						write_com(0x80+11);					    //指针还原到日的个位
					}
					else								
					{
						if(year%4==0)
						{
						 	if(date>=30)											   //闰年29天
							{										
								date=1;			
						 	}
							else
							{
								if(date>=29)
								{
									date=1;
								}
							}		
						}
						display_nyr(11,date);
						write_com(0x80+11);							 //指针还原到日的个位
					}
				}
				if(s1num==5)								//月+
				{
					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);					
					write_com(0x80+11);					   //指针指向日的个位
					display_nyr(11,date);	
					write_com(0x80+8);					   //指针还原到月的个位
				}
				if(s1num==6)								//年+
				{
					year++;
					if(year==100)
						year=0;
					display_nyr(5,year);
					write_com(0x80+5);						//指针还原到年的个位
				}
				if(s1num==7)								//星期+
				{
					day++;
					if(day==8)
						day=1;
					display_week(13,day);
					write_com(0x80+13);						//指针还原到年的个位
				}				
			}
		}
			
		if(s3==0)
		{
			delay(2);
			if(s3==0)
			{
				while(!s3);
				if(s1num==1)
				{
					second--;
					if(second==255)						 //秒-
						second=59;
					display_sfm(11,second);
					write_com(0x80+0x40+11);			//指针还原到秒的个位					
				}										 //分-
				if(s1num==2)
				{

⌨️ 快捷键说明

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