51数码管时钟按键调节protues仿真

实现功能:6个按键分别实现秒、分、时的调节(其中秒加按键按下加10s,秒减按键按下减1s),P3.6口的按键按下则不能调节时钟,再按下可调节时钟;此代码提供一个时钟设计的简单思路

仿真电路图 

#include"AT89X51.h"

#define SMG P0//数码管段选口
#define WE P2//数码管位选口

sbit T_up= P3^0;//时钟按键
sbit T_down = P3^1;
sbit Fen_up = P3^2;
sbit Fen_down= P3^3;
sbit Shi_up= P3^4;
sbit Shi_down = P3^5;
sbit key_lock=P3^6;
sbit LED=P1^0;

unsigned char key_flag = 0;//按键标志位
unsigned char m=0;
unsigned char count = 0;
unsigned long int S_Number = 0;
unsigned char shi=0,fen=0,miao=0;
unsigned char gsmg_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0~9与-
	
void display()//数码管显示函数
{	
	switch(m)	 //位选,选择点亮的数码管,
			{
			  case(1):
				WE=0xFE; SMG=gsmg_code[shi/10];break;//显示第7位(左边第一位)
			  case(2):
				WE=0xFD;SMG=gsmg_code[shi%10]; break;//显示第6位
			  case(3):
				WE=0xFB;SMG=gsmg_code[10]; break;//显示第5位
			  case(4):
				WE=0xF7;SMG=gsmg_code[fen/10]; break;//显示第4位
			  case(5):
				WE=0xEF; SMG=gsmg_code[fen%10];break;//显示第3位
			  case(6):
				WE=0xDF;SMG=gsmg_code[10];break;//显示第2位
			  case(7):
				WE=0xBF;SMG=gsmg_code[miao/10]; break;//显示第1位
			  case(8):
				WE=0x7F;SMG=gsmg_code[miao%10]; break;//显示第0位
			  case(9): 
				m=0;break;
		   }
	
}

void t_5ms(void) interrupt 1
{
	TH0 = (65536-5000)/256;//5ms
	TL0 = (65536-5000)%256;
	count++;
	m++;
	if(200==count)
	{
		count = 0;
		S_Number++;
		if(S_Number>=86400)//24*60*60=86400
		{
			S_Number = 0;
		}
		shi = S_Number/3600;
		fen = S_Number%3600/60;
		miao = S_Number%60;
	}
		display();
		if(key_lock==0)//按键锁定,按下不能调节时间
		{
			while(key_lock==0);
			key_flag=~key_flag;
		}
}

void key_accommodation_time()//按键调节时间函数
{	
	  if(0==key_flag)//**************秒钟
		{	
			if(T_up==0)
			{
				while(T_up==0);
				S_Number=S_Number+9;
			}
			else if(T_down==0)
			{
				while(T_down==0);
				S_Number=S_Number-2;
			}
			
		}
	  else
		{	
			if(S_Number>60)
			S_Number=S_Number-60;
		}
		
		if(0==key_flag)//***************分钟
		{
			if(Fen_up==0)
			{
			 	while(Fen_up==0);
	 			S_Number=S_Number+60;
				
			}
			else if(Fen_down==0)
			{
				while(Fen_down==0);
				S_Number=S_Number-60;
			}
			
		}
		else
			{	
				if(S_Number>60)
				S_Number=S_Number-60;
			}
		if(0==key_flag)//***************时钟
		{
			if(Shi_up==0)
			{
			   	while(Shi_up==0);
		 		S_Number=S_Number+3600;
			}
			else if(Shi_down==0)
			{
				while(Shi_down==0);
				S_Number=S_Number-3600;
			}
     	}
		else
		{
			if(S_Number>3600)
			S_Number=S_Number-3600;
		}
}


void main()
{
	TMOD = 0X01;
	TH0 = (65536-5000)/256;
	TL0 = (65536-5000)%256;
	TR0 = 1;
	ET0 = 1;
	EA = 1;
	while(1)
	{	
		key_accommodation_time();
	}			
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值