1. 程式人生 > >51微控制器按鍵控制數碼管加減和秒錶

51微控制器按鍵控制數碼管加減和秒錶


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
 
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
sbit du=P2^6;
sbit we=P2^7;
uchar counter,num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };//數碼管的段選

 
uchar code list[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數碼管的位選
 
void delay_ms(uint ms)
{
	uint i;
	uint j;
    for(i=0;i<ms;i++);
    for(j=0;j<200;j++);
}
 
void display(uchar i)
{
	uchar shi,ge;
	shi = i / 10; //取十位
	ge  = i % 10; //求餘,取各位
	
	P0 = 0xff;
	we = 1;
	P0 = list[0]; //點亮第一位數碼管
	we = 0;
 
	du = 1;
	P0 = table[shi];
	du = 0;
	delay_ms(1);
 
	P0 = 0xff;
	we = 1;
	P0 = list[1];//點亮第二位數碼管
	we = 0;
 
	du = 1;
	P0 = table[ge];
	du = 0;
	delay_ms(1);	
}
void init()
{
	TMOD=0x10; 
	TH1=(65535-45827)/256;
	TL1=(65535-45827)%256;  //定時50ms
             //TR1=1;     //啟動定時器
}
 
void key()
{
	if(k1==0)
	{
		delay_ms(10);
		if(k1==0)
		{
			num++;
			if(num==60)
				num=0;
			while(!k1); //等待按鍵釋放
		}
	}
	if(k2==0)
	{
		delay_ms(10);
		if(k2==0)
		{
			if(num==0)
				num=60;
			   	num--;
			while(!k2); //等待按鍵釋放
		}
	}
	if(k3==0)
	{
		delay_ms(10);
		if(k3==0)
		{
			num=0;
			while(!k3); //等待按鍵釋放
		}
	}
	if(k4==0)
	{
		delay_ms(10);
		if(k4==0)
		{	
			init();
			TR1=1;
		
			while(1)
			{	if(TF1==1)
				{
					TF1=0;
					TH1=(65535-45827)/256;
					TL1=(65535-45827)%256;  //定時50ms
					counter++;
				}
				if(counter==20)
			 	{
					counter=0;
					num++;
				}
				if(num==60)
				{
					num=0;
				}
			display(num);	
		}
		 
		}
	}
}
 
void main()
{
	init();
	while(1)
	{	 
		key();
		display(num);
	}
}