c52单片机的4*4键盘编码

硬件连线:


 

 

软件实现

:

#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];
}
}
}

}


总结:程序中没有加延迟去抖,但实验现象正常。原因可能跟这个程序本身要实现的功能有关,需注意,在其他地方不一定就不需要了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值