http://blog.sina.com.cn/s/blog_634771fd0100hd1h.html

单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。

1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。

这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。

2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。


这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。

3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。

这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置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键盘扫描源代码:

sbit line_1=P0.1;sbit line_2=P0.2;sbit line_3=P0.3;sbit line_4=P0.4char 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;
}

单片机按键连接方法总结(五种按键扩展方案详细介绍)相关推荐

  1. Windows Socket五种I/O模型详细介绍(精)

    如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的.Windows操作系统提供了选择(Select).异步选择(WSAAsyncSelect).事件选择(WSAEventSel ...

  2. 小米路由器显示无法连接到服务器,小米路由无法连接WIFI的五种解决方法【图解】...

    越洋帮路由网原创:文章是关于"小米路由无法连接WIFI的五种解决方法[图解]"的相关知识分享,希望可以帮到大家. - 素材来源网络 编辑:小易.小米路由连接WIFI无法上网该怎么办 ...

  3. 在Spring3中,配置DataSource的方法有五种

    在Spring3中,配置DataSource的方法有五种. 第一种:beans.xml Xml代码 <bean id="dataSource" class="org ...

  4. NLP的介绍和如何利用机器学习进行NLP以及三种NLP技术的详细介绍

    文章目录 什么是NLP? 为什么要学习NLP? 深度学习 技术1:文本嵌入(Text Embeddings) 技术2:机器翻译 技术3:会话 易水寒 发表于 2018-06-10 10:26:10 本 ...

  5. Jdbc连接mysql的五种连接方式

    一:五种连接方式 直接上码 package com.wyjedu.jdbc;import com.mysql.jdbc.Driver;import java.io.FileInputStream; i ...

  6. JDBC连接Mysql的五种方式

    测试环境说明 mysql数据库:jdbc:mysql://localhost:3306/test IDE:IDEA 2022 JDK:JDK8 mysql:mysql 5.7 JDBC:5.1.37 ...

  7. 阿里云轻量服务器远程连接方法(三种)

    阿里云轻量应用服务器如何远程链接?轻量服务器远程连接三种方法,浏览器登录阿里云轻量服务器控制台远程连接.SSH客户端密钥连接或者使用账号密码远程连接,阿里云服务器网以阿里云轻量服务器Linux系统为例 ...

  8. mysql 连接方法_MySQL 四种连接方式(通信方式)

    MySQL 有四种连接方式 : 1 . TCP/IP TCP/IP套接字连接方式是MySQL在任何平台都提供的一种连接方式,也是网络中使用最多的一种方式.这种方式在TCP/IP连接上建立一个基于网络的 ...

  9. 键盘拆开重新安装步骤_键盘按键被拆了怎么办 电脑键盘怎么安装【详细介绍】...

    键盘按键被拆了怎么办? 有时候小孩子玩电脑就喜欢东拆拆西拆拆,其中最容易受到伤害的就是键盘了,一不小心键盘按键就被拆了,被拆了不要紧,关键是要怎么安回去呢? 下面,我们就来看看电脑键盘安装教程. 1. ...

最新文章

  1. Promise--感性认知
  2. JQuery:DOM操作
  3. python中是干嘛的-python是做什么的,新手必看哦!
  4. Android Studio 将项目转变成library(model)引入到另一个项目中使用
  5. 如何在Win7以上环境使用VC++6
  6. spring websocket源码分析
  7. linux杀气所以进程,Linux使用kill命令的注意事项
  8. docker删除es数据_木杉入门Elasticsearch(4):安装ES
  9. 通过jquery回显操作(笔记)
  10. js-刮刮卡效果,由jquery-eraser源码改的vue组件
  11. java 基础语法ppt,03_JAVASE_语法基础下.ppt_练习
  12. 牛客网模拟笔试——庆祝61(JavaScript)
  13. 用python开发出一个桌面小程序
  14. 成都,离互联网第五极还有多远?
  15. 漫天要价,就地还钱!
  16. java导出excel 乱码_java导出excel时出现文件名乱码解决方法
  17. 我的【藏羚头条】开发运营经验
  18. Python curses使用
  19. JS键盘事件—onkeydown,onkeyup
  20. 上位机软件开发流程是怎样的?上位机开发软件分享

热门文章

  1. bash输出颜色字体
  2. 读书 | 互联网思维到底是什么
  3. 计算机应用基础0039答案,2016秋5205004计算机应用基础-0039【参考答案】
  4. SQLServer 2008中事务日志已满问题处理
  5. php解析手机号 归属地,PHP通过API获取手机号码归属地,api手机号码_PHP教程
  6. 都柏林大学圣三一学院计算机,2021年都柏林大学圣三一学院什么专业好?这些专业你选对了吗?...
  7. 内网穿透工具--NATAPP讲解
  8. python pandas excel 排序_Python pandas对excel的操作实现示例
  9. Shp2osm:shp转换为osm格式文件
  10. 蓝桥杯 无聊的逗(java)