单片机按键连接方法总结(五种按键扩展方案详细介绍) | 您所在的位置:网站首页 › feed是什么按键 › 单片机按键连接方法总结(五种按键扩展方案详细介绍) |
http://blog.sina.com.cn/s/blog_634771fd0100hd1h.html 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。 1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。
这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。 2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。
首先好好品味一下这个方案吧,想想怎么来识别按键呢! 首先,我们让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次方)个按键。
上面就是我介绍的五种按键扩展方案,后面几种比较另类,不过也有他们的优点。以上电路我都仿真过,可以实现。 附方案4键盘扫描源代码: sbit line_1=P0.1; sbit line_2=P0.2; sbit line_3=P0.3; sbit line_4=P0.4 char key=0; void key_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=4;return; } } return; }
|
CopyRight 2018-2019 实验室设备网 版权所有 |