51单片机数码管显示矩阵键盘的按键,电路图如下:

发布网友 发布时间:2022-04-22 04:59

我来回答

2个回答

热心网友 时间:2023-05-21 16:38

/*功能:矩阵按键识别,每按一次响一声,用数码管显示0——F键值 */
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit sound=P3^6;

uchar code tab[]=
{
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xA7,/*c*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
0xBF /*-*/
};

void delay1ms(uint z)//f=12MHz
{
uint x,y;
for(x=0;x<z;x++)
{
for(y=0;y<115;y++);
}
}

uchar scan_key(void)
{
uchar temp,key_code;
P1=0xf0;
temp=P1;
if(temp!=0xf0)//是否有键被按下
{
delay1ms(15);
if(temp!=0xf0)
{
P1=0xfe; //扫描第一行
temp=P1;
switch(temp)
{
case 0xee:key_code=0;break;
case 0xde:key_code=1;break;
case 0xbe:key_code=2;break;
case 0x7e:key_code=3;break;
}

P1=0xfd;//扫描第2行
temp=P1;
switch(temp)
{
case 0xed:key_code=4;break;
case 0xdd:key_code=5;break;
case 0xbd:key_code=6;break;
case 0x7d:key_code=7;break;
}

P1=0xff;
P1=0xfb;//扫描第3行
temp=P1;
switch(temp)
{
case 0xeb:key_code=8;break;
case 0xdb:key_code=9;break;
case 0xbb:key_code=10;break;
case 0x7b:key_code=11;break;
}

P1=0xff;
P1=0xf7;//扫描第4行
temp=P1;
switch(temp)
{
case 0xe7:key_code=12;break;
case 0xd7:key_code=13;break;
case 0xb7:key_code=14;break;
case 0x77:key_code=15;break;
}
}
}
else
key_code=16;

return key_code;
}

void disp(uchar x,uchar m)
{

uchar temp=0xfe;
P0=tab[x];
P2=_crol_(temp,m);

}

void beep(void)
{
sound=~sound;
delay1ms(1);
}

void main()
{
uchar key_value=16,i;
uchar n=0;//用于记录按键次数
while(1)
{
key_value=scan_key(); //0
if(key_value!=16)//判断是否有键被按下
{
if(n<7)
n++;
else
n=0;
for(i=0;i<150;i++)
beep();
disp(key_value,n);//
}
while(scan_key()==key_value); //松手检测

}
}

热心网友 时间:2023-05-21 16:39

看看:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ac1d2663581b3bc9e6113a41.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com