51单片机键盘应用小程序

用数码管的前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2键一次,数值加1;每按下S3一次,数值减1;每按下S4一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒增加1,再按下S5键,数值停止自动加1,保持原数。<题目来自郭天祥的《新概念51单片机C语言教程》>

#include 
#define uchar unsigned char
#define uint unsigned char
sbit dle = P2^6;
sbit wle =P2^7;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
uchar code dledisplay[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
void printf(uchar x);//打印函数
void Init();//定时器与值初始化函数
void Yanshi(uint);//延时函数
void Danbu();//单步加减函数
void etauto();//自动加函数
uchar num,i;
void main()
{
	Init();//初始化
	while(1)
	{

			if((key1==0)||(key2==0))//判断是否单步执行
			{
				Yanshi(10);
				if((key1==0)||(key2==0))//再次判断,防止误判
				{
					if(TR0==0)//判断是否执行自动操作
					{
						Danbu();//进入单步函数
						while(!(key1&&key2));//当按下防止num值随频率变化
					}
				}
			}
		else if(key3==0)//判断是否归零
		{
			Yanshi(10);
			if(key3==0)//再次判断是否归零
				num=0;
		}
		else if(key4==0)//判断是否自动执行
		{	
			Yanshi(10);
			if(key4==0)//再次判断是否自动执行
			{	i=0;
				TR0=~TR0;//开启或关闭定时器允许位
			while(!key4);}
		}
		printf(num);//num打印
	}
}
void Init()
{
	TMOD = 0x01;
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	IE = 0x82;
	TR0 = 0;
}
void Danbu()
{
	if(key1==0)
	{
		num++;
		if(num==60)
			num=0;
	}	
	else if(key2==0)
	{
		if(num>0)
			num--;
	}	
}
void printf(uchar x)
{
	uchar y;
	y=x/10;
	dle=1;
	P0=dledisplay[y];
	dle=0;
	P0=0xff;
	wle=1;
	P0=0xfe;
	wle=0;
	Yanshi(2);
	y=x%10;
	dle=1;
	P0=dledisplay[y];
	dle=0;
	P0=0xff;
	wle=1;
	P0=0xfd;
	wle=0;
	Yanshi(2);
}
void Yanshi(uint x)
{
	uint y;
	for(x;x>0;x--)
		for(y=250;y>0;y--);
}
void et0() interrupt 1
{
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	i++;
	if(i==20)
	{
		i=0;
		num++;
		if(num==60)
		num=0;
	}
}

代码是自己敲的,希望有大佬们多多批评指正

你可能感兴趣的:(51单片机,c语言,嵌入式硬件)