单片机按键防抖程序_这些单片机按键设计方案,请拿好,不谢!

在单片机系统里,按键是常见的输入设备,在本文中介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有四种方案,创客学院带你零基础学习电子产品设计

一是GPIO口直接检测单个按键,如图1.1所示;

二是按键较多则使用矩阵键盘,如图1.2所示;

三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示;

四是利用单片机的ADC,在不同的按键按下后,能够使得ADC接口上的电压不同,根据电压的不同,则可以识别按键,如图1.4所示。

cc2c2432645a05a1fcd3f8a65e68f853.png

图1.1方案一

b9511f49482f769ed55d1129849b47a1.png

图1.2方案二

3c5b0b175768c2094716ba160d8d4ad5.png

图1.3方案三

82bda5c0d31cf3bf2124a1f5ada34315.png

图1.4方案四

在以上四种设计上,各有优点和不足。

第一种是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。

第二种,优点是能够在有限的GPIO情况下,扩展尽可能多的按键。但缺点同上,需要不停检测按键是否按下。

第三种方式是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用。

第四种的优点是,只需要单片机的一个ADC接口,一根线,就能对多个按键进行识别,缺点是按键一旦内部接触不良,则可能按键串位,且按键产生的抖动,会造成一定的识别错误。

在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。

改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。因此不需要循环扫描,大大提高了效率。方案如图1.5所示。只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。二极管选用普通整流二极管即可,本人亲测可行。

d583a84812989b780bcd89bc28d96e10.png

图1.5 改进一

改进二:在原有的ADC按键的基础上,也可用增加二极管的方式,实现按键中断,并在中断服务程序里进行AD转换,从而识别按键。电路如图1.6所示。

fb96f1ff5f2aaed5505bc70d793fcef9.png

图1.6 改进二

改进三:因为按键不可避免的有抖动,因此按键消抖可以通过硬件消痘和软件消抖。现在分享一个十分简单且有效的硬件消痘方法:给按键并联一个104左右的电容。软件上基本不用处理即可避免抖动。

改进四:在按键扫描检测的方案下,如果主循环中有某个函数占用时间较长,则按键会发生或长或短的“失灵”,现分享我的一个解决方案。将按键扫描放到定时器中断里面,这样就可周期性地检测按键按下情况,不受主循环的影响。

并且,能解析出按键的不同状态,即按下、按住、弹起、为按下这四种状态,用以实现更丰富的功能。

但需注意两点:一是定时器的定时时间,不可过长也不可过短,过长容易检测不到按下,过短会占用大量时间资源。二是中断服务程序需简单明了,只做检测用,通过全局变量传递,在主循环内完成按键响应,中断服务函数内尽量不要占用太多时间。

免责声明:内容整理自网络,仅供学习交流,如涉及作品版权问题,请及时联系我们删除,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 11G 安装详解

oracle官网下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官网下载需要注册orcale账号,比较繁琐,这里直接放已经下载好的安装包链接 Oracle11G下载链接: https://pan.baidu.com/s/1v6oD4jAt…

程序员何苦为难程序员?

