单片机按键连接方法.docx
《单片机按键连接方法.docx》由会员分享,可在线阅读,更多相关《单片机按键连接方法.docx(7页珍藏版)》请在冰豆网上搜索。
![单片机按键连接方法.docx](https://file1.bdocx.com/fileroot1/2022-12/9/a1b3e89f-eb6d-43db-8754-886b3e5fcf9f/a1b3e89f-eb6d-43db-8754-886b3e5fcf9f1.gif)
单片机按键连接方法
单片机按键连接方法
单片机按键连接方法总结(五种按键扩展方案详细介绍)
单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。
不同的设计方法,有着不同的优缺点。
而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。
接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。
1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。
轮训的方法。
比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。
接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。
这种方案的程序其实也不难。
4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按键。
我相信你了解了之后也会惊奇的。
首先好好品味一下这个方案吧,想想怎么来识别按键呢!
首先,我们让P00到P03全输出高电平。
如果这个时候从P00到P03的任意一个端口检测到低电平,很容易知道是按下了那个键,肯定是s13到s16的其中一个。
如果没有检测到信号,就进行下一次的检测,让P01到P03为高电平,P00为低电平,然后检测P01到P03的状态。
如果P01为低,则按下的是s1,;P02为低,则按下的是s2;P03为低,则按下的是s3。
然后再让P00,P02,P03为高电平,P01为低电平。
同理用上面的方法可以检测出按下的那个按键。
(部分程序源代码会在后面贴出来,阅读代码可以更好理解电路)
5)、接下来这种方案则更为强大。
不过需要用到一个A/D转换器(有的单片机集成有A/D转换器,则更为方便)。
如果A/D转化器的分辨率为n位,理论上是可以扩展2^n(2的n次方)个按键。
这是一种接AD转化器的方案,有两种:
第一种是并联式;第二种是串联式。
在功能上也有些不同。
第一种的话各个电阻值各不相同,当按下不同按键时,进入AD的模拟量是不一样的,通过AD转换,就可以得到按下的是哪个按键。
方式一还可以同时识别多个按键,即可以设置组合键,只要电阻取得合适。
方式二各个电阻可以取一样的,方便计算,但是不能有组合按键。
因为当按下上面的按键后,下面所有按键都会被短路。
(在实际运用中,还需要接地,这里没有画出) 。
前面说理论上可以扩展2^n个按键,这只是理论,因为这里电阻的精度有限,所以实际是不可能的,两个模拟量之间要有足够大的差值,程序才可能准确的分辨。
上面就是我介绍的五种按键扩展方案,后面几种比较另类,不过也有他们的优点。
以上电路我都仿真过,可以实现。
附方案4键盘扫描源代码:
sbitline_1=P0.1;
sbitline_2=P0.2;
sbitline_3=P0.3;
sbitline_4=P0.4
charkey=0;
voidkey_scan()
{
line_1=line_2=line_3=line_4=1;
if(~(line_1&&line_2&&line_3&&line_4))
{
if(line_1==0){key=13;return;}
if(line_2==0){key=14;return;}
if(line_3==0){key=15;return;}
if(line_4==0){key=16;return;}
}
line_2=line_3=line_4=1;
line_1=0;
if(~(line_2&&line_3&&line_4))
{
delay();
if(line_2==0){key=1;return;}
if(line_3==0){key=2;return;}
if(line_4==0){key=3;return;}
}
line_1=line_3=line_4=1;
line_2=0;
if(~(line_1&&line_3&&line_4))
{
delay();
if(line_3==0){key=5;return;}
if(line_4==0){key=6;return;}
}
line_1=line_2=line_4=1;
line_3=0;
if(~(line_2&&line_1&&line_4))
{
delay();
if(line_4==0){key=9;return;}
}
line_4=0;
line_1=line_2=line_3=1;
if(~(line_2&&line_3&&line_1))
{
delay();
if(line_1==0){key=10;return;}
if(line_2==0){key=11;return;}
if(line_3==0){key=12;return;}
}
line_3=0;
line_1=line_2=line_4=1;
if(~(line_2&&line_3&&line_4))
{
delay();
if(line_1==0){key=7;return; }
if(line_2==0){key=8;return; }
}
line_2=0;
line_1=line_3=line_4=1;
if(~(line_2&&line_3&&line_4))
{
delay();
if(line_1==0){key=4;return; }
}
return;
}