單片機按鍵防抖程序_這些單片機按鍵設計方案,請拿好,不謝!

在單片機系統里,按鍵是常見的輸入設備,在本文中介紹幾種按鍵硬件、軟件設計方面的技巧。一般的在按鍵的設計上,一般有四種方案,創客學院帶你零基礎學習電子產品設計

一是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.pswp.cn/news/276834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276834.shtml
英文地址,請注明出處:http://en.pswp.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): …