
1、在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则的程序就只能执行第一个按键所对应的程序了。这样,就能检测到第二次按键的键值了。
2、例程:
uchar shaomiao(){
uchar l,h;
P1=0xf0;//获取高四位信息。在此低四位接到行。行低电平
l=P1|0x0f;
P1=l;//只把被按下键所在列置低
h=P1|0xf0;
switch(h)
{
case 0xfe:h=0;break;//1111 1110
case 0xfd:h=1;break;
case 0xfb:h=2;break;
case 0xf7:h=3;break;
}
switch(l)
{
case 0xef:l=0;break;//1110 1111
case 0xdf:l=1;break;
case 0xbf:l=2;break;
case 0x7f:l=3;break;
}
P1=0xf0;
/关键问题解决如下/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(50);//防止抖动
}
return(h4+l);
}
#include<reg51h>
#define uchar unsigned char;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P2=0x0f; //发0扫描,列线输入
if ((P2 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P2&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P2=sccode;
if((P2&0x0f)!=0x0f)
{
recode=(P2&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)return;
switch(key)
{
case 0x11:P1=distab[0];break;
case 0x12:P1=distab[1];break;
case 0x14:P1=distab[2];break;
case 0x18:P1=distab[3];break;
case 0x21:P1=distab[4];break;
case 0x22:P1=distab[5];break;
case 0x24:P1=distab[6];break;
case 0x28:P1=distab[7];break;
case 0x41:P1=distab[8];break;
case 0x42:P1=distab[9];break;
case 0x44:P1=distab[10];break;
case 0x48:P1=distab[11];break;
case 0x81:P1=distab[12];break;
case 0x82:P1=distab[13];break;
case 0x84:P1=distab[14];break;
case 0x88:P1=distab[15];break;
default:P1=distab[16];break;
}
}
main()
{
while(1)
{
getkey();
}
}
按键消抖动程序估计有问题,给你看个消抖动的例子程序
while(key1==0)
{
delayms(10);
if(key1==0)
{
num=1;
}
}
可以加个定时器实现你说的功能,首先把矩阵键盘扫描编写成一个独立的函数,比如char keyread(void)(无键按下返回0,否则返回该键的数值) 然后把定时器设置为定时1s(根据你需要按得次数确定时间),主程序直接调用keycan(),当检测到返回值不为0时启动定时器,然后进入while死循环扫描按键,在定时器未到1s前,再次检测到返回该值则标记加1,当定时器到时间时读取标记的值进入按键处理程序,并把标记清零
以上就是关于51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能全部的内容,包括:51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能、单片机AT89C51矩阵键盘C语言程序、怎么用C语言实现51单片机矩阵键盘按一个键后其他键才有用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)