硬件连线:
软件实现
:
#include<reg52.h>#define uchar unsigned char;
#define uint unsigned int;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};/*数码管0-f*/
uchar num,tmp;
void main(void)
{
P2=0x7f;//P2数码管位选,低电平有效
P0=0xff;//p0段选,低电平有效
P1=0xff;
while(1)
{
P1=0x7f;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1; // 虽然没有延时,此处必不可少,是为了实时检测按键,以退出while循环
tmp=tmp&0x0f;//下同...
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=3;
break;
case 0x0b:num=7;
break;
case 0x0d:num=11;
break;
case 0x0e:num=15;
break;
default: break;
}
P0=table[num];
}
}
//第二列
P1=0xbf;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=2;
break;
case 0x0b:num=6;
break;
case 0x0d:num=10;
break;
case 0x0e:num=14;
break;
default: break;
}
P0=table[num];
}
}
//第三列
P1=0xdf;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=1;
break;
case 0x0b:num=5;
break;
case 0x0d:num=9;
break;
case 0x0e:num=13;
break;
default: break;
}
P0=table[num];
}
}
//第四列
P1=0xef;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=0;
break;
case 0x0b:num=4;
break;
case 0x0d:num=8;
break;
case 0x0e:num=11;
break;
default: break;
}
P0=table[num];
}
}
}
}
总结:程序中没有加延迟去抖,但实验现象正常。原因可能跟这个程序本身要实现的功能有关,需注意,在其他地方不一定就不需要了。