单片机按键识别方法之一C语言源程序

单片机按键识别方法之一C语言源程序,第1张

void main(void)

{

while(1)

{

if(P3_7==0)//判断是否有按下,为0则按下

{

delay10ms()//延时10MS,去抖动

if(P3_7==0)//再次判断,如果还为0则真的按下了。

{

count++//每按下一次就加1

if(count==16)//加到16返回0

{

count=0

}

P1=~count//P1口把按下的次数输出,如第一次就是11111110,第二次就是11111101:十六进制转成IO口的二进制

while(P3_7==0)//直到按键放开才判断下一次按键

}

}

}

P3=0xfe//P3=0b1111 1110,令P3.0=0,同时令高四位为高电平,作好读端口准备(51IO特点)

temp=P3//读回P3口的状态

temp=temp&0xf0//temp&1111 0000,0与任何数结果为0,把temp变量的低四位屏蔽了,高四位因为任何数与1等于它本身,所以把高四位对应的端口状态读进来。

while(temp!=0xf0) //上步处理后,高四为不全为1,说明有按键按下(结合矩阵键盘的电路结构才能理解,这里不方便上图)

{

delay(5)

temp=P3

temp=temp&0xf0//这三句跟上面重复,功能是软件消抖

while(temp!=0xf0) //延时一段时间后判断还有按键按下,说明是真有按键按下,进入按键扫描与键值的判断,否则可能是意外抖动引起的,就不进行按键扫描。

{

temp=P3

switch(temp).....

我想注释完应该能读懂,关键是要理解矩阵键盘的扫描原理。

有独立键盘和距阵键盘的 独立键盘的很简单我就不写了 距阵的我给你写一个

//键盘扫描

uchar Keys_Scan()

{

uchar sCode,kCode,i,k

//低4 位置0,放入4 行

P1=0xf0

//若高4 位出现0,则有键按下

if((P1&0xf0)!=0xf0)

{

DelayMS(2)

if((P1&0xf0)!=0xf0)

{

sCode=0xfe//行扫描码初值

for(k=0k<4k++) //对4 行分别进行扫描

{

P1=sCode

if((P1&0xf0)!=0xf0)

{

kCode=~P1

for(i=0i<16i++) //查表得到按键序号并返回

if(kCode==KeyCodeTable[i])

return(i)

}

else

sCode=_crol_(sCode,1)

}

}

}

return(-1)


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存