单片机按键的解决方法
单片机的按键消抖与几种按键电路
用其他的各类触发器,锁存器亦可达到消抖效果。 二、 软件消抖 : 通过软件延时 10ms 达到消除抖动的效果,不加文字赘述。 三、 按键电路 : 独立按键
矩阵按键 译码按键 AD 模拟按键 锁定按键
单片机的按键消抖与几种按键电路
一、 硬件消抖 : 按键防抖电路控制电路 所示利用 RC 积分电路来达成杂波的滤除与波形修整的电路(如图 1 )。 在 S1 ON 的瞬间由于接触弹跳的关系,会使 A 点电压呈现高速的断 续现象,再 S1 OFF 时亦然,详(如图 2 所示),然而由于电容两端电压需由 电压经电阻慢慢充电才会上升,使得 B 点电位缓步上升情形:S1 OFF 时亦 然,电容电压经 R 放电,使 B 点电压缓缓下降。此一变化,经史密特反相 修整后,可得一标准负脉波输出,如波
单片机控制按键实训报告
一、实训目的1. 掌握单片机的基本工作原理和硬件结构;2. 熟悉单片机编程环境及编程方法;3. 学习按键控制的基本原理和编程技巧;4. 提高动手能力和解决问题的能力。
二、实训内容1. 单片机简介2. 单片机编程环境及编程方法3. 按键控制原理及编程4. 实验设计与实现三、实训步骤1. 单片机简介(1)单片机定义:单片机是一种集成度高、功能强大的微处理器,具有运算、存储、输入输出、定时计数等功能。
(2)单片机硬件结构:主要包括中央处理单元(CPU)、存储器(RAM、ROM)、输入输出接口(I/O)、定时器/计数器、串行通信接口等。
2. 单片机编程环境及编程方法(1)编程环境:Keil uVision、IAR EWARM等。
(2)编程语言:C语言、汇编语言等。
3. 按键控制原理及编程(1)按键控制原理:按键作为一种输入设备,其作用是将物理信号转换为电信号,通过单片机对电信号进行处理,实现相应的功能。
(2)按键编程技巧:① 按键消抖:由于按键存在机械特性,按下和释放时会产生抖动,导致单片机检测到多个按键动作。
为了消除抖动,通常采用软件消抖方法,如延时消抖、计数消抖等。
② 按键扫描:按键扫描是检测按键状态的一种方法,通过单片机的I/O口循环检测每个按键的状态,实现按键的识别。
③ 按键去抖:在按键扫描过程中,若检测到按键动作,则需要进行去抖处理,以消除抖动对按键识别的影响。
4. 实验设计与实现(1)实验目的:通过按键控制LED灯的亮灭。
(2)实验原理:当按下按键时,单片机检测到按键动作,通过编程控制LED灯亮起;当按键释放时,单片机检测到按键释放,控制LED灯熄灭。
(3)实验步骤:① 准备实验器材:单片机、按键、LED灯、电阻、面包板等。
② 连接电路:将按键、LED灯、电阻等元器件连接到单片机的相应引脚上。
③ 编写程序:根据实验原理,编写控制LED灯的亮灭程序。
④ 烧录程序:将编写的程序烧录到单片机中。
⑤ 测试程序:观察LED灯的亮灭状态,验证程序的正确性。
单片机按键消抖处理方法
单片机按键消抖处理方法(非软件延时)
以STC89C51单片机为例,STC89C51的P1.0、P1.1、P1.2分别接了3个按键。
下面代码为按键扫描处理部分函数,此部分代码通俗易懂,方便移植。
简单解释一下代码的含义:
定义一个含有3个元素的整形数组(静态变量),分别储存3个按键连续16次的状态。
Main函数不断的循环执行本函数刷新KeyDelay数组的状态,以KeyDelay[0]对应的P1.0为例,当按键没有按下的时候,KeyDelay[0]为0,即KeyDelay[0]变量的所有位均为0,
当该按键按下的时候,连续16次扫描便会使KeyDelay[0]变为0xffff(所有位都是1),
而当按下或者释放产生抖动时,那么连续16次扫描后不可能所有位都为0或都为1。
所以便可以用这种方法来进行软件消抖。
文档由胡保进编写。
单片机按键电容消抖电路
单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
单片机按键实验实训报告
一、实验目的1. 理解单片机按键的工作原理和电路连接方法;2. 掌握按键消抖原理及其实现方法;3. 学会使用单片机编程控制按键功能,实现简单的输入控制;4. 提高单片机实验操作能力和编程能力。
二、实验仪器及设备1. 单片机开发板(如STC89C52);2. 按键;3. 万用表;4. 电脑;5. Keil C编译器。
三、实验原理1. 按键原理:按键是一种电子开关,按下时导通,松开时断开。
在单片机应用中,按键常用于输入控制信号。
2. 按键消抖原理:由于按键机械弹性,闭合和断开时会有一连串的抖动。
若直接读取按键状态,容易导致误操作。
因此,需要进行消抖处理。
3. 消抖方法:主要有软件消抖和硬件消抖两种方法。
本实验采用软件消抖方法,即在读取按键状态后,延时一段时间再读取,若两次读取结果一致,则认为按键状态稳定。
四、实验步骤1. 硬件连接:将按键一端接地,另一端与单片机的某个I/O口相连。
2. 编写程序:使用Keil C编译器编写程序,实现以下功能:(1)初始化I/O口,将按键连接的I/O口设置为输入模式;(2)读取按键状态,判断按键是否被按下;(3)进行消抖处理,若按键状态稳定,则执行相应的功能。
3. 编译程序:将编写好的程序编译成HEX文件。
4. 烧录程序:将编译好的HEX文件烧录到单片机中。
5. 实验验证:观察实验现象,验证按键功能是否实现。
五、实验结果与分析1. 硬件连接正确,程序编译无误。
2. 实验现象:当按下按键时,单片机执行相应的功能;松开按键后,按键功能停止。
3. 分析:通过软件消抖处理,有效避免了按键抖动导致的误操作。
六、实验总结1. 本实验成功实现了单片机按键控制功能,掌握了按键消抖原理及实现方法。
2. 通过实验,提高了单片机编程和实验操作能力。
3. 在后续的单片机应用中,可以灵活运用按键控制功能,实现各种输入控制需求。
4. 本次实验为单片机应用奠定了基础,为进一步学习单片机技术打下了良好基础。
单片机按键消抖的方法,硬件软件都可以实现
单片机按键消抖的方法,硬件软件都可以实现
不管设计一个什么作品,按键总是少不了的,对于按键你知道那些呢?
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
图1
抖动时间
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒,大家可以用示波器测试一下。
键抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
下面是两种消抖方法:
一、硬件消抖:
按键防抖电路控制电路
所示利用RC 积分电路来达成杂波的滤除与波形修整的电路(如图1 )。
在S1 ON 的瞬间由于接触弹跳的关系,会使A 点电压呈现高速的断续现象,再S1 OFF 时亦然,详(如图2所示),然而由于电容两端电压需由电压经电阻慢慢充电才会上升,使得B 点电位缓步上升情形:S1 OFF 时亦然,电容电压经R 放电,使B 点电压缓缓下降。
此一变化,经史密特反相修整后,可得一标准负脉波输出,如波形图C 点所示。
用其他的各类触发器,锁存器亦可达到消抖效果。
二、软件消抖:。
C51中对按键的处理方法
2007 年 11 月 第 4 期吉林师范大学学报 (自然科学版)Journal of J ilin Normal University ( Nat ural Science Edition)№. 4 Nov. 2007C51 中对按键的处理方法王春武1 ,李 岩2 ,孟祥英3 ,尹冬梅4(1. 吉林师范大学 信息技术学院 ,吉林 四平 136000 ;2. 山东临邑第一中学 ,山东 临邑 251500 ; 3. 四平德科电子有限公司 ,吉林 四平 136000 ;4. 东北师范大学 物理学院 ,吉林 长春 130024 ;)摘 要 :单片机控制系统中大多使用按键来实现控制功能 . 非编码键盘中如何消除按键瞬间的抖动和响应按键操作是设计者必须要考虑的问题 . 本文通过软件消除了按键抖动 ,并讨论如何实现响应一次键操作 . 文中还提供C51 单片机的按键识别的实用例程 .关键词 :单片机 ;按键 ;响应 ;抖动中图分类号 : TP368 文献标识码 :A 文章编号 :1000 - 1840 - (2007) 04 - 0086 - 02 在单片机控制系统中 ,通过按键实现控制功能是 M Hz ,编程软件为 Keil uVision2 [ 5 ] . 很常用的. 对按键处理[1 ]的重要环节是去抖动[2 ] ,即除 按下和抬起瞬间的抖动. 而消除抖动后面临的更大问 题就是解决按键的响应问题 ,包括按键的一次响应 ,一 键多功能等. 下面从两个方面来进行相应的讨论.1 按键去抖问题1. 1 原理阐述常用的按键由于机械触点的弹性作用 ,一个按 键开关在闭合时或断开时不会马上稳定下来 ,因而 在闭合和断开的瞬间都伴随着一连串的抖动 ,如图 1. 抖动时间的长短由按键的机械特性来决定 ,一般 为 5~10 ms. 这种抖动对人来说是感觉不到的 , 但图 1 按键抖动void delay (unsigned char i) {unsigned char j ;while ( - - i) {j = 180 ; while ( - - j) ;}}图 2 触发器去除抖动对单片机来说 ,则是完全可以感知的 ,因为单片机的 1. 2 举例说明 处理速度在微秒量级. 如果不对按键消除抖动则会 假设有电路图如图 3 所示 ,要完成如下要求的 引起程序处理的误操作. 去抖动的方法有很多种 ,如 电路控制 :当按键按下时 L ED 亮灭状态取反. 使用 R - S 触发器等的硬件方法[ 3 ] , 运用不同算法的各种 软 件[ 4 ] 方 法 等. 硬 件 方 法 会 增 加 成 本 和 体 积 ,如图 2 ;软件方法用的比较普遍 , 现 在 常 应 用 加 固定软件延时来去抖动. 具体方法就是在有按键按 下时 ,利用软件延时 10ms 或稍长的时间 ( 根据具体 键的机械特性来确定) 后再次检测按键是否按下 ,实 际上是避开了按键按下时的抖动时间. 实践证明 ,不 对按键释放的抖动进行处理 ,也能满足设计的要求.在程序中 添 加 此 函 数 则 可 以 实 现 延 时 , 参 数 i 表示 延 时 i 个 毫 秒. 应 用 中 可 以 这 样 调 用 : delay 图 3 按键触发 L ED 电路图(10) ,表示延时 10 ms. 本例中单片机的晶振采用 12收稿日期 :2007 - 09 - 24第一作者简介 :王春武 (1978 - ) ,男 ,吉林省松原市人 ,现为吉林师范大学信息技术学院助教 ,硕士. 研究方向 :计算机软件与应用.— 86 —main ( ){for ( ; ;){L ED = 1 ;/ /初始状态L ED灯灭if ( ! P10){delay (10) ;/ /延时10ms去抖按键仍然是按下的则执行while语句,系统会一直查询按键状态,只有按键抬起才可以退出循环结构,从而可以一次响应.方法二:加入按键标志( ! P10) / /确认去抖后按键是否真的按下P30 = ! P30 ;/ /触发L ED灯亮}}} bit k eymai n ( )mark = 0 ;/ /一次按键响应封锁标志2按键响应问题{for ( ; ;){if ( ! K & & ! key mark )2. 1问题阐述如图3所示,主要讨论如何在单片机设计中实现对按键的一次响应问题,即每次按下键时,系统只响应一次按键处理.从程序设计的表面上看,执行L ED = ! {delay (1) ;延时10ms去抖if ( ! K ){key mark = 1 ;/ /封锁按键,直到按键抬起L ED = ! L ED ;/ / L ED状态去反}}else if ( K )L ED语句即可,但实际应用中却出现L ED一直处于闪key mark = 0 ;/ /标志清零,为下次按键做好准备}}烁的情况,经分析发现:当程序中确定按键已被按下分析:其中key mark是位变量,只有当按键按时,会将L ED的状态取反,可当主程序不断的扫描按键下且keymark = 0时,程序才会继续确认是否真的时,按键一直处于按下的状态,系统会频繁的调用此语有键按下.经过延时去抖,程序中将key mark的值句,从而导致了,显然程序无法实现预期的要求. 置 1 ,然后执行其它语句,设想按键没有抬起,则因为现在介绍一下本文所用的方法. key mark的值已经变为 1 ,if ( ! K & & ! key mark 2. 2举例说明)将不会再次成立,直到当前的按键抬起,即else if下面是实现按键一次响应问题的常用两种方法. ( K)成立时key mark的值才重新为0.这样处理可方法一:查询方式main ( ){for ( ; ;){if ( ! k ){delay (1) ;延时10ms去抖if ( ! k ){L ED = ! L ED ;/ / L ED状态去反While ( ! k) ;/ /查询按键状态,只有按键抬起则退出循环}}}} 以实现每一次按键,系统只会调用一次键处理.3结论虽然以上的两种方法在实践中都有所应用,但是两种方法在效率上却大不相同.方法一,通过查询方式来判断按键系统就一直进行while死循环,从效率上看,CPU的执行效率变低.方法二,当第一次检测到按键真的按下处理完相应的程序后,CPU无分析:当有键按下时,经过延时去抖后,如果按需浪费时间等待按键抬起操作,从而可以用大部分键真的按下,则执行L ED状态取反语句,然后如果时间进行其它的处理,提高CPU的执行效率.参考文献[ 1 ]张素芬.键处理程序的设计方法[J ] .电子仪器仪表用户,1997 , (3) :12~15.[ 2 ]肖广安.一种软件去除键抖动的方法[J ] .单片机与嵌入式系统应用,2001 , (7) :63~65.[ 3 ]马家辰,孙玉德,张颖. MCS - 51单片机原理及接口技术[ M ] .哈尔滨:哈尔滨工业大学出版社,2004.[ 4 ]曾旖,奚大顺,李向阳.按键开关的抖动与消除方法[J ] .电子世界,2005 (9) :55~56.[ 5 ]孙鉴. KELL u ision2环境下仿真单片机程序[J ] .计算机辅助工程,2006 , (2) :74~77.The Handles Method on Button in C51W A N G Chun - w u 1 , L I Yan 2 , M EN G Xiang - ying3 , Y IN Dong - mei 4(1. College of In formation and Technology ,Jilin Normal Universit y ,Siping 136000 ,China ;2.№1 Middle School of Linyi ,Linyi 251500 ,China3. Siping Decaux Ltd. ,Siping 136000 ,China ;4. College of Physics ,Nort heast Normal Universit y ,Changchun 130024 ,China)Abstract :MCS - 51 system is mostly controlled with keys. It must be considered for designers which are eliminating the dithering of keys and operating respond of keys in non - coding keyboard. In this thesis ,the dithering problem of keys was solved by software and discussed how to come true once key operation of respond. In addition ,some applied procedures were provided with C51 language in the paper.Key words :MCU ;key ;respond ;dit hering感谢您试用AnyBizSoft PDF to Word。
51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法
51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法在使用51单片机控制矩阵键盘同时驱动数码管显示的过程中,可能会遇到一些常见的问题。
以下是一些可能的问题及相应的解决方法:按键无法正常响应:* 问题可能原因:接线错误、按键损坏、软件扫描不到按键信号。
* 解决方法:检查按键连接是否正确,确保按键没有损坏。
在软件中进行适当的按键扫描,确保能够正确检测到按键的状态。
数码管显示异常或不亮:* 问题可能原因:数码管接线问题、数码管损坏、数码管驱动程序错误。
* 解决方法:仔细检查数码管的接线是否正确,确保数码管没有损坏。
检查数码管的驱动程序,确保它按照正确的顺序和时序进行驱动。
按键重复响应或漏按现象:* 问题可能原因:按键抖动、软件扫描速度过快。
* 解决方法:在软件中增加适当的按键抖动延时,确保在按键按下或抬起时只响应一次。
调整软件扫描速度,避免扫描间隔过短导致的重复响应。
矩阵键盘的多个按键同时按下导致混乱:* 问题可能原因:矩阵键盘硬件连接错误、软件扫描算法问题。
* 解决方法:检查矩阵键盘的硬件连接,确保矩阵行和列没有短路或断路。
调整软件扫描算法,确保同时按下多个按键时能够正确识别。
数码管显示不正常的数字或乱码:* 问题可能原因:程序错误、数码管接线错误。
* 解决方法:仔细检查程序,确保数码管段选和位选的控制逻辑正确。
检查数码管的接线,确保每个数码管的连接都正确。
在解决问题时,建议逐步排除可能的原因,通过调试工具、逻辑分析仪或输出调试信息的方式来定位问题。
另外,仔细查阅51单片机的数据手册和相关文档,以确保硬件连接和软件设计都符合标准。
占用较少的单片机IO口就能够实现较多的按键功能
本文介绍两种方法解决"如何占用较少的单片机I/O口就能够实现较多的按键功能?"
方法一:二进制编码法
这个方法我在好几个产品上都用过,适合需要的按键不是太多的情况下使用.如果单片机有n 个I/O口,那么在理论上就可以实现2n—1个按键, 下面的电路图是利用3个I/O口实现6个按键的功能,每个按键代表1个二进制编码,如[ENT]键的编码是[0 0 1],其他按键以此类推。
方法二:A/D值判断法
这个方法只占用单片机的1个A/D输入口,就可以实现较多的按键功能.通过采样A/D值的大小就可以判断是哪个按键被按下,缺点是当多个按键同时按下时,容易判断出错.
本文简单介绍“低边与高边电流检测”的主要区别。
图B低边电流检测方案简单而且便宜,一般的运放器都可以实现此功能。
但是很多应用无法接受检测电阻Rs引入的地线干扰问题,负载电流较大时更会加剧这个问题,因为系统中一部分电路的地电位由于低边检流电阻而产生偏移,而这部分电路可能与另一部分地电位没有改变的电路相互联系。
所以当需要大电流检测时,必须重视这个问题。
图A在负载的高端进行电流检测的简易电路,不仅消除了地线干扰,而且能够检测到短路故障,需要注意的是高边检测要求放大器能够处理接近电源电压的共模电压。
本文介绍无源滤波电路的频率计算公式
1. 常用的RC滤波电路
f 0 = 1/(2πRC)
例:R = 16K ,C =10nF
f 0 = 1/(2πRC) = 1/(2π×16×103×10×10-9 ) =1000Hz
2. LC滤波电路
下期介绍。
单片机按键连接方法
------------------- 看磊诫呎 ....... ....... .....单片机按键连接方法总结(五种按键扩展方案详细介绍)单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。
不同的设 计方法,有着不同的优缺点。
而又由于单片机 I/O 资源有限,如何用最少的 I/O 口扩展更多的按键是我所研究的问题。
接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。
1)、第一种是最为常见的,也就是一个 I/O 口对应一个按钮开关。
GND这种方案是一对一的, 一个I/O 口对应一个按键。
这里P00到P04,都外接了一个上拉 电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。
这种方案优 点是电路简单可靠,程序设计也很简单。
缺点是占用 I/O 资源多。
如果单片机资源够多,不紧缺,推荐使用这种方案。
2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。
P0.0P0-1P0.2P0,3o■0 0S2O O这是一种矩阵式键盘,用 8个I/O 控制了 16个按钮开关,优点显而易见。
当然这种电路的程序设计相对也还是很简单的。
由P00到P03循环输出低电平,然后检测P04到P07的状态。
比方说这里 P00到P03 口输出1000,然后检测P04到P07,如果P04为1则说明按下 的键为si ,如果P05为1则说明按下的是s2等等。
为了电路的可靠,也可以和第一种方案 一样加上上拉电阻。
3)、第三种是我自己搞的一种方案,可以使用4个I/O 控制8个按键,电路多了一些二极管,稍微复杂了一点。
POOS1S2'S3―■—■1 ------------ O --------------------------- -------- od ------------------- &o ------------S4< ----- -56S10S8S12o o-S16PQ OS7S5POIo811P02□P03P04------------------- 磊册时——... .... .... ..这个电路的原理很简单,就是利用二极管的单向导电性。
按键处理的几种方法
新型的按键扫描程序核心算法:unsigned char Trg;unsigned char Release;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1 读键值Trg = ReadData & (ReadData ^ Cont); // 2 得到按下触发值Release=(ReadData^Trg^Cont); //3 得到释放触发值Cont = ReadData; //4 得到所有未释放的键值}下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。
我们最常用的按键接法如下:A VR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。
那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。
下面就看看具体几种情况之下,这算法是怎么一回事。
(1)没有按键的时候端口为0xff,ReadData读端口并且取反,很显然,就是0x00 了。
Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。
Cont = ReadData; 保存Cont 其实就是等于ReadData,为0;结果就是:ReadData =0;Trg =0;Cont =0;(2)第一次PB0按下的情况端口数据为0xfe,ReadData读端口并且取反,很显然,就是0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。
单片机按键去抖原理
单片机按键去抖原理在单片机系统中,按键的应用非常广泛,无论是控制还是交互,经常需要使用按键来进行操作。
然而,由于按键的特性,往往会带来按键抖动的现象,这就需要对按键进行去抖处理。
本文将详细介绍单片机按键去抖的原理和方法。
1.按键抖动的原因及影响因素按键抖动是指按下或释放按键时,按键触点会产生不稳定的接触,导致按键信号在短时间内多次切换,造成系统误判。
按键抖动的原因主要有以下几点:(1)按键机械结构问题:按键存在接触不良、触点弹簧不稳定等机械问题,会导致接触突变。
(2)外部干扰:如按键线路附近的磁场、电源干扰等,会引发按键误触。
(3)按键的弹性和灵敏度:按键材料和设计的不同,会导致按键的弹性和灵敏度不一致,进而引发抖动。
按键抖动会带来以下几个问题:(1)误判:按键抖动会使系统误判按键的按下或释放,导致错误的逻辑操作。
(2)数据错误:抖动会造成按键信号的短时间内多次切换,可能导致数据传输错误、丢失等问题。
(3)系统性能下降:由于抖动会产生大量的开关信号,会占用系统资源,影响系统的运行速度和响应时间。
2.去抖的原理去抖的原理是通过软件或硬件的方式对按键信号进行滤波,消除了按键抖动信号,从而得到稳定的按键信号。
软件去抖的原理是通过软件算法对按键信号进行处理,主要有两种方法:软件延时去抖和状态机去抖。
(1)软件延时去抖:软件延时去抖的原理是在按键按下后,通过添加延时来屏蔽抖动信号。
当检测到按键按下后,先延时一段时间,并再次检测按键的状态,如果按键仍然处于按下状态,则确认按键按下有效。
软件延时去抖的优点是简单易行,只需通过软件延时来实现,无需额外的硬件支持。
缺点是实现的延时时间需要适当,过短容易漏掉有效按键,过长则会增加系统响应时间。
(2)状态机去抖:状态机去抖的原理是通过状态变化来屏蔽抖动信号。
状态机的设计是基于按键的状态转换,当按键按下时,状态变为按下状态;当按键释放时,状态变为释放状态。
只有在状态转换时,才认定按键按下或释放为有效信号。
单片机按键消抖方式详解
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };
void delay(); void main(){
程序如下: #include <reg52.h>
sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit KEY1 = P2^4; sbit KEY2 = P2^5; sbit KEY3 = P2^6; sbit KEY4 = P2^7;
KeySta = 1; } else{
//其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新 } } 这个算法是我们在实际工程中经常使用按键所总结的一个比较好的方法,介绍给大家,
今后都可以用这种方法消抖了。当然,按键消抖也还有其它的方法,程序实现更是多种多样,
大家也可以再多考虑下其它的算法,拓展下思路。
那么消抖操作所需要的延时该怎么处理呢?
举个例子:我们启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储 起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大 概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的 阶段,而非处于抖动的阶段,如图 8-12。
keybuf = (keybuf<<1) | KEY4; //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下 if (keybuf == 0x00){
单片机控制多个按键的方法
单片机控制多个按键的方法在很多嵌入式系统中,通常会用到按键进行输入。
单个按键的控制可能相对简单,但是如果需要控制多个按键,就需要用到一些特殊的控制方法。
常用的按键控制方法主要有以下几个方面:1、轮询法:采用逐个扫描的方式来检测按键状态。
2、中断法:接入外部中断口,当按键被按下时,会触发中断,系统会响应中断并执行相应的程序。
3、计时器法:通过计时器的方式来检测按键状态,利用定时器可以定时检测按键的状态。
如果需要控制多个按键,就需要采用一些特殊的控制方法:1、矩阵按键法:将多个按键以矩阵的方式进行排列,通过某种方法对行和列进行扫描,以检测按键的状态。
三、常用的按键检测程序以下是一个常用的按键检测程序,可以用于单片机控制多个按键:void key_scan(void){unsigned char read_date, key1, key2, key3, key4;// 初始化按键控制端口为输入模式P3M0 = 0x00;P3M1 = 0x00;// 所有按键端口均拉高,等待按键输入P3 = 0xff;// 等待按键输入Delay_ms(20);// 读取P3端口状态// 获得按键1状态key1 = read_date & 0x01;// 获得按键2状态key2 = read_date & 0x02;// 获得按键3状态key3 = read_date & 0x04;// 获得按键4状态key4 = read_date & 0x08;// 判断按键1是否被按下if (key1 == 0){// 按键1被按下,执行相应的操作 }// 判断按键2是否被按下if (key2 == 0){// 按键2被按下,执行相应的操作 }// 判断按键3是否被按下if (key3 == 0){// 按键3被按下,执行相应的操作 }// 判断按键4是否被按下{// 按键4被按下,执行相应的操作}}四、总结单片机控制多个按键的方法,需要采用特殊的控制方法,例如矩阵按键法和编码按键法等。
单片机按键设计的四个方案详解
单片机按键设计的四个方案详解在单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。
一般的在按键的设计上,一般有四种方案:一是GPIO口直接检测单个按键,如图1.1所示;二是按键较多则使用矩阵键盘,如图1.2所示;三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示;四是利用单片机的ADC,在不同的按键按下后,能够使得ADC接口上的电压不同,根据电压的不同,则可以识别按键,如图1.4所示。
在以上四种设计上,各有优点和不足。
第一种是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。
若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。
第二种,优点是能够在有限的GPIO情况下,扩展尽可能多的按键。
但缺点同上,需要不停检测按键是否按下。
第三种方式是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用;第四种的优点是,只需要单片机的一个ADC接口,一根线,就能对多个按键进行识别,缺点是按键一旦内部接触不良,则可能按键串位,且按键产生的抖动,会造成一定的识别错误。
在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。
改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。
因此不需要循环扫描,大大提高了效率。
方案如图1.5所示。
只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。
二极管选用普通整流二极管即可,本人亲测可行。
单片机的故障排除与维修方法
单片机的故障排除与维修方法单片机,作为一种常见的嵌入式系统芯片,广泛应用于各个领域,控制各种电子设备的正常运行。
然而,在使用过程中,单片机可能会出现各种故障,在这里将介绍一些常见的故障排除与维修方法。
一、电源故障电源故障是单片机故障的常见原因之一。
它可能包括电源电压不稳定、电源短路、电源线松动等问题。
当遇到电源故障时,首先检查电源线是否连接正常,松动的电源线可能导致供电不稳定。
另外,使用示波器或万用表测量电源电压,确保电源电压在正常范围内。
如果电源电压不稳定,可以尝试更换电源或使用稳压电源模块。
二、引脚连接问题引脚连接问题也是常见的单片机故障来源之一。
在设计和布线过程中,可能会出现引脚连接错误、引脚虚焊或连接松动等问题。
当出现引脚连接问题时,需要检查引脚连接是否正确,可以使用万用表或逻辑分析仪测量引脚的电压或信号,确保引脚连接正常。
如果发现引脚虚焊或连接松动,需要重新焊接或固定引脚。
三、程序错误程序错误是单片机故障的常见原因之一。
在编写程序时,可能会出现语法错误、逻辑错误或内存溢出等问题。
当单片机无法正常运行时,可以通过以下几个步骤来排除程序错误:1.检查程序语法:使用集成开发环境(IDE)中的语法检查功能,查找并修改语法错误。
2.调试程序:使用调试工具,逐步执行程序,并观察程序的执行过程,寻找可能的逻辑错误。
3.内存管理:如果程序出现内存溢出或内存泄漏问题,可以考虑优化内存使用,释放无用的变量或采用动态内存分配策略。
四、外设故障外设故障是指与单片机相连的外部设备(如传感器、显示器)出现问题,导致单片机无法正常工作。
当单片机无法与外设通信或控制外设时,可以采取以下措施进行排除:1.检查连接:检查外设与单片机之间的连接是否正确,确保引脚接线良好。
2.检测信号:使用示波器或逻辑分析仪检测与外设通信的信号,查看信号是否正常。
3.检查外设供电:确保外设的供电电压稳定,供电电流足够。
五、时钟问题时钟问题是指单片机时钟源或时钟电路出现故障,导致单片机无法正常工作。
单片机的阻容复位和按键复位
首先要理解为什么需要复位:1:因为微处理器(如我们常说的电脑CPU芯片和高端ARM)和微控制器(单片机、低端ARM什么的)芯片都是数字电路芯片,其正常工作是只有0低电平和1高电平这两个电平状态,属于离散系统。
而供给芯片的电源输入却是模拟电路,属于连续线性系统。
合上开关,芯片的VDD和VSS之间的电压要达到数字芯片可正常工作的电压是需要几毫秒到十几毫秒的过程的。
2:而也因为微处理器和微控制器是数字电路芯片,其是需要时钟信号才能工作。
不管是内部芯片自带的低频RC振荡器还是外接晶振或者其他时钟电路,从上电到时钟电路正常起振也是需要时间的。
可以看下图我用示波器测到的:ARM9上电那几百毫秒内,电源输入VCC对地电压(黄线)、及18.492M时钟(绿线)引脚对地电压发生的情况。
可以看到芯片在给电的10毫秒内电源开始升到正常供电水平,但至少500毫秒后晶振才开始正常输出时钟(之前的虽然有时钟信号,也可以让CPU工作,但波形不稳定,按此状态运行的CPU容易出错)所以,需要在芯片上电的时候给复位端一个复位信号让微处理器和微控制器内部的CPU在刚上电那段时间不要工作。
这叫上电复位,上电复位是微处理器或微控制器都必须存在的一个重要操作,没有这个操作CPU直接上电工作的话非常容易出错(程序跑飞、寄存器数据错误……)。
所以,51一般都使用阻容复位来让其cpu在上电后在复位重启一次。
如下图,去掉SW-PB和R6就是一个普通的51阻容复位,上电瞬间因为电容的压降不可突变的原理,电容等同导通。
电容C23和电阻R27之间RESET点的电位就是VC5的电压,一直使能复位端。
上电后VC5对C23充电,RESET点的电位降低趋近于GND的电平,后复位解除CPU开始正常工作。
(其实这图的R27有点大,C23有点小)此图的Rst为高电平有效,而有的单片机复位引脚是低电平有效,此时设计阻容复位时,应该将上图的电阻和电容的位置调换,上电瞬间,电容导通,复位引脚接地,单片机复位。
单片机消除按键抖动的方法
单片机消除按键抖动的方法
单片机中,当按键被按下时,可能会出现按键抖动的现象,即按下按键后,按键会不断地重复触发,导致程序的不稳定性等问题。
为了消除按键抖动,可以采取以下方法:
1. 软件消抖法:在程序中通过延时、多次采样等方法,对按键
进行去抖处理。
但这种方法需要占用一定的CPU资源,容易影响程序的稳定性和响应速度。
2. 硬件消抖法:通过外部电路对按键进行去抖处理,如添加 RC 滤波器、加电容等组合电路,可稳定按键的电平信号,避免按键的震动和干扰。
3. 系统延时法:在按键按下后,延时一段时间再读取按键的状态,可消除按键的抖动。
但这种方法需要根据实际情况设置合适的延时时间,否则会影响系统的响应速度。
4. 确认法:在按键按下后,通过程序对按键的状态进行多次确认,只有当确认多次读取的状态一致时,才认为按键的状态是有效的。
这种方法需要设置合适的确认次数和时间,才能达到较好的去抖效果。
总之,消除按键抖动是单片机程序开发中的一个重要问题,需要根据实际情况选择合适的去抖方案,保证程序的稳定性和可靠性。
- 1 -。
单片机按键防抖动策略及实用代码
单片机按键防抖策略及实用代码笔者从事单片机类工作多年,碰到过很多问题,也成功解决过很多问题。
闲来无事想分享一些经验、心得,今天就聊一下按键防抖的问题,希望能够帮助到大家。
按键分好多种,就拿微动(非自锁) 开关举例吧,如下图1为实物,图2为原理。
大家注意,按键S1两端并没有并联104或103消抖电容,其实是出于成图1图2本考虑,因为有的行业每天生产电路板达100000个,如果每个电容按0.03元计算,那么每天因为一个电容产生的成本为3000元,那一年多出的成本呢?所以就需要软件消抖了,软件的价值就体现出来了。
为了找到按键抖动的一般规律,笔者接上示波器测量开关S1两端的波形,通过数百次按动按键,挑选了3组非常有代表性的波形,理想波形如下图3:图3可惜的是理想波形出现的概率比较低,实际的波形基本都存在不同程度的抖动,如下图4和图5:图4图5其实抖动的原因多半是按动时触点接触不实,触点有油污,氧化等等。
抖动电平的特点是持续时间较短,时间上靠近触点接触的时刻。
此按键的抖动时间不超过5ms,其他按键的抖动时间可能会更长,实际以示波器测量为准。
有了以上测量和分析,就要考虑如何过滤抖动,避免按键功能异常。
笔者整理了两个思路,使用场景有些区别,需要根据实际情况灵活选择。
第一个思路:判断按键连续低电平的时间是否超过(15ms~30ms),适合非自锁按键短按或长按,代码段示例如下:void ReadKey(void) //微动(非自锁) 开关检测,假设函数1ms运行一次{static unsigned short int key_counter=0; //统计按键按下且持续低电平的时间if(IO == 1) //IO口识别到高电平(可能是按键松开或按下时出现了高电平抖动) {key_counter=0; //持续低电平时间计数器清0,重新等待低电平}else //IO口识别到低电平{if(key_counter < 3000) //计数器限制最大值,防止溢出key_counter++; //持续低电平时间计数器累加if(key_counter == 20) //持续低电平时间达到20ms(按键短按){短按用户代码}else if(key_counter == 3000) //持续低电平时间达到3000ms(按键长按){长按用户代码}}}第二个思路:延时一段固定的时间,再判断哪个电平的持续时间长,适合自锁开关或拨动开关,代码段示例如下:unsigned char ReadKey(void)//拨动(或自锁) 开关检测,假设函数1ms运行一次{static unsigned short int high_level_counter=0; //一段时间内高电平的时间static unsigned short int low_level_counter=0; //一段时间内低电平的时间static unsigned short int judge_counter=0; //时间长度计数器static unsigned char level_value=1; //开关的返回值judge_counter++; //时间长度累计if(IO == 1) //IO口识别到高电平{if(high_level_counter < 25)high_level_counter++; //高电平时间计数累加}else //IO口识别到低电平{if(low_level_counter < 25)low_level_counter++; //低电平时间计数累加}if(judge_counter > 25) //固定延时时间(15~30ms)到,判定有效电平状态{judge_counter =0;if(high_level_counter > low_level_counter) //高电平时间>低电平时间{if(high_level_counter > 20) //高电平总时间超过固定时间的一半{level_value = 1; //此时判定IO口为高电平可以在此添加用户高电平功能代码}}else if(low_level_counter > high_level_counter) //低电平时间>高电平时间{if(low_level_counter > 20) //低电平总时间超过固定时间的一半{level_value = 0; //此时判定IO口为低电平可以在此添加用户低电平功能代码}}high_level_counter = 0;low_level_counter = 0;}return level_value; //返回开关的值}以上是笔者实际使用的两段防抖代码,测试效果很好。
单片机按键的解决方法
单片机按键的解决解决方案1、单片机上的按键控制一般采用两种控制方法:中断和查询。
中断必须借助中断引脚,而查询按键可用任何IO端口。
按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。
2、中断形式STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器.4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
每一个中断源都必须定义2个优先级。
有几点需要注意的是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机按键的解决解决方案1、单片机上的按键控制一般采用两种控制方法:中断和查询。
中断必须借助中断引脚,而查询按键可用任何IO端口。
按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。
2、中断形式STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器.4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
每一个中断源都必须定义2个优先级。
有几点需要注意的是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
GPIO外部中断:STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间智能使用一个,如:PA0,PB0,PC0,PD0,PE0,PF0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能使用了,在此情况下我们使用类似于PB1,PC2这种末端序号不同的外部中断源,每一组使用一个中断标志EXTI x.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。
EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。
对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。
编写IO口外部中断步骤及其注意事项:(1)设置中断优先级组;(2)开启时钟(IO口时钟,复用时钟);(3)设置中断线并对中断进行初始化配置(设置中断线,确定中断模式,中断触发沿设置,使用指定设置初始化外部中断);(4)设置中断管理器NVIC各参数(包括:使能产生外部中断外设的IO口所在的外部中断通道;设置外部中断的优先级---抢占优先级,响应优先级;使能外部中断通道;使用设置好的各个中断管理器上的参数来初始化中断管理器)。
外部中断服务函数完成中断操作需要最终达到的目标。
3、矩阵形式键盘矩阵原理:a*b矩阵键盘由a条行线和b条列线组成,行线接端口P3(p3表任一端口)P3.0、P3.1、P3.2……p3.(a-1);列线接p 3.a,p3.(a+1)……P3.(b-1).按键位于每条行线和列线的交叉点上。
按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。
当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。
第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码合并得到按键的位置码,即是Y3Y2Y1Y0X3X2X1X0(因为行线和列线各有一条电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。
也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平.比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y3Y2Y1Y0x3X2X1X0为11101110即是0xEE.全部按键码为:矩阵键盘在单片机上的简单应用-----显示数码管:0~F(51单片机)#include<reg51.h>#define uchar unsigned char#define uint unsigned intSbit buzzer =P1^0;Uchar code_dis[]=//0~9,A~F{0xC0,0XF9,0XA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0z88,0x83,0xC6,0xA1,0x86,0x8E};Uchar code_tab[]=//矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x)//延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan()//矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b;//得到位置码for(i=0;i<16;i++){if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}}Void beep(void)//蜂鸣器发出声音,模拟按键声音{Uchar i;For(i=0;i<100;i++){Buzzer=~buzzer;Delay(1);}Buzzer=0;}Void main(void){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1)//有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}扫描法:矩阵键盘工作原理:由于按键没有接地,4行4列正好占用8个I/O 如果4行我们送P3.0到P3.3送入0 1 1 1 然后去读取4列的值,如果P3.0的按键按下那么P3.4---P3.7的值等于0 1 1 1,假如是第2个键按下的话那么读回来的值是1 0 1 1 ,如果第3个键按下去读回来的值是1 1 0 1 ,如果第4个键按下去读回来的值是 1 1 1 0 ,如果没有键按下去读回来就是1 1 1 1。
所以我们就根据读回来的值来判断按下去的是那个键。
当然这是对P3.0这一行,因为矩阵键盘是扫描的,所以下次把P3.0 给1 P3.1 给0对第2行,陆续的第3 行第4行,0111 1011 1101 1110 而每次都去从新扫描一遍列值列有4个值,以确定是那个键按下。
无论何时任何一个时间有一个按键被按下就跳出循环。
当然不可能有2个键刚好一起按下你的手没有这么好的力度,就算有2个键一起按键,程序也有先后检测的顺序,只能检测一个后面的检测不到。
P3 = 0XFE; //第一行给0temp ;定义个变量temp = P3 ;读回来由于读需要先写1 因为P3= FE 已经把高4位给1了所以能读了temp & oxf0 如果没有按键按下结果还是0xf0 .如果有键按下结果就不是0xf0了。
num 然后我们再定义一个变量让它赋值给这个按下去的按键值。
一次类推把第一行赋值0 扫描一遍然后把第2行赋值0扫描一遍..............共扫描1 6遍。
只要有键按下就会得到一个值 num 就从1排到16. 共16个按键 4*4 的矩阵键盘。
我再总结下思路:首先低4位是行共4行分别把每行给0 低电平就4次 0 1 1 1 、1 0 1 1 、 1 1 0 1 、1 1 1 0 对吧然后去检测高4位 4列啊先不考虑极端情况,4列就4个按键只要按下一个 P3口的高4位就会有一个值。
根据这个值就能判断是那个键了。
如:P3= 1111 1110 低四位是行先把第一行给0有按键下的话 temp = P3 读回来 1101 1110 然后temp & 0xf0 与运算下就判断下还等于oxf0吗?如还等于就没有按下,如果不等于就肯定有按键按下。
定义个变量让它等于这个不是0XF0的值,做个标记。
依次类推。
然后用这个思路写个程序吧!写的不太好看的不是很清楚只是做个参考吧,只要把思路理清楚就行了。
是这样我们分别按这16个按键让它分别显示是第几个比如按下第一个数码管就显示1 第2个数码管就显示2,依次类推。
一直到 F (为了方便让所有的数码管显示同一个数0 ---F)#include#define uint unsigned int#define uchar unsigned charsbit dula = P2^6;sbit wela = P2^7;sbit key1= P3^4;uchar code table []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0//加这个0就是什么都不显示};uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();//声明一下//void display(uchar num1);//这里可以做个显示函数,但是我没做。