发布网友 发布时间: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