您的位置:首页 > 其它

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

2012-05-13 12:42 134 查看
硬件连线:



软件实现

:

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

}

}

}

}

总结:程序中没有加延迟去抖,但实验现象正常。原因可能跟这个程序本身要实现的功能有关,需注意,在其他地方不一定就不需要了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: