单片机按键的解决方法
单片机的按键消抖与几种按键电路

用其他的各类触发器,锁存器亦可达到消抖效果。 二、 软件消抖 : 通过软件延时 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单片机的数据手册和相关文档,以确保硬件连接和软件设计都符合标准。
- 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);//这里可以做个显示函数,但是我没做。