有时候想想程序员为何为难程序员呢? 扳扳手指走上码农这个行业也有几年了,但是越来越觉得这个行业很累,有人说程序员就是二代农民工,我个人还是比较赞同的,对于刚入道的同仁们来说确实就是个体力(脑力,眼力…

kubeadm部署k8s_用 kubeadm 部署生产级 k8s 集群

概述kubeadm 已⽀持集群部署,且在1.13 版本中 GA,⽀持多 master,多 etcd 集群化部署,它也是官⽅最为推荐的部署⽅式,⼀来是由它的 sig 组来推进的,⼆来 kubeadm 在很多⽅⾯确实很好的利⽤了 kubernetes 的许…

poj 题目分类

1000 AB Problem 送分题 1001 Exponentiation 高精度 1003 Hangover 送分题 1004 Financial Management 送分题 1005 I Think I Need a Houseboat 几何 1006 Biorhythms 送分题 1007 …

模板的语法

我已经碰到过好几次这种错误了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…

统计学习方法概论---分类问题

为什么80%的码农都做不了架构师&#xff1f;>>> 分类问题 转载于:https://my.oschina.net/liyangke/blog/2945185

IEPLUS(IE增强性插件)

用Vista好长好长时间了&#xff0c;除了比较吃硬件、老的游戏不兼容、我350W像素的老罗技不能用等等&#xff0c;感觉不是非常不错的。IE 7也还可以&#xff0c;后来我试用了傲游、火狐&#xff0c;在多标签后傲游的一些操作更人性化&#xff0c;我最喜欢它的托拉即可自动出新标…

CENTOS7 Python3.7 PyAudio 安装

2019独角兽企业重金招聘Python工程师标准>>> 出现错误: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -I/usr/local/python371/include/python3.7m -c src/_portaudiomodule.c -o build/temp.linux-aarch64-3.7/src/…

bash for循环_Bash 中的 For 循环

循环是编程语言的基本概念之一。当你想要一遍又一遍地运行一系列命令直到达到某个条件后终止退出时&#xff0c;循环很方便。在诸如 Bash 之类的脚本语言中&#xff0c;循环对于自动执行重复性任务非常有用。在 Bash 脚本中有3个基本的循环结构&#xff0c;for 循环&#xff0c…

Atlas Unknown Error

if("using Atlas" and "there are some js codes in HEAD tag") then "Unknown Error" solution: copy the js codes to other position 转载于:https://www.cnblogs.com/JoeHou/archive/2009/02/03/1383231.html

软件工程师的6年总结

“又是一年毕业时”&#xff0c;看到一批批学子离开人生的象牙塔&#xff0c;走上各自的工作岗位&#xff1b;想想自己也曾经意气风发、踌躇满志&#xff0c;不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼&#xff0c;希望对所有的软件工程师们有所帮助&#xff0c…

linux 信号_Linux的信号和线程

Linux的信号和线程-Tech Talk 让技术发出声音​www.ttalk.im什么是线程线程&#xff0c;有时被称为轻量级进程(Lightweight Process&#xff0c;LWP&#xff09;&#xff0c;是程序执行流的最小单元。一个标准的线程由线程ID&#xff0c;当前指令指针(PC&#xff09;&#xff0…

tomcat部署教程

参考博客地址&#xff1a; https://blog.csdn.net/xiaoyu940601/article/details/54950673转载于:https://www.cnblogs.com/liuniublogs/p/10019068.html

选择文字就能选择复选框

更方便的单选框下面为脚本显示区  看看下面的选择框&#xff0c;似乎没有什么不同的。微妙之处在于&#xff0c;选择项目时不必非得在框内点击鼠标了&#xff0c;在文本上选择即可。不信试一试吧。 经常来这里 偶尔来看看 转载于:https://www.cnblogs.com/leevane/archive/200…

python 数据结构

一. 深入链表 先来介绍一些链表具备的一些常用方法&#xff1a; append(x) : 把一个元素添加到链表的结尾 extend(L) : 将另外一个链表合并到该链表中 insert(i,x) : 插入一个元素到指定位置的前面 remove(x) : 删除链表中第一个值为x的元素 如果没有这样的元素 则返回错误 pop…

python笔试编程题_Python——面试编程题

一、python----输出1-100之和的方法 方法一&#xff1a; print(sum(range(1,101))) 方法二&#xff1a; from functools import reduce print(reduce(lambda x, y: xy, range(101))) 方法三: t0 for i in range(101): ti print(t) 方法四&#xff1a; print(sum([x for x in ra…

go语言项目优化(经验之谈)

1 Go的应用场景 在斗鱼我们将GO的应用场景分为以下三类&#xff0c;缓存类型数据&#xff0c;实时类型数据&#xff0c;CPU密集型任务。这三类应用场景都有着各自的特点。 ● 缓存类型数据在斗鱼的案例就是我们的首页&#xff0c;列表页&#xff0c;这些页面和接口的特点是不同…

AddTransient、AddSingleton、AddScoped 三者都应该在什么场景下使用

网上随便一搜&#xff0c;能搜出一大堆对三者进行区别分析的文章&#xff0c;但是呢&#xff0c;理论是一回事&#xff0c;实际使用又是另外一回事&#xff0c;到底在何种场景下应该使用何种注入方式呢&#xff1f; 通过这篇文章和我自身的实际经验&#xff0c;来说一说实际应用…

python交互界面用图片当背景_wxPython实现窗口用图片做背景

本文实例为大家分享了wxPython实现窗口用图片做背景的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 效果图&#xff1a;实现代码&#xff1a; #!/usr/bin/env python # -*- encoding:utf-8 -*- import wx class MyPanel(wx.Panel): def __init__(self,parent,id): …