承接上文,我们来介绍一下按键和数码管的配合工作,由于数码管显示的字符和位数多种多样,无法做到一个字符对应一个按键,所以程序主要记录按键的使用次数来切换数码管的显示。
#include <reg52.h> //包含reg52.h头文件
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极接法
unsigned char Count; //定义变量放置计数数值
sbit KEY=P1^0; //定义KEY为接在P1.0上的按键
sbit KEY1=P1^1;
void delay10ms(void) //定义10ms延时函数
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void main(void)
{
//初始步骤,用于控制上电之后所显示的数字,共三步,数据
Count=0; //计数变量初始为0
P0=table[Count/10]; //十位数码管显示0
P2=table[Count%10]; //个位数码管显示0
while(1) //按键扫描,计数显示处理
{
if(KEY==0) //双if嵌套去抖动
{
delay10ms(); //延时
if(KEY==0)
{
Count++; //计数加1
if(Count==100)
{
Count=0; //计数清零
}
P0=table[Count/10]; //显示十位数
P2=table[Count%10]; //显示个位数
while(KEY==0); //防止不松手等键释放
}
}
//再加一个按键KEY1,按下后会减一
//由于count在-1时重新赋值99.所以count得是有符号的char类型
if(KEY1==0)
{
delay10ms();
if(KEY1==0)
{
Count--;
if(Count==-1)
{
Count=99;
}
P0=table[Count/10];
P2=table[Count%10];
while(KEY1==0);
}
} /*
//加一个KEY2,按下后会清零
if(KEY2==0)
{
delay10ms();
if(KEY2==0)
{
P0=table[0];
P2=table[0];
while(KEY2==0);
}
}
*/
}
}
键盘去抖的方式有很多,不过for循环嵌套应该是最简单的。这类计数装置需要考虑按键释放,要在if内层的最后一行写一个while(1) 。仿真电路如图所示:
按键控制数码管计数器
下面给大家提供一道模拟题:自选外设,根据按键次数显示相应的数字,按下按键9次后清零。
#include <reg52.h> //包含reg52.h头文件
sbit key = P1^0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管的组函数要加code,并且顺序固定
char n;
void Delay() //延时函数
{
unsigned char i, j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
void delay10ms()
{
unsigned char i, j;
for (i=0;i<255;i++)
for (j=0;j<40;j++);
}
void main()
{
n=0;
P2=table[n] ;
while(1)
{
if(key==0)
{
delay10ms();
if(key==0)
{
n++;
if(n==10)
{
n=0;
}
P2=table[n];
while(key==0);
}
}
}
}
上面是笔者的演示代码,用按键控制1只数码管计数,要比0~99计数器简单一些,适合新手入门。分享就到这里,谢谢大家。