按键按下时按键是给单片机一个低电平。我现在的按键一端接的是电源,按下按键给单片机高电平,怎么改程序

按键按下时按键是给单片机一个低电平。我现在的按键一端接的是电源,按下按键给单片机高电平,怎么改程序,第1张

给你一个大体的思路,你按塌陆照此方法设计流程,然后编写迹衫斗代码:

1、看单片机的datasheet,了解你设置成按键输入的I/O口能否有内部上拉或下拉;

2、把所有的按键检测端口设置成输入口;

3、如果这些输入口能内部上拉或下拉,就把检测高电平的设置成内部下拉,把其他检测低电平的设置成内部上拉。如果没有内部上拉下拉软件设置,就用几十到几百K的电阻,接到电源或姿磨地;

4、扫描按键,检测高电平的输入端电平是否为1,检测其他的低电平的输入端口是否为0,如果条件为真,就有按键按下

5、注意检测输入端电平高低时候,需要几十毫秒的延时再确认,防止按键抖动和电平干扰。

while(!key)

{

P2 = 0xFF

key_press_num++

delay_1ms(10)

if(key_press_num>100) break

}

行列扫描:

unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法

{

unsigned char Val

KeyPort=0xf0//高四位置高,低四位拉低

if(KeyPort!=0xf0)//表示有按键按下

{

DelayMs(10) //去抖

if(KeyPort!=0xf0)

{ //表示有按键按下

KeyPort=0xfe//检测第一行

if(KeyPort!=0xfe)

{

Val=KeyPort&0xf0

Val+=0x0e

while(KeyPort!=0xfe)

DelayMs(10)//去抖

while(KeyPort!=0xfe)

return Val

}

KeyPort=0xfd//检测第二行

if(KeyPort!=0xfd)

{

Val=KeyPort&0xf0

Val+=0x0d

while(KeyPort!=0xfd)

DelayMs(10)//去抖

while(KeyPort!=0xfd)

return Val

}

KeyPort=0xfb//检测第三行

if(KeyPort!=0xfb)

{

Val=KeyPort&0xf0

Val+=0x0b

while(KeyPort!=0xfb)

DelayMs(10)//去抖

while(KeyPort!=0xfb)

return Val

}

KeyPort=0xf7//检测第四行

if(KeyPort!=0xf7)

{

Val=KeyPort&0xf0

Val+=0x07

while(KeyPort!=0xf7)

DelayMs(10)//去抖

while(KeyPort!=0xf7)

return Val

}

}

}

return 0xff

}

反转扫描:

unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法

{

unsigned char cord_h,cord_l//行列值中间变量

KeyPort=0x0f //行线输出全为0

cord_h=KeyPort&0x0f帆早祥 //读入列线值

if(cord_h!=0x0f)//先检测有无按键按下

{

DelayMs(10) //去抖

if((KeyPort&0x0f)!=0x0f)

{

cord_h=KeyPort&0x0f //读入列线值

KeyPort=cord_h|0xf0 //输出睁大当前列线值

cord_l=KeyPort&0xf0 //读入行线值

while((KeyPort&0xf0)!=0xf0)//等待松开并输出

return(cord_h+cord_l)//键盘最后组合码值

}

}return(0xff)//返回该值

}

/*------------------------------------------------

按键值处理函数,态搏返回扫键值

------------------------------------------------*/

unsigned char KeyPro(void)

{

switch(KeyScan())

{

case 0x7e:return 0break//0 按下相应的键显示相对应的码值

case 0x7d:return 1break//1

case 0x7b:return 2break//2

case 0x77:return 3break//3

case 0xbe:return 4break//4

case 0xbd:return 5break//5

case 0xbb:return 6break//6

case 0xb7:return 7break//7

case 0xde:return 8break//8

case 0xdd:return 9break//9

case 0xdb:return 10break//a

case 0xd7:return 11break//b

case 0xee:return 12break//c

case 0xed:return 13break//d

case 0xeb:return 14break//e

case 0xe7:return 15break//f

default:return 0xffbreak

}

}


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

原文地址: http://outofmemory.cn/yw/12336041.html

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

发表评论

登录后才能评论

评论列表(0条)

保存