步骤为:先读取某个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;
}
}
你这个程序里,按键没有去抖,若按一个键后,手还须多按一会儿,要不就不显示,所以你还要好好改改这个程序,你那个扫描按键的函数想的很好,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)