单片机怎么从矩阵键盘中提取一个按键来实现“按一下键切换一个LED灯亮”

单片机怎么从矩阵键盘中提取一个按键来实现“按一下键切换一个LED灯亮”,第1张

可以啊,可以根据按键时间的长短,和高低电平来实现。比如,长按1s为高电平是一个功能,长按2s是另一个功能。
步骤为:先读取某个io口的值,若为高电平(if 按键高电平有效),则延时1s,最后再读取一次该io口的值,若继续为高电平,则调用你要的功能即可。

假设矩阵键盘如上图,LED接P10,按键用S4

ORG 00H

CLR P30

STATAR:

JB P37,$

CLR  P10

JNB P37,$

SETB P10

SJMP  STATAR

END

#include<reg51h>
unsigned char code LED[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xa7};

void delay(unsigned char i)
{
unsigned char j=255;
while(i--);
while(j--)
;
}

int Keyscan()
{

char key,temp; //改动了
P2=0x0f;
delay(1);
temp=P2;
temp=temp&0x0f;
temp=~(temp|0xf0); //int型是两个字节的,所以用charg型的,要不就改成
if(temp==1) //temp=~(temp|0xfff0);
key=4; //同理,下面的也是一样的,,
else if(temp==2)
key=3;

else if(temp==4)
key=2;

else if(temp==8)
key=1;
P2=0x0f;
delay(1);
temp=P2;
temp=temp<<4; //改动了
temp>>=4; //改动了
temp=~(temp|0xf0);
if(temp==0x01)
key=key+8;
else if(temp==0x02)
key=key+4;
else if(temp==0x04)
key=key+0;
return key;

}
main()
{
int i;
while(1)
{
i=Keyscan();
P0=LED[i];

//i=0;

}

}
你这个程序里,按键没有去抖,若按一个键后,手还须多按一会儿,要不就不显示,所以你还要好好改改这个程序,你那个扫描按键的函数想的很好,


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

原文地址: https://outofmemory.cn/yw/13254696.html

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

发表评论

登录后才能评论

评论列表(0条)

保存