




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 16 章 51 系列单片机扩展键盘 学以致用是学习的一个基本原则 前面的章节全面介绍了单片机及编程语言 从本章开始 将向读者展示单片机及其 C51 语言在不同应用场合的应用 首先是人机交互中最常用的键盘 本章将对键盘及其编程进行详细的讲解 通过本章的学习 读者应该实现如下几个目标 了解键盘的种类 掌握键盘的基本原理 掌握阵列式键盘的使用 16 1 键盘的种类 一提到键盘 读者首先想到的一定是计算机的键盘 这是一种典型的键盘形式 这里讨论 的键盘则具有更为广泛的含义 键盘就是在人机交互系统中用来输入控制信号或数据的接口 这样 一个或者几个按键也可以称之为键盘 在单片机系统中 键盘是与单片机进行人机交互的最基本的途径 其以按键的形式来设置 控制功能或输入数据 按键的输入状态本质上是一个开关量 人们通过键盘输入一些命令或数 据 以达到控制单片机运行的目的 常用的键盘有直接式按键键盘和阵列式按键键盘两种 直接式按键键盘接口简单 适合于 简单而且少的开关量的输入 阵列式按键键盘则适合于输入参数较多 功能复杂的系统 可以 最大限度地使用单片机的引脚资源 16 1 1 直接式按键键盘 直接式按键键盘就是采用单独的按键开关 直接连接到一个单片机的输入引脚上 每个按 键占用一个单片机的 I O 接口 如图 16 1 所示 图中采用了上拉接口方式 每个 I O 接口的状 态不会影响到其他接口的工作状态 当没有按键按下的时候 I O 端口输入的是高电平 当按 键按下的时候 I O 端口输入的是低电平 从而实现端口电平的变化来达到按键输入的目的 单片机单片机 5V 图 16 1 直接式按键键盘 21 天学通 51 单片机开发 第 2 版 336 直接式按键盘接口电路配置灵活 结构简单 例如可以使用一个 8 位的并行接口接入 8 路按键开关输入 这种接口最大的优点就是可以用软件识别所有 256 28 种不同可能的开 关组合状态 其缺点是占用的 I O 接口太多 在按键数目比较多的时候 需要单片机具有较 多的 I O 端口资源才能够满足要求 因此只适用于输入按键数目比较少的情况或者程序比较 简单的场合 在单片机系统中 直接式按键键盘所采用的按键开关如图 16 2 所示 图 16 2 按键开关 16 1 2 阵列式按键键盘 阵列式按键键盘是将各个开关排列成行和列的阵列结构 如图 16 3 所示 其中 单片机 的 I O 接口一部分作为行线 一部分作为列线 按键布置在行线和列线的交叉点上 行列式键盘中的按键数量可以达到行线线数与列线线数的乘积 例如一个 8 位的 I O 接口 最多可以布置的按键数为 4 4 16 个 这样 阵列式按键键盘解决了直接式按键键盘占用引脚 多的不足 阵列式键盘接口的最大优点就是可以用最少的 I O 接口资源 实现最多的按键输入 与直 接式键盘接口相比 要节省很多单片机的 I O 接口 适合应用于按键数目较多的场合 单片机单片机 5V I O 0 I O 1 I O 2 I O 3 I O 4 I O 5 I O 6 I O 7 10K10K10K10K 图 16 3 阵列式按键键盘 第 16 章 51 系列单片机扩展键盘 337 在实际的单片机系统中 阵列式按键键盘可以采用普通的按键开关组成阵列 如图 16 4 所示 也可以采用塑料薄膜阵列开关 如图 16 5 所示 其中 塑料薄膜阵列开关样式精美 手感优良 设计形式多样 制作加工周期短 在各种嵌入式产品中都得到了广泛的应用 图 16 4 普通的按键开关阵列 图 16 5 塑料薄膜阵列开关 16 2 键盘的基本原理 键盘其实都是不同按键开关的组合 可以向单片机系统输入不同的数字量信号 目前常用 的大部分按键都是机械式按键 利用了机械触点的通断作用 通过机械触点的闭合与断开 实 现了电压信号高低的输入 由于机械式开关在闭合与断开的瞬间均有抖动过程 因此通过机械 式开关输入的电压信号也会出现相应的抖动 这种抖动的时间一般为 5 25ms 不同的开关由 于不同的机械特征具备不同的抖动时间常数 在键盘设计中必须要考虑键盘抖动的问题 通过 硬件或软件的措施进行键盘输入消抖 从而保证输入的可靠性 16 2 1 按键编码 按键是硬件上的一个实物 在程序中需要对该按键分配一个唯一的键值 这样 当该按键 有动作的时候 程序可以根据键值来判断并进行相应的处理 键盘按键通过单片机的 I O 引脚与 CPU 进行通信 其中 单片机 I O 引脚接收的是高低逻 辑电平信号 因此 键盘输入的不同键值可以表示为 I O 引脚上不同的高低电平的组合 键盘 编码设计的主要任务就是选择合理的键盘结构 为每个按键分配不同的 I O 输入信号 以供单 片机识别并响应 16 2 2 按键确认 按键确认也就是程序中如何判断按键被按下 一般来说 按键闭合与断开 对应的是电压 输入的高电平信号或低电平信号 因此要判断键盘是否被按下 就必须对输入电信号的电平进 行检测 在实际的电路设计中 按键按下时的电平需要根据电路的结构来考虑 一般常用的有两种 不同结构的按键接口 即上拉电阻式按键接口与下拉电阻式按键接口 上拉电阻式按键接口如图 16 6 所示 上拉电阻式按键接口将用于检测按键输入电平的单 片机输入端口通过一个电阻上拉至 5 伏 当按键断开时 由于单片机的端口的输入内阻很大 在上拉电阻的作用下 单片机输入端口的电平为 5 伏高电平 逻辑值为 1 当按键闭合时单片 机端口与电源地相连 电流从5 伏电源经上拉电阻流向电源地 此时单片机输入端口电平为0V 逻辑值为 0 下拉电阻式按键接口如图 16 7 所示 下拉电阻式按键接口将用于检测按键输入电平的单 21 天学通 51 单片机开发 第 2 版 338 片机输入端口通过一个电阻下拉至电源地 当按键断开时 在下拉电阻的作用下 单片机输入 端口的电平为 0 伏低电平 逻辑值为 0 当按键闭合时单片机端口与 5 伏电源相连 电流从 5 伏电源经上拉电阻流向电源地 此时单片机输入端口电平为 5V 逻辑值为 1 单片机单片机 5V 输入端口输入端口 按键状态输入电平 闭合 断开 按键状态输入电平 闭合 断开 0V 5V 逻辑值逻辑值 0 1 单片机单片机 5V 输入端口输入端口 按键状态输入电平 闭合 断开 按键状态输入电平 闭合 断开 5V 0V 逻辑值逻辑值 1 0 图 16 6 上拉电阻式按键接口 图 16 7 下拉电阻式按键接口 单片机通过检测输入引脚的电平来判断实际的按键状态 在实际电路设计中究竟使用上拉 式接口还是下拉式接口没有一个统一的标准 往往根据实际电路的需要和设计的电路系统综合 考虑决定 一般情况下 上拉式接口电路在各种嵌入式系统中得到了较多的应用 另外 有些 特殊型号的单片机则在其内部集成了相应的上拉或者下拉电路 用户无须再次上拉或者下拉 无论是上拉式接口还是下拉式接口电路 其上拉电阻或下拉电阻都是必不可少的电路器 件 否则会导致开关闭合时造成电源短路现象 上拉或下拉电阻的大小决定了开关闭合时的电 流大小 上拉或下拉电阻一般都选用比较大的电阻 常用值有 4 7k 10k 等 这样是为了降 低单片机系统的功耗 16 2 3 按键消抖 按键是一种机械式的开关结构 由于机械特性的特点 一个按键开关在闭合与断开时其机 械触点不能立刻完全闭合或断开 因此会产生一系列的电平抖动信号 如果没有对按键进行消 抖处理 很可能将一次按键操作识别成多次按键操作 造成系统的不确定性与不可靠性 因此 必须要对按键开关输入进行消抖处理 按键输入的抖动是由按键开关的机械特性造成的 当按键被按下时 其受力可以用如下的 公式表示 2 2 dd dd d xx FmKKx tt 在这个公式里 m 为按键开关的质量 Kd为按键开关的摩擦系数 K 为弹性系数 通过摩 擦系数和弹性系数可以计算出按键开关的阻尼系数 如下所示 2 d K E Km 当手指将按键开关按下时 按键的动态响应是依赖于按键开关的阻尼系数的 即由按键开 关的质量 m 摩擦系数 Kd 弹性系数 K 所决定 当阻尼系数 E 1 时 称为按键开关的欠阻尼 此时该微分方程的解将是一个动态的振荡过 程 当阻尼系数 E 1 时 称为按键开关的过阻尼 此时该微分方程的解为一个平滑的延时上升 过程 将不会产生抖动 在不考虑价格因素的情况下 可以买到过阻尼的按键开关 例如油压开关的阻尼系数 E 1 其不会产生抖动 但是价格却比较昂贵 但是对于大部分廉价的按键开关而言 其阻尼系数一 般都是欠阻尼的 因此 这样的按键开关在闭合和断开时不可避免地会产生抖动 4 7K 4 7K 第 16 章 51 系列单片机扩展键盘 339 如图 16 8 所示为上拉式接口电路的按键开关在被按下时的抖动示例 可见如果不对按键 进行消抖处理的话 一次按键很可能被单片机识别为多次按键输入 从而产生错误 按下按下释放释放 5ms 5ms稳定期稳定期 图 16 8 键盘闭合与断开时的抖动 因此 按键消抖是必须要考虑的事情 一般来说 按键消抖可以采用软件方式或者硬件方 式来实现 1 软件消抖 由于机械特性的不同 按键的抖动时间长短不等 大致在 5ms 10ms 之间 这样可以在 硬件或软件中进行相应的处理来消除抖动的影响 软件消抖的程序比较简单 一般采用延时函 数来解决 因此在绝大部分嵌入式产品中使用的都是价格便宜会发生抖动的开关按键 并配合 一定按键消抖程序 2 电容式硬件消抖 电容式硬件消抖是最简单的硬件消抖方式 它在按键两端并联一个适合容值的电容 当 开关开始抖动时 对于大部分 TTL 电平器件来说 低电平的门限阀值为 0 8V 高电平门限 阀值为 2 4V 由于电容的作用 抖动产生的电平达不到单片机的电平逻辑输入门限 从而将 抖动带来的影响消除 如图 16 9 所示为布置有消抖并联电容的开关在闭合和断开时的电平变 化示意图 0V 0V 5V 5V 按下按下 按下按下 释放释放 释放释放 5ms5ms稳定期 无消抖电容 有消抖电容 稳定期 无消抖电容 有消抖电容 2 5V 0 8V 图 16 9 利用电容的键盘输入硬件消抖 3 双稳态电路消抖 另外 双稳态电路消抖也是一种应用广泛的硬件消抖方式 如图 16 10 所示 该电路采用 了两个与非门构成的逻辑门电路 通过双稳态电路可以消除按键产生的抖动波形 输出正规的 矩形波 21 天学通 51 单片机开发 第 2 版 340 读键值 03 void Func1 自定义函数1 04 void Func2 自定义函数2 05 void main 第 16 章 51 系列单片机扩展键盘 341 06 07 unsigned char Keyboard Status 定义键值 08 while 1 09 10 Keyboard Status Read Keyboard 读取按键值 11 if Keyboard Status 0 x01 12 13 Func1 14 15 else if Keyboard Status 0 x02 16 17 Func2 18 19 else 20 21 22 23 24 unsigned char Read Keyboard 25 26 unsigned char Keys Value 定义键值变量 27 P2 0 xff P2 端口置高 准备读取按键状态 28 Keys Value P2 读取按键状态 29 return Keys Value 返回按键状态值 30 31 void Func1 32 33 34 void Func2 35 36 运行结果 使用 Keil Vision3 编译程序可以完成该程序的编译和仿真操作 该程序运 行时 将根据键值的不同执行不同的程序 代码解析 在本例中 自定义了读取键值的函数 Read Keyboard 以及两个自定义函数 Func1 和 Func2 在主程序中 通过 while 循环扫描键盘并返回键值 然后通过 if 语句判断键 值 根据键值的不同执行不同的自定义程序 16 3 2 阵列式按键键盘的扫描方式 阵列式按键键盘的结构稍复杂 程序设计方式也更为灵活 本章以最常用的 4 4 阵列式按 键键盘为例进行介绍 最简单的阵列式按键键盘程序设计方式是扫描方式 其电路结构如图 16 11 所示 图 16 11 扫描方式的电路结构 其中 4 4 阵列式键盘由 4 根行线和 4 根列线交叉构成 按键位于行列的交叉点上 这样 便构成 16 个按键 交叉点的行列线是不连接的 当按键按下的时候 此交叉点处的行线和列 21 天学通 51 单片机开发 第 2 版 342 线导通 这里 键盘的行线通过上拉电阻接 5V 电源 此时如果无 任何按键按下 则对应的行线输出为高电平 如果有按键按下 对应交叉点的行线和列线断接 行线的输出依赖于与此行连接的 列的电平状态 由此可以实现矩阵式键盘的编码处理 扫描法是在程序中反复扫描查询键盘接口 根据端口的输入 情况 调用不同的按键处理子程序 键盘扫描法的流程图如图 16 12 所示 键盘扫描的一般步骤如下 判断有无按键按下 将列线 Y0 Y3 全部输出为 0 此时读行线 X0 X3 的状态 如果行线全为 1 则表示此时没 有任何按键按下 如果行线不全为 1 则表示有按键按下 进而继 续执行下面的步骤 软件去抖动 当判断有按键按下之后 程序中延时 10ms 左右的时间后 再次判断一下键盘的状态 如果仍然处于按键按 下的状态 即行线不全为 1 则可以肯定有按键按下 否则当做按 键的抖动来处理 扫描按键的位置 先令列线 Y0 为低电平 0 其余三根列 线均为高电平 1 此时读取行线的状态 如果行线 X0 X3 均 为高电平 则 Y0 这一列上没有按键按下 如果行线 X0 X3 不全为高电平 则其中为低电平的行线与 Y0 相交的按键被按下 如果列 Y0 没有按键按下 这可以按照同样的方法依次检查列 Y1 Y2 和 Y3 有没有按键按下 这样逐列逐行扫描便可以找到按键按下的位置 X Y 一次按键处理 有的时候 为了保证一次按键只进行一次按键处理 可以判断按键是 否释放 如果按键释放则开始执行按键操作 范例 16 2 示例代码 16 2 是一个阵列式按键键盘的扫描方式程序 示例代码 16 2 01 include 02 include 03 int KeyScan 读键值 04 void delay 延时子函数 05 void Func1 自定义函数1 06 void Func2 自定义函数2 07 void main 08 09 int Keyboard Status 定义键值 10 while 1 11 12 Keyboard Status KeyScan 读取按键值 13 if Keyboard Status 0 x01 14 15 Func1 16 17 else if Keyboard Status 0 x02 18 19 Func2 20 21 else 22 23 去抖动 延时10ms 按键是否按下 按键是否按下 开始 扫描按键位置 一次按键处理 Y Y N N 图 16 12 扫描方式的流程图 第 16 章 51 系列单片机扩展键盘 343 24 25 26 int KeyScan 27 28 unsigned char k k temp 29 P1 0 xf0 低位置0 准备查询按键 30 k P1 取得当前P1 端口的状态 31 if k 0 xf0 32 如果有变化则表示有按键按下 33 delay 延时 进行去抖动 34 k temp P1 35 if k k temp 确实有按键按下 36 37 k 0 xfe 38 do 循环扫描每一行 39 40 P1 k 41 if k P1 42 43 switch P1 判断按键 并返回键值 44 45 第1 行 46 case 0 x7e return 0 break 47 case 0 xbe return 1 break 48 case 0 xde return 2 break 49 case 0 xee return 3 break 50 第2 行 51 case 0 x7d return 4 break 52 case 0 xbd return 5 break 53 case 0 xdd return 6 break 54 case 0 xed return 7 break 55 第3 行 56 case 0 x7b return 8 break 57 case 0 xbb return 9 break 58 case 0 xdb return 10 break 59 case 0 xeb return 11 break 60 第4 行 61 case 0 x77 return 12 break 62 case 0 xb7 return 13 break 63 case 0 xd7 return 14 break 64 case 0 xe7 return 15 break 65 66 67 k crol k 1 移位 进入下一行扫描 68 while k 0 xef 超过列范围 退出扫描 69 70 71 72 void Delay 延时子函数 73 74 long i 75 for i 100 i 0 i 可以根据系统的时钟频率来调整 76 77 void Func1 78 79 80 void Func2 81 82 运行结果 使用 Keil Vision3 编译程序可以完成该程序的编译和仿真操作 该程序运 21 天学通 51 单片机开发 第 2 版 344 行时 将根据键值的不同执行不同的程序 代码解析 在本例中 自定义了读取键值的函数 KeyScan 以及两个自定义函数 Func1 和 Func2 硬件上假定矩阵式键盘的 Y0 Y3 接单片机 P1 0 P1 3 而 X0 X3 接 P1 4 P1 7 在主程序中 通过 while 循环来扫描键盘 并返回键值 然后通过 if 语句判断键值 根据键值 的不同执行不同的自定义程序 在 KeyScan 函数中 使用了扫描法来实现键值的读取 使用延 时函数来防抖动 由于在执行按键处理子程序的时候 单片机不能再次响应按键请求 因此 单片机的按键 处理子程序应该尽可能少地占用 CPU 的运行时间 并且尽可能将键盘扫描安排在程序空余的 时候 以满足实时准确响应按键请求的目的 16 3 3 阵列式按键键盘的线反转方式 在前面介绍的阵列式按键键盘的扫描方式中 根据键的位置不同 每次查询的次数是不一 样的 如果按下的键位于最后一列 则要经过多次扫描查询才能获得该按键的位置 为了提高 扫描的效率 提出了阵列式按键键盘的线反转方式 线反转法从本质上来说也是一种扫描法 线反转方式的电路结构如图 16 13 所示 线反转 方式的流程图如图 16 14 所示 阵列式按键键盘的线反转方式的具体操作步骤如下 记录行号 延时10ms 按键是否按下 按键是否按下 开始 记录列号 获得按键位置 一次按键处理 Y Y N N 图 16 13 线反转方式的电路结构 图 16 14 线反转方式的流程图 将行线作为输出线 列线作为输入线 置输出线全部为 0 此时列线中呈低电平 0 的 为按键所在的列 如果全部都不是 0 则没有按键按下 延时 用于去抖动处理 将第一步反过来 即将列线作为输出线 行线作为输入线 置输出线全部为 0 此时 行线中呈低电平 0 的为按键所在的列 至此 便确定了按键的位置 X Y 第 16 章 51 系列单片机扩展键盘 345 一次按键处理 有的时候为了保证一次按键只进行一次按键处理 可以判断按键是否 释放 如果按键释放则开始执行按键操作 这里 在第一步和第二步之间加上延时语句 在第二步中即判断了是否抖动 也可以直接 得到按键的位置 可谓一举两得 而采用线反转方式 无论被按的按键处于第一列还是最后一列 都只需要经过两步便可以 获得此按键的位置 因此 线反转方式更加方便 范例 16 3 示例代码 16 3 是一个阵列式按键键盘的线反转方式程序 示例代码 16 3 01 include 02 include 03 int KeyScan 读键值 04 void delay 延时子函数 05 void Func1 自定义函数1 06 void Func2 自定义函数2 07 void main 08 09 int Keyboard Status 定义键值 10 while 1 11 12 Keyboard Status KeyScan 读取按键值 13 if Keyboard Status 0 x01 14 15 Func1 16 17 else if Keyboard Status 0 x02 18 19 Func2 20 21 else 22 23 24 25 26 int KeyScan void 27 28 int key 29 int temp 30 P1 0 x0F 低4 位输入 31 delay 延时 用于去抖动 32 temp P1 读P1 端口 33 temp temp 获取列值 34 temp temp 0 xF0 35 if temp 1 根据列值 为key 赋值 36 key 0 37 else if temp 2 38 key 1 39 else if temp 4 40 key 2 41 else if temp 8 42 key 3 43 else 44 key 16 45 P1 0 xF0 高4 位输入 46 delay 延时 用于去抖动 47 temp P1 读P1 端口 21 天学通 51 单片机开发 第 2 版 346 48 temp temp 获取行号 49 temp temp 4 0 xF0 50 if temp 1 根据行号 为key 赋值 51 key key 0 52 else if temp 2 53 key key 4 54 else if temp 4 55 key key 8 56 else if temp 8 57 key key 12 58 else 59 key 16 60 return key 返回按键编号 61 62 void Delay 延时子函数 63 64 long i 65 for i 10000 i 0 i 可以根据系统的时钟频率来调整 66 67 void Func1 68 69 70 void Func2 71 72 运行结果 使用 Keil Vision3 编译程序可以完成该程序的编译和仿真操作 该程序运 行时 将根据键值的不同执行不同的程序 代码解析 在本例中 自定义了读取键值的函数 KeyScan 以及两个自定义函数 Func1 和 Func2 硬件上假定矩阵式键盘的 Y0 Y3 接单片机 P1 0 P1 3 而 X0 X3 接 P1 4 P1 7 在主程序中 通过 while 循环来扫描键盘 并返回键值 然后通过 if 语句判断键值 根据键值 的不同执行不同的自定义程序 在 KeyScan 函数中 使用了线反转方式来实现键值的读取 使 用延时函数来防抖动 16 3 4 阵列式按键键盘的中断方式 无论是阵列式按键键盘的扫描方式还是线反转方式 CPU 总是要不断地扫描键盘 占 用了很多 CPU 处理时间 这在有些时候是效率很低的 为此 可以采用中断的方式来读 取键值 中断法是将键盘扫描程序放置在单片机的中断服务例程中的方法 只有当按键按下的时 候 才触发中断 进而扫描键值 因此 采用中断法进行键盘设计可以提高 CPU 的工作效率 特别适合于复杂的系统或对实时性要求比较高的场合 中断方式的原理图如图 16 15 所示 其中 4 4 矩阵式键盘的列线与单片机 P1 端口的高 4 位相连 行线通过二极管与单片机 P1 端口的低 4 位相连 P1 0 P1 3 作为输入端 P1 4 P1 7 作为输出端 键盘的 4 根行线分别引出连接到一个具有 4 输入端的与门 输出端接单片机的外 部中断 INT0 当然也可以采用外部中断 INT1 系统初始化的时候 程序中将键盘的输出端口全部置低电平 0 当有按键按下的时 候 INT0 将变为低电平 此时向单片机发出中断请求 CPU 响应中断并进入中断服务 程序 在中断服务程序中 可以按照前面的扫描方式或者线反转方式来获得按键的位置 信息 X Y 第 16 章 51 系列单片机扩展键盘 347 图 16 15 中断法原理图 范例 16 4 示例代码 16 4 是一个阵列式按键键盘的中断方式程序 示例代码 16 4 01 include 头文件 02 include 03 int KeyScan void 键盘扫描函数 04 int key 05 void main 06 构造外部中断0 INT0 P3 2 07 IT0 1 下降沿触发 08 EX0 1 开EX0 中断 09 EA 1 开发中断 10 P1 0 x0FF 11 while 1 用户程序段 12 13 14 15 void FuncIr void interrupt 0 中断程序 16 17 key KeyScan 获取键值 18 19 int KeyScan void 20 21 int key 22 int temp 23 P1 0 x0F 低4 位输入 24 delay 延时 用于去抖动 25 temp P1 读P1 端口 26 temp temp 获取列值 27 temp temp 0 xF0 28 if temp 1 根据列值 为key 赋值 29 key 0 30 else if temp 2 31 key 1 32 else if temp 4 33 key 2 34 else if temp 8 35 key 3 36 else 37 key 16 21 天学通 51 单片机开发 第 2 版 348 38 P1 0 xF0 高4 位输入 39 delay 延时 用于去抖动 40 temp P1 读P1 端口 41 temp temp 获取行号 42 temp temp 4 0 xF0 43 if temp 1 根据行号 为key 赋值 44 key key 0 45 else if temp 2 46 key key 4 47 else if temp 4 48 key key 8 49 else if temp 8 50 key key 12 51 else 52 key 16 53 return key 返回按键编号 54 运行结果 使用 Keil Vision3 编译程序可以完成该程序的编译和仿真操作 该程序运 行时 当有按键动作的时候将触发中断从而获取键值 代码解析 在本例中 自定义了读取键值的函数 KeyScan 这是键盘扫描程序 采用前 面介绍的线反转方式来实现 主函数中没有对键盘的扫描语句 因此可以用来执行其他用户程 序 键盘扫描程序放置在中断服务例程 Funclr 中 按照中断法的原理 其只有在键盘上有键按下的时候 才发出中断请求 CPU 响应中断请 求后 在中断服务程序中 进行键盘扫描 获得按键信息 16 4 单片机扩展键盘实例 有了前面这些关于键盘的知识及程序设计方法后 我们便可以进行完整的键盘设计实例 这个实例采用 4 4 阵列式按键键盘 可以输入 0 9 A F 共 16 个键值 根据键值的大小 使两个 LED 数码管交替闪烁相应的次数 16 4 1 电路原理图 整个系统完整的电路图如图 16 16 所示 这个电路可以从前面的单片机最小开发系统中通 过扩展键盘来获得 该电路所需的元器件如表 16 1 所示 表 16 1 元器件列表 元 件 数值及数量 元 件 数值及数量 U1 AT89S51 1 个 R3 R10 10k 8 个 C1 C2 30pF 2 个 R11 1k 排阻 1 个 Y1 24MHz 1 个 JP1 4 4 矩阵式键盘 1 个 R1 5k 1 个 LED1 LED2 发光二极管 红色和绿色各一个 R2 200 1 个 S1 复位开关 1 个 其中 JP1 KEY 为 4 4 矩阵式键盘 其列号 1 4 分别接 P1 3 P1 0 行号 1 4 分别 接 P1 7 P1 4 R11 为键盘上拉电阻排 R3 R10 为单片机 P0 口的上拉电阻 P2 0 引脚和 P2 1 引脚分别外接一个发光二极管 颜色分别为红色和绿色 第 16 章 51 系列单片机扩展键盘 349 图 16 16 电路图 16 4 2 程序设计 本例综合运用前面所讲的知识 程序中通过线反转法来扫描查询 4 4 矩阵式键盘 如果检 测到按键按下 读取键值 然后根据按键的键值来交替闪烁发光二极管相应的次数 程序的流 程图如图 16 17 所示 点亮发光二极管1 熄灭发光二极管2 按键是否按下 开始 延时 点亮发光二极管2 熄灭发光二极管1 Y N 图 16 17 流程图 21 天学通 51 单片机开发 第 2 版 350 范例 16 5 示例代码 16 5 是一个单片机扩展键盘程序 示例代码 16 5 01 include 头文件 02 include 头文件 03 int row 定义行号 04 int tier 定义列号 05 int KeyScan 子函数声明 06 void Delay 07 void main 主函数 08 09 int Key i 10 P2 0 x00 初始化 熄灭发光二极管 11 while 1 开始循环扫描键盘 12 13 Key KeyScan 键盘扫描子函数 14 for i 0 i0 i 可以根据系统的时钟频率来调整 27 28 int KeyScan 键盘扫描子函数 29 30 P1 0 xF0 列输出全0 31 if P1 37 break 38 case 0 xB0 39 row 2 40 break 41 case 0 xD0 42 row 3 43 break 44 case 0 xE0 45 row 4 46 break 47 default 48 break 49 50 Delay 延时去抖动 51 P1 0 x0F 行输出全0 52 if P1 58 break 59 case 0 x0B 60 tier 2 61 break 62 case 0 x0D 63 tier 3 64 break 65 case 0 x0E 66 tier 4 67 break 68 default 69 break 70 71 return 4 row 1 tier 扫描到按键 返回键值 72 73 74 else 75 76 return 0 未扫描到按键按下 返回0 77 78 运行结果 使用 Keil Vision3 编译程序可以完成该程序的编译和仿真操作 该程序运 行时 当有按键动作的时候将触发中断从而获取键值 代码解析 在本例中 主函数执行循环键盘扫描 由 while 循环构成 通过调用 KeyScan 函数获得键值 并根据键值循环点亮熄灭发光二极管 1 和 2 另外 该程序还分别自定义了两 个函数 分别用于延时和线反转法键盘扫描 对于键盘扫描部分 程序中采用了软件去抖动的 方法来消除按键抖动的影响 16 5 综合练习 开发一个采用扫描方式的阵列键盘中断获取键值的程序 提示 01 include 头文件 02 include 03 int KeyScan void 键盘扫描函数 04 int key 05 void main 06 构造外部中断0 INT0 P3 2 07 IT0 1 下降沿触发 08 EX0 1 开EX0 中断 09 EA 1 开发中断 10 P1 0 x0FF 11 while 1 用户程序段 12 13 14 15 void FuncIr void interrupt 0 中断程序 16 17 key KeyScan 获取键值 18 19 int KeyScan 20 21 天学通 51 单片机开发 第 2 版 352 21 unsigned char k k temp 22 P1 0 xf0 低位置0 准备查询按键 23 k P1 取得当前P1 端口的状态 24 if k 0 xf0 25 如果有变化则表示有按键按下 26 delay 延时 进行去抖动 27 k temp P1 28 if k k temp 确实有按键按下 29 30 k 0 xfe 31 do 循环扫描每一行 32 33 P1 k 34 if k P1 35 36 switch P1 判断按键 并返回键值 37 38 第1 行 39 case 0 x7e return 0 break 40 case 0 xbe return 1 break 41 case 0 xde return 2 break 42 case 0 xee return 3 break 43 第2 行 44 case 0 x7d return 4 break 45 case 0 xbd return 5 break 46 case 0 xdd return 6 break 47 case 0 xed return 7 break 48 第3 行 49 case 0 x7b return 8 break 50 case 0 xbb return 9 break 51 case 0 xdb return 10 break 52 case 0 xeb return 11 break 53 第4 行 54 case 0 x77 return 12 break 55 case 0 xb7 return 13 break 56 case 0 xd7 return 14 break 57 case 0 xe7 return 15 break 58 59 60 k crol k 1 移位 进入下一行扫描 61 while k 0 xef 超过列范围 退出扫描 62 63 64 65 void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 政审考试题库及答案解析
- 矿山电子高级考试题库及答案
- 征信考试题库及答案
- 商业合作市场调研分析报告合同
- 企业合同管理模板及风险提示
- 2025年新疆农作物制种质量保障合同
- 2025年贵州公需科目之乡村振兴试题(含答案)
- 祁阳历史中考试卷及答案
- 技校政治考试题目及答案
- 唐山单招十类考试题及答案
- 第三方担保欠款协议书范文模板
- 【百岁居】百岁居内外勤版本
- 国开(河北)2024年《商务谈判实务》形成性考核1-4答案
- 2024年上海交易集团有限公司招聘笔试冲刺题(带答案解析)
- 2024年首届全国“红旗杯”班组长大赛考试题库800题(含答案)
- 职场英语口语900句
- 物流地产行业报告:物流地产商业模式与投资解析
- 朝花夕拾鲁迅笔下的人物
- 设备类风险辨识培训课件
- DB32-T 4638-2024 智能泵站技术导则
- 黔菜菜名英译规范
评论
0/150
提交评论