一个用JX-TX-1C实验板制作的24小时以内的时间显示或者倒数计数模式的闹钟

#include<reg52.h>
#define uchar unsigned char
#define ul unsigned long

sbit d1=P1^0;
sbit dula=P2^6;//声明锁存器U1的锁存端
sbit wela=P2^7;//声明锁存器U2的锁存端
sbit beep=P2^3;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;

uchar code table[]=
{
	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
uchar code tablwe[]=
{
	  0xdf,0xef,0xf7,0xfb,0xfd,0xfe
};
int count,hour10,hour,min10,min,s10,s,shuzi1,shuzi2,wei,num,judge,
    hour10t,hourt,min10t,mint,s10t,st,shuzi1t,shuzi2t,modkey;
uchar temp,temp1;

void delayms(int);
void wedu(int,int);
void display();
void keyscan1();

void initial()
{
	TMOD=0x01; 
	TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;	
	EA=1;
	ET0=1;
	TR0=0;
	hour10=2;
	hour=3;
	min10=5;
	min=9;
	s10=5;
	s=9;
	hour10t=0;
	hourt=0;
	min10t=0;
	mint=0;
	s10t=0;
	st=0;
	modkey=0;	
}

void mode()
{
	P3=0xff;
	if(key1==0)
		{
			delayms(10);
			if((key1==0))
			{
				d1=0;
				beep=0;
				modkey=!modkey;
				//TR0=0;
			}
			while(!key1);
			delayms(5);
			while(!key1);
		}
	else
	{
		d1=1;
		beep=1;
	}	
}

void stasto()
{
	P3=0xff;
	if(key2==0)
		{
			delayms(10);
			if((key2==0))
			{
				d1=0;
				beep=0;
				TR0=~TR0;
			}
			while(!key2);
			delayms(5);
			while(!key2);
		}
	else
	{
		d1=1;
		beep=1;
	}	
}

void resetall()
{
	if(modkey==0)
	{
		if(TR0==0)
		{
			P3=0xff;
			if(key3==0)
			{
				delayms(10);
				if(key3==0)
				{
				 	d1=0;
					beep=0;
					st=0;
					s10t=0;
					mint=0;
					min10t=0;
					hourt=0;
					hour10t=0;
				}
				while(!key3);
				delayms(5);
				while(!key3);
			}
			else
			{
				d1=1;
				beep=1;
			}
	
			P3=0xff;
			if(key4==0)
			{
				delayms(10);
				if(key4==0)
				{
				 	d1=0;
					beep=0;
					st=9;
					s10t=5;
					mint=9;
					min10t=5;
					hourt=3;
					hour10t=2;
				}
				while(!key4);
				delayms(5);
				while(!key4);
			}
			else
			{
				d1=1;
				beep=1;
			}
		}
	}	


	if(modkey==1)
	{
		if(TR0==0)
		{
			P3=0xff;
			if(key3==0)
			{
				delayms(10);
				if(key3==0)
				{
				 	d1=0;
					beep=0;
					s=0;
					s10=0;
					min=0;
					min10=0;
					hour=0;
					hour10=0;
				}
				while(!key3);
				delayms(5);
				while(!key3);
			}
			else
			{
				d1=1;
				beep=1;
			}
	
			P3=0xff;
			if(key4==0)
			{
				delayms(10);
				if(key4==0)
				{
				 	d1=0;
					beep=0;
					s=9;
					s10=5;
					min=9;
					min10=5;
					hour=3;
					hour10=2;
				}
				while(!key4);
				delayms(5);
				while(!key4);
			}
			else
			{
				d1=1;
				beep=1;
			}
		}
	}
}

void main()
{
	initial();
	while(1)//程序在此处不停地对数码管进行动态扫描等待中断发生数码管示数发生变化
	{
		mode();
		stasto();
		keyscan1();
		display();
		resetall();
    	}
}

void display()
{
	if(modkey==0)
	{
		for(wei=0;wei<6;wei++)
		{
			switch(wei)
			{
				case 0: wedu(st,wei);break;
				case 1: wedu(s10t,wei);break;
				case 2: wedu(mint,wei);break;
				case 3: wedu(min10t,wei);break;
				case 4: wedu(hourt,wei);break;
				case 5: wedu(hour10t,wei);break;
			}	
		}	
	}

	if(modkey==1)
	{
		for(wei=0;wei<6;wei++)
		{
			switch(wei)
			{
				case 0: wedu(s,wei);break;
				case 1: wedu(s10,wei);break;
				case 2: wedu(min,wei);break;
				case 3: wedu(min10,wei);break;
				case 4: wedu(hour,wei);break;
				case 5: wedu(hour10,wei);break;
			}	
		}	
	} 
}

void delayms(int xms)
{
 	int i,j;
	for(i=xms;i>0;i--)
		for(j=1;j>0;j--);
}

void wedu(int shuzi1,int shuzi2)
{
	dula=1;
	P0=table[shuzi1];//送入段选数据
	dula=0;
	P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存器时原来段选数据通过位选锁存器造成混乱	
	wela=1;
	P0=tablwe[shuzi2];//进一步简化
	wela=0;
	P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存器时原来段选数据通过位选锁存器造成混乱
	delayms(150);	
}

void T0_time() interrupt 1
{
	TH0=(65536-45872)/256;//重装初值
        TL0=(65536-45872)%256;
	num++;
	if(num==20)
	{
		num=0;	 
		beep=0;
		delayms(5);
		beep=1;
		delayms(5); 

		if((modkey==0)||(modkey==1))
		{
			st++;
			if(st==10)
			{
				st=0;
				s10t++;
			}
			if(s10t==6)
			{
				s10t=0;
				mint++;
			}
			if(mint==10)
			{
				mint=0;
				min10t++;
			}
			if(min10t==6)
			{
				min10t=0;
				hourt++;
			}
			if(hourt==10)
			{
				hourt=0;
				hour10t++;
			}
			if((hour10t==2)&&(hourt==4))
			{
				hour10t=0;
				hourt=0;
				min10t=0;
				mint=0;
				s10t=0;
				st=0;	
			}			
		}

		if((modkey==0)||(modkey==1))
		{
			s--;
			if(s==-1)
			{
				s=9;
				s10--;
			}
			if(s10==-1)
			{
				s10=5;
				min--;
			}
			if(min==-1)
			{
				min=9;
				min10--;
			}
			if(min10==-1)
			{
				min10=5;
				hour--;
			}
			if(hour==-1)
			{
				hour=9;
				hour10--;
			}
			if(hour10==-1)
			{
				hour10=0;
				hour=0;
				min10=0;
				min=0;
				s10=0;
				s=0;	
				TR0=0;
				judge=1;
				while(judge)
				{
					display();
					hour10=0;
					hour=0;
					min10=0;
					min=0;
					s10=0;
					s=0;
					TR0=0;	
					beep=0;
					delayms(5000);
					beep=1;
					delayms(5000);
					if((key3==0)||(key4==0)||(key1==0)||(key2==0))
						{
							delayms(10);
							if((key3==0)||(key4==0)||(key1==0)||(key2==0))
							{
								TR0=0;
								d1=0;
								beep=0;
								hour10=2;
								hour=3;
								min10=5;
								min=9;
								s10=5;
								s=9;
								judge=0;
							}
							while((!key3)||(!key4)||(!key1)||(!key2));
							delayms(5);
							while((!key3)||(!key4)||(!key1)||(!key2));
						}
					else
					{
						d1=1;
						beep=1;
					}
				}
			}			
		} 		
	
	}
}

void keyscan1()
{

	if(modkey==0)
	{
		if((TR0==0))
		{
			P3=0xfb;
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				delayms(10);
				temp1=P3;
				temp1=temp1&0xf0;
				if(temp1!=0xf0)
				{
					temp1=P3;
					switch(temp1)
					{
						case 0xeb:
				 				d1=0;
								beep=0;
								mint++;
								if(mint==10) 
								{
									mint=0;
									min10t++;
									if(min10t==6) min10t=0;
								}
								break;
						case 0xdb:
				 				d1=0;
								beep=0;
								mint--;
								if(mint==-1) 
								{
									mint=9;
									min10t--;
									if(min10t==-1) min10t=5;
								}
								break;
						case 0xbb:
				 				d1=0;
								beep=0;
								mint=0;
								min10t=0;
								break;
						case 0x7b:
				 				d1=0;
								beep=0;
								mint=9;
								min10t=5;
								break;
					}
					while(temp1!=0xf0)
					{
						temp1=P3;
						temp1=temp1&0xf0;
					}
				}
		
			}
		
			P3=0xfd;
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				delayms(10);
				temp1=P3;
				temp1=temp1&0xf0;
				if(temp1!=0xf0)
				{
					temp1=P3;
					switch(temp1)
					{
						case 0xed:
				 				d1=0;
								beep=0;
								hourt++;
								if(hourt==10) 
								{
									hourt=0;
									hour10t++;
								}
								if((hour10t==2)&&(hourt==4)) 
								{
									hour10t=0;
									hourt=0;
								}
								break;
						case 0xdd:
				 				d1=0;
								beep=0;
								hourt--;	    
								if((hour10t==0)&&(hourt==-1)) 
								{
									hour10t=2;
									hourt=3;
								}
								else if((hourt==-1)&&(hour10t!=0)) 
									{
										hourt=9;
										hour10t--;
									}
								break;
						case 0xbd:
				 				d1=0;
								beep=0;
								hourt=0;
								hour10t=0;
								break;
						case 0x7d:
				 				d1=0;
								beep=0;
								hourt=3;
								hour10t=2;
								break;
					}
					while(temp1!=0xf0)
					{
						temp1=P3;
						temp1=temp1&0xf0;
					}
				}
		
			}
	
			P3=0xf7;
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				delayms(10);
				temp1=P3;
				temp1=temp1&0xf0;
				if(temp1!=0xf0)
				{
					temp1=P3;
					switch(temp1)
					{
						case 0xe7:
				 				d1=0;
								beep=0;
								st++;
								if(st==10) 
								{
									st=0;
									s10t++; 	
									if(s10t==6) s10t=0;
								}	
								break;
						case 0xd7:
				 				d1=0;
								beep=0;
								st--;	    
								if(st==-1) 
								{
									st=9;
									s10t--;
									if(s10t==-1) s10t=5;
								}
								break;
						case 0xb7:
				 				d1=0;
								beep=0;
								st=0;
								s10t=0;
								break;
						case 0x77:
				 				d1=0;
								beep=0;
								st=9;
								s10t=5;
								break;
					}
					while(temp1!=0xf0)
					{
						temp1=P3;
						temp1=temp1&0xf0;
					}
				}
		
			}	
		}
	}

	if(modkey==1)
	{
		if((TR0==0))
		{
			P3=0xfb;
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				delayms(10);
				temp1=P3;
				temp1=temp1&0xf0;
				if(temp1!=0xf0)
				{
					temp1=P3;
					switch(temp1)
					{
						case 0xeb:
				 				d1=0;
								beep=0;
								min++;
								if(min==10) 
								{
									min=0;
									min10++;
									if(min10==6) min10=0;
								}
								break;
						case 0xdb:
				 				d1=0;
								beep=0;
								min--;
								if(min==-1) 
								{
									min=9;
									min10--;
									if(min10==-1) min10=5;
								}
								break;
						case 0xbb:
				 				d1=0;
								beep=0;
								min=0;
								min10=0;
								break;
						case 0x7b:
				 				d1=0;
								beep=0;
								min=9;
								min10=5;
								break;
					}
					while(temp1!=0xf0)
					{
						temp1=P3;
						temp1=temp1&0xf0;
					}
				}
		
			}
		
			P3=0xfd;
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				delayms(10);
				temp1=P3;
				temp1=temp1&0xf0;
				if(temp1!=0xf0)
				{
					temp1=P3;
					switch(temp1)
					{
						case 0xed:
				 				d1=0;
								beep=0;
								hour++;
								if(hour==10) 
								{
									hour=0;
									hour10++;
								}
								if((hour10==2)&&(hour==4)) 
								{
									hour10=0;
									hour=0;
								}
								break;
						case 0xdd:
				 				d1=0;
								beep=0;
								hour--;	    
								if((hour10==0)&&(hour==-1)) 
								{
									hour10=2;
									hour=3;
								}
								else if((hour==-1)&&(hour10!=0)) 
									{
										hour=9;
										hour10--;
									}
								break;
						case 0xbd:
				 				d1=0;
								beep=0;
								hour=0;
								hour10=0;
								break;
						case 0x7d:
				 				d1=0;
								beep=0;
								hour=3;
								hour10=2;
								break;
					}
					while(temp1!=0xf0)
					{
						temp1=P3;
						temp1=temp1&0xf0;
					}
				}
		
			}
	
			P3=0xf7;
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				delayms(10);
				temp1=P3;
				temp1=temp1&0xf0;
				if(temp1!=0xf0)
				{
					temp1=P3;
					switch(temp1)
					{
						case 0xe7:
				 				d1=0;
								beep=0;
								s++;
								if(s==10) 
								{
									s=0;
									s10++; 	
									if(s10==6) s10=0;
								}	
								break;
						case 0xd7:
				 				d1=0;
								beep=0;
								s--;	    
								if(s==-1) 
								{
									s=9;
									s10--;
									if(s10==-1) s10=5;
								}
								break;
						case 0xb7:
				 				d1=0;
								beep=0;
								s=0;
								s10=0;
								break;
						case 0x77:
				 				d1=0;
								beep=0;
								s=9;
								s10=5;
								break;
					}
					while(temp1!=0xf0)
					{
						temp1=P3;
						temp1=temp1&0xf0;
					}
				}
		
			}	
		}
	}

		P3=0xfe;
		temp1=P3;
		temp1=temp1&0xf0;
		if(temp1!=0xf0)
		{
			delayms(10);
			temp1=P3;
			temp1=temp1&0xf0;
			if(temp1!=0xf0)
			{
				temp1=P3;
				switch(temp1)
				{
					case 0xee:
					case 0xde:	
					case 0xbe:
					case 0x7e:
							judge=1;
							while(judge)
							{
								//display();
								hour10=0;
								hour=0;
								min10=0;
								min=0;
								s10=0;
								s=0;
								TR0=0;	
								beep=0;
								delayms(5000);
								beep=1;
								delayms(5000);
								if((key3==0)||(key4==0)||(key1==0)||(key2==0))
									{
										delayms(10);
										if((key3==0)||(key4==0)||(key1==0)||(key2==0))
										{
											TR0=0;
											d1=0;
											beep=0;
											hour10=2;
											hour=3;
											min10=5;
											min=9;
											s10=5;
											s=9;
											judge=0;
										}
										while((!key3)||(!key4)||(!key1)||(!key2));
										delayms(5);
										while((!key3)||(!key4)||(!key1)||(!key2));
									}
								else
								{
									d1=1;
									beep=1;
								}
							}
				while(temp1!=0xf0)
				{
					temp1=P3;
					temp1=temp1&0xf0;
				}
				}
		
			}
		}
}

这个程序应用于JX-TX-1C实验板的矩阵键盘和独立键盘的功能如下图所示:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值