AT89C52单片机实现加法计数

AT89C52单片机实现加法计数显示

电路图

image-20210923204558102

电路功能:

  1. 按键1 :总和+1
  2. 按键2:总和+2
  3. 按键3:显示清零

思路:

用I/O口点位变化作为总和+1、+2和显示清零的判断条件,并使用数码管显示数字。

代码

#include <AT89X52.H>

typedef unsigned int u16;	  
typedef unsigned char u8;

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//数码管控制代码

sbit button1 = P1^0;
sbit button2 = P1^4;
sbit button3 = P1^7;

void xianshi1(u16 i)//十位数显示函数
{
	switch(i)
	{
		case 0:P0=smgduan[0];break;
		case 1:P0=smgduan[1];break;
		case 2:P0=smgduan[2];break;
		case 3:P0=smgduan[3];break;
		case 4:P0=smgduan[4];break;
		case 5:P0=smgduan[5];break;
		case 6:P0=smgduan[6];break;
		case 7:P0=smgduan[7];break;
		case 8:P0=smgduan[8];break;
		case 9:P0=smgduan[9];break;
	}
};
void xianshi2(u16 i)//个位数显示函数
{
	switch(i)
	{
		case 0:P2=smgduan[0];break;
		case 1:P2=smgduan[1];break;
		case 2:P2=smgduan[2];break;
		case 3:P2=smgduan[3];break;
		case 4:P2=smgduan[4];break;
		case 5:P2=smgduan[5];break;
		case 6:P2=smgduan[6];break;
		case 7:P2=smgduan[7];break;
		case 8:P2=smgduan[8];break;
		case 9:P2=smgduan[9];break;
	}
};
						 
void delay(u16 i)//延迟函数
{
	while(i--);
};


void main()
{	
	u16 sum=0;
	u16 Buffer[2]= {0,0};//分别储存十位数、个位数。
	sum = 0;//储存总和
	P0=0xff;
	P2=0xff;
	P0=smgduan[Buffer[0]];//显示0 0
	P2=smgduan[Buffer[1]];
	while(1)
	{
        /*
        消抖函数
        作用:消除按键按下时产生的电位抖动,
        在我以前的版本中,未使用消抖函数或延迟时间设置的太少,在数码管上显示的时间会变化很大。
        所以消抖函数是必要的。
        */
		if(button1==0)//按键1
		{	
			delay(20000);//消抖函数延迟时间
			if(button1==0)	
			{
				sum++;
				Buffer[0]=sum/10;
				Buffer[1]=sum%10;
				xianshi1(Buffer[0]);
				xianshi2(Buffer[1]);
			}
			if(sum>99)
			{
				sum=0;
			}
		}
		if(button2==0)//按键2
		{	
			delay(20000);
			if(button2==0)	
			{
				sum=sum+2;
				Buffer[0]=sum/10;
				Buffer[1]=sum%10;
				xianshi1(Buffer[0]);
				xianshi2(Buffer[1]);
			}
			if(sum>99)
			{
				sum=0;
			}
		}
		if(button3 == 0)//擦除显示数字,并使总和归零
		{
			sum=0;
			xianshi1(0);
			xianshi2(0);
		}

	}
}


猜你喜欢

转载自blog.csdn.net/GrowlR/article/details/120443409