51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能

51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能,第1张

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单片机矩阵键盘按一个键后其他键才有用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10642210.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存