AT89C52单片机实现加法计数显示
电路图
电路功能:
- 按键1 :总和+1
- 按键2:总和+2
- 按键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);
}
}
}