键盘扫描原理及应用键盘
键盘扫描程序实验报告
一、实验目的1. 理解键盘扫描的基本原理。
2. 掌握使用C语言进行键盘扫描程序设计。
3. 学习键盘矩阵扫描的编程方法。
4. 提高单片机应用系统的编程能力。
二、实验原理键盘扫描是指通过检测键盘矩阵的行列状态,判断按键是否被按下,并获取按键的值。
常见的键盘扫描方法有独立键盘扫描和矩阵键盘扫描。
独立键盘扫描是将每个按键连接到单片机的独立引脚上,通过读取引脚状态来判断按键是否被按下。
矩阵键盘扫描是将多个按键排列成矩阵形式,通过扫描行列线来判断按键是否被按下。
这种方法可以大大减少引脚数量,降低成本。
本实验采用矩阵键盘扫描方法,使用单片机的并行口进行行列扫描。
三、实验设备1. 单片机开发板(如51单片机开发板)2. 键盘(4x4矩阵键盘)3. 连接线4. 调试软件(如Keil)四、实验步骤1. 连接键盘和单片机:将键盘的行列线分别连接到单片机的并行口引脚上。
2. 编写键盘扫描程序:(1)初始化并行口:将并行口设置为输入模式。
(2)编写行列扫描函数:逐行扫描行列线,判断按键是否被按下。
(3)获取按键值:根据行列状态,确定按键值。
(4)主函数:调用行列扫描函数,读取按键值,并根据按键值执行相应的操作。
3. 调试程序:将程序下载到单片机,观察键盘扫描效果。
五、实验程序```c#include <reg51.h>#define ROW P2#define COL P3void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);}void scan_key() {unsigned char key_val = 0xFF;ROW = 0xFF; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值}void main() {while (1) {scan_key();if (key_val != 0xFF) {// 执行按键对应的操作}}}```六、实验结果与分析1. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。
键盘扫描原理
键盘扫描原理
键盘是计算机输入设备中最常用的一种,它通过将人们的按键操作转换成计算机可以识别的信号,从而实现了人机交互。
而键盘的核心部分就是键盘扫描原理,它是如何实现的呢?
首先,我们需要了解键盘的工作原理。
当我们按下键盘上的某一个按键时,就会产生一个按键信号,这个信号会通过键盘的电路传输到计算机主机上。
而键盘扫描原理就是指计算机是如何检测到这个按键信号的。
键盘扫描原理的核心就是矩阵扫描。
键盘上的每一个按键都对应着一个电路,这些电路会以矩阵的形式排列在键盘的背后。
当我们按下某一个按键时,对应的电路就会闭合,从而产生一个按键信号。
计算机会通过扫描这个矩阵来检测到按键信号的产生。
具体来说,计算机会以一定的频率扫描键盘上的每一个按键,检测它们是否产生了按键信号。
这个扫描的频率通常很高,所以我们按下按键时几乎可以立即得到响应。
一旦计算机检测到有按键信号产生,它就会将这个信号转换成相应的键值,从而实现了按键的输入。
除了矩阵扫描,现代键盘还采用了一些其他技术来提高性能和稳定性。
比如采用了多种防抖动技术,防止因按键抖动而产生误操作;采用了多种按键轮询技术,提高了按键的灵敏度和反应速度;还采用了多种按键编码技术,提高了按键的识别准确性和稳定性。
总的来说,键盘扫描原理是键盘工作的核心,它通过矩阵扫描等技术实现了对按键信号的检测和转换,从而实现了人机交互。
随着技术的不断发展,键盘的性能和稳定性会不断提高,为人们的使用体验带来更多的便利和舒适。
键盘扫描芯片
键盘扫描芯片键盘扫描芯片是一种用于扫描和控制键盘的集成电路芯片。
它通常嵌入在电脑、手机和其他类似设备的键盘部分。
键盘扫描芯片的功能主要包括以下几个方面:1. 扫描键盘:键盘扫描芯片将键盘上每一个按键都与一个特定的电路连接起来,通过扫描该电路的状态,可以检测到用户是否按下某个按键。
2. 解码按键:扫描芯片一旦检测到按键按下,就会将按键的码值转换为计算机可以识别的数据,然后传输给计算机或其他设备。
3. 键盘状态检测:键盘扫描芯片可以检测键盘上多个按键同时按下的情况,并且能够正确解析这些按键的状态。
4. 控制键盘发光:一些键盘扫描芯片还可以控制键盘上的背光灯或指示灯的亮灭,以提高键盘的可视性。
5. 噪声消除:键盘扫描芯片还可以通过消除按键产生的电磁干扰和噪声,提高键盘的信号质量。
键盘扫描芯片的工作原理主要分为以下几个步骤:1. 扫描电路:键盘扫描芯片通过一组复用电路,逐个扫描键盘上的每一个按键。
具体来说,它会按照一定的频率依次给每一个按键提供电流,然后通过检测电路的电流变化来确定该按键是否被按下。
2. 码值解码:一旦检测到按键按下,键盘扫描芯片会根据每个按键电路的位置和连接关系,将按键的码值转换为对应的计算机可识别的数据。
这样,计算机就能够知道用户按下了哪个按键。
3. 数据传输:键盘扫描芯片将解码后的数据传输给计算机或其他设备。
通常,它会通过串行或并行接口与计算机通信,并根据协议协商好的数据格式传输数据。
键盘扫描芯片的优势主要有以下几点:1. 高效稳定:键盘扫描芯片使用电路扫描的方式,可以快速稳定地扫描和检测键盘上的每一个按键,提高键盘的反应速度和稳定性。
2. 节省成本:键盘扫描芯片的集成度高、体积小,能够将多个功能集成在一个芯片中,减少了所需的电路板面积和元器件数量,从而降低了成本。
3. 可靠性:键盘扫描芯片可以通过软件算法和硬件检测机制,准确判断键盘上按键的状态,避免误操作和按键冲突,提高整个系统的可靠性。
扫描键盘的原理
扫描键盘的原理
键盘扫描原理是通过一种叫做"矩阵扫描"的技术来实现的。
它
主要依靠键盘上方的一组电路来完成输入信号的检测和传递。
具体来说,键盘通常有多行多列的布局。
每个按键都与一个特定的行和列相连,形成一个按键矩阵。
当我们按下某个按键时,键盘的控制器会首先激活按键所在的行,然后依次检查每一列。
如果有任何一列检测到有电流通过,就说明该按键被按下。
为了实现这个过程,键盘内部的控制器会周期性地激活行,并读取列上的电流状况。
它会通过一个循环的方式,每次激活一行并读取所有列的状态,以此来获得所有按键的输入信号。
这种矩阵扫描的方式可以同时检测多个按键的状态,从而实现多键同时按下的功能。
一旦控制器检测到按键被按下,它会将相应的按键码发送给计算机,然后由操作系统或相应的应用程序来处理这个输入。
键盘控制器和计算机之间的通信通常是通过USB或PS/2接口完
成的。
总的来说,键盘的扫描原理就是基于矩阵扫描技术,通过激活行和读取列的方式,检测按键的输入信号,并将其传递给计算机进行处理。
简述列扫描方式检查键盘是否有键闭合的原理
简述列扫描方式检查键盘是否有键闭合的原理
列扫描方式是一种常见的检查键盘是否有键闭合的方法。
它的原理是通过对键盘上的每个键进行扫描,检测键盘是否有键闭合,并将闭合的键输出为相应的输入信号。
键盘是由多个按键组成的,每个按键都有一个开关。
当按下一个按键时,开关闭合,形成一个电路通路,键盘就会产生一个输入信号。
而当按键松开时,开关断开,电路中断,输入信号消失。
为了检测键盘是否有键闭合,列扫描方式首先对键盘的每一列进行扫描。
在扫描的过程中,通过给每一列加上电压,可以检测到是否有按键与该列连接,并产生输入信号。
如果有按键与某一列连接,则该列会检测到输入信号。
接下来,对于每一列检测到输入信号的情况,需要进一步检查该列中具体哪个按键闭合。
这时候,需要对该列中的每个按键进行逐个扫描。
通过给每个按键加上电压,可以检测到是否有按键闭合,并产生相应的输入信号。
如果有按键闭合,则可以确定该按键是闭合的。
通过对每一列进行扫描,并对每一列中的按键进行逐个扫描,列扫描方式可以检测到键盘是否有键闭合,并输出闭合的键为相应的输入信号。
这样,计算机或其他设备就可以根据输入信号进行相应的操作。
总结一下,列扫描方式是通过对键盘的每一列进行扫描,检测是否有按键闭合,并输出闭合的键为相应的输入信号。
它的原理是通过给每一列加上电压,检测是否有按键与该列连接,并通过逐个扫描每个按键,检测是否有按键闭合。
通过这种方式,可以准确地检测键盘是否有键闭合,并输出相应的输入信号。
这种方法简单、有效,被广泛应用于键盘的检测和输入信号的获取。
识别按键的两种常用方法
识别按键的两种常用方法
在计算机编程中,识别按键有两种常用的方法:
1. 硬件扫描法:
- 工作原理:通过直接读取键盘的硬件信号来检测按键的按下和释放。
- 优点:响应速度快,适用于对实时性要求较高的应用。
- 缺点:需要了解底层硬件,编程较为复杂,且不同键盘可能需要不同的驱动程序。
2. 软件扫描法:
- 工作原理:通过不断查询键盘状态来检测按键的按下和释放。
- 优点:编程相对简单,不需要了解具体的硬件细节,适用于大多数常见的应用。
- 缺点:可能会消耗一定的CPU 资源,因为需要不断地查询键盘状态。
这两种方法各有优缺点,需要根据具体的应用场景和需求来选择。
在现代编程中,通常使用操作系统提供的键盘事件处理机制,它会自动将按键事件通知给应用程序,从而简化了按键识别的过程。
键盘扫描原理及应用键盘
键盘扫描原理及应⽤键盘本资源为⽹上搜集⽽来,如果该程序涉及或侵害到您的版权请⽴即写信通知我键盘扫描键盘是由按键构成,是单⽚机系统⾥最常⽤的输⼊设备。
我们可以通过键盘输⼊数据或命令来实现简单的⼈-机通信。
1.按键及键抖动按键是⼀种常开型按钮开关。
平时,按键的两个触点处于断开状态,按下按键时两个触点才闭合(短路)。
如图1-1所⽰,平常状态下,当按键K未被按下时,按键断开,PA0输⼊⼝的电平为⾼电平;当按键K被按下时,按键闭合,PA0输⼊⼝的电平为低电平。
图1-1 按键电路图1-2 按键抖动⼀般的按键所⽤开关都是机械弹性开关,由于机械触点的弹性作⽤,按键开关在闭合时不会马上稳定地连接,在断开进也不会马上完全的断开,在闭合和断开的瞬间均有⼀连串的抖动。
按键按下的电压信号波形图如图1-2所⽰,从图中可以看出按键按下和松开的时候都存在着抖动。
抖动时间的长短因按键的机械特性不同⽽有所不同,⼀般为5ms~10ms。
如果不处理键抖动,则有可能引起⼀次按键被误读成多次,所以为了确保能够正确地读到按键,必须去除键抖动,确保在按键的稳定闭合和稳定断开的时候来判断按键状态,判断后再做处理。
按键在去抖动,可⽤硬件或软件两种⽅法消除。
由于使⽤硬件⽅法消除键抖动,⼀般会给系统的成本带来提⾼,所以通常情况下都是使⽤软件⽅法去除键抖动。
常⽤的去除键抖动的软件⽅法有很多种,但是都离不开基本的原则:就是要么避开抖动的时候检测按键或是在抖动的时候检测到的按键不做处理。
这⾥说明⼀下常⽤的两种⽅法:第⼀种⽅法是检测到按键闭合电平后先执⾏⼀个延时程序,做⼀个12ms~24ms的延时,让前抖动消失后再⼀次检测按键的状态,如果仍是闭合状态的电平,则认为真的有按键按下;若不是闭合状态电平,则认为没有键按下。
若是要判断按键松开的话,也是要在检测到按键释放电平之后再给出12ms~24ms的延时,等后抖动消失后再⼀次检测按键的状态,如果仍为断开状态电平,则确认按键松开。
键盘扫描原理
键盘扫描原理
键盘扫描原理是指通过控制信号将按键状态传输到计算机的一种技术。
它主要分为两个步骤:键盘扫描和数据传输。
在键盘扫描过程中,计算机会发送扫描码(scan code)到键盘。
扫描码是一个8位的二进制数,用于唯一标识每个按键。
键盘内部有一个按键矩阵,当按键按下时,会触发相应的行和列连线,形成一个电路通路。
键盘通过轮询的方式扫描每个按键的状态,并生成扫描码。
一旦键盘生成了扫描码,它就会通过电缆传输给计算机。
数据传输的方式可以是串行还是并行,取决于键盘和计算机之间的连接方式。
对于串行传输,扫描码会被逐位地发送到计算机。
对于并行传输,扫描码会同时发送到计算机的多个引脚上。
计算机接收到扫描码后,会根据预先定义的映射表将其转换为相应的字符或功能。
映射表可以根据键盘类型和语言环境的不同而有所不同。
计算机将转换后的按键信息存储在一个缓冲区中,供操作系统或应用程序读取和处理。
总结来说,键盘扫描原理通过扫描码和数据传输将按键状态传输给计算机。
这种技术广泛应用于各种键盘设备,包括传统的有线键盘和现代的无线键盘。
键盘扫描显示实验报告
一、实验目的1. 理解键盘扫描的基本原理,掌握键盘扫描的方法。
2. 掌握数码管显示的基本原理,实现键盘扫描信息的实时显示。
3. 熟悉8255并行接口芯片在键盘扫描和数码管显示中的应用。
二、实验原理1. 键盘扫描原理:键盘扫描是指通过硬件电路对键盘按键进行检测,并将按键信息转换为可识别的数字信号的过程。
本实验采用行列式键盘,通过扫描键盘的行线和列线,判断按键是否被按下。
2. 数码管显示原理:数码管是一种用来显示数字和字符的显示器,由多个发光二极管(LED)组成。
本实验采用七段数码管,通过控制各个段(A、B、C、D、E、F、G)的亮灭,显示相应的数字或字符。
3. 8255并行接口芯片:8255是一款通用的并行接口芯片,具有三个8位并行I/O口(PA、PB、PC),可用于键盘扫描和数码管显示的控制。
三、实验设备1. 实验平台:PC机、8255并行接口芯片、行列式键盘、七段数码管、面包板、导线等。
2. 软件环境:汇编语言编程软件、仿真软件等。
四、实验步骤1. 硬件连接:将8255并行接口芯片、行列式键盘、七段数码管连接到实验平台上,按照电路图进行连线。
2. 编写程序:使用汇编语言编写键盘扫描和数码管显示的程序。
(1)初始化8255并行接口芯片:设置PA口为输出端口,PB口为输出端口,PC口为输入端口。
(2)扫描键盘:通过PC口读取键盘的行线状态,判断是否有按键被按下。
若检测到按键被按下,读取对应的列线状态,确定按键的位置。
(3)数码管显示:根据按键的位置,控制数码管的段(A、B、C、D、E、F、G)的亮灭,显示相应的数字。
3. 仿真调试:使用仿真软件对程序进行调试,确保程序能够正确扫描键盘和显示数字。
五、实验结果与分析1. 实验结果:成功实现了键盘扫描和数码管显示的功能。
当按下键盘上的任意按键时,数码管上会显示对应的数字。
2. 分析:(1)键盘扫描部分:通过读取PC口的行线状态,判断是否有按键被按下。
当检测到按键被按下时,读取PB口的列线状态,确定按键的位置。
电子键盘的扫描原理
电子键盘的扫描原理电子键盘是现代计算机和其他电子设备中常见的输入设备之一,其工作原理是通过扫描来检测用户按下的按键,并将按键信息传输给相关设备进行处理。
本文将介绍电子键盘的扫描原理及其工作流程。
一、电子键盘的基本结构电子键盘通常由一组按键和控制电路组成。
按键通常被分为几行和几列,并通过金属导线或薄膜电路板连接到控制电路。
每个按键都有一个唯一的标识符,如字符、数字或功能键。
二、键盘扫描的工作原理电子键盘通过扫描技术来检测用户按下的按键。
简单来说,扫描过程分为两个步骤:行扫描和列扫描。
1. 行扫描在行扫描阶段,控制电路将一个个地激活每一行线路,从第一行开始直到最后一行。
当一行被激活时,与该行相对应的列被连接到控制电路上的输入端。
如果没有按键按下,该列电路将保持高电平。
如果有按键按下,该列电路将变为低电平。
2. 列扫描在列扫描阶段,控制电路逐列地检测每一列线路的电平状态。
如果某列电路检测到低电平,则表示该列对应的按键被按下。
控制电路将记录下按下按键所在的行和列信息。
三、键盘扫描的工作流程电子键盘的扫描工作流程可以简要概括如下:1. 初始化开始时,控制电路保持所有行线路为高电平状态,并等待用户按下按键。
2. 行扫描控制电路依次激活每一行线路,从第一行到最后一行。
对于每一个激活的行,控制电路会检查每一列线路的电平状态。
3. 检测按键如果有按键被按下,控制电路将记录下按下按键所在的行和列信息,并将其保存在缓存中。
4. 输出按键信息一旦扫描完成,控制电路将按下按键的信息传输给相关设备进行进一步处理。
比如,在计算机中,操作系统会接收到按键信息,并将其转化为相应的字符或指令。
四、扫描速度和反馈机制电子键盘的扫描速度通常非常快,以保证用户在快速输入时不会出现按键丢失或错位的情况。
现代的电子键盘通常采用多级的硬件扫描技术,使得扫描速度更快,响应更准确。
另外,一些高级电子键盘还会提供按键反馈机制,比如机械键盘中的轴体触发,通过物理机械结构产生明显的触感和声音反馈,以增强用户的输入体验。
实验五 键盘扫描实验 实验报告
实验五键盘扫描实验实验报告一、实验目的本次实验的主要目的是深入了解键盘扫描的工作原理,掌握键盘扫描的编程实现方法,以及提高对硬件接口和软件编程的综合应用能力。
二、实验设备1、计算机一台2、实验开发板一套3、下载线一根4、键盘一个三、实验原理键盘扫描的基本原理是通过逐行或逐列扫描键盘矩阵,检测按键的按下和释放状态。
常见的键盘扫描方式有行列式扫描和编码式扫描。
在行列式扫描中,将键盘的行线和列线分别连接到微控制器的输入输出端口。
通过依次将行线设置为低电平,同时读取列线的状态,来判断是否有按键按下。
如果在某一行被设置为低电平时,对应的列线检测到低电平,则表示该行和该列交叉处的按键被按下。
编码式扫描则是利用专门的编码芯片对键盘进行扫描和编码,微控制器只需读取编码芯片输出的按键编码即可确定按键的状态。
四、实验步骤1、硬件连接将实验开发板与计算机通过下载线连接好。
将键盘连接到实验开发板的相应接口。
2、软件编程选择合适的编程语言和开发环境,如 C 语言和 Keil 开发环境。
定义键盘的行线和列线所对应的端口。
编写扫描函数,实现键盘扫描的逻辑。
在主函数中调用扫描函数,并根据返回的按键值进行相应的处理,如显示按键字符或执行特定的操作。
3、编译下载对编写好的程序进行编译,检查是否有语法错误。
将编译生成的可执行文件下载到实验开发板中。
4、实验测试按下键盘上的不同按键,观察实验开发板上的显示或输出结果是否正确。
检查是否能够准确检测到按键的按下和释放,以及是否存在按键抖动等问题。
五、实验结果与分析1、实验结果在实验过程中,成功实现了对键盘的扫描,并能够准确检测到按键的按下。
按下不同的按键时,实验开发板能够正确显示相应的按键字符或执行预定的操作。
2、结果分析对于按键的准确检测,说明编写的扫描函数逻辑正确,能够有效地识别键盘矩阵中的按键状态变化。
在检测到按键按下时,没有出现误判或漏判的情况,表明行线和列线的设置以及读取操作正常。
按键检测的基本原理及其应用
按键检测的基本原理及其应用1. 按键检测的定义和概述按键检测是指对物理按键的状态进行检测和识别的过程。
在现代电子设备和计算机系统中,按键是用户与设备进行交互的重要途径之一,而按键检测则是判断用户是否对按键进行了操作的关键。
2. 按键检测的基本原理按键检测的基本原理是通过检测按键电路的状态来判断用户是否对按键进行了操作。
下面是按键检测的基本原理:•当按键未被按下时,按键电路处于断路状态。
•当按键被按下时,按键电路会变为闭路状态。
•检测按键电路的状态可以通过测量电阻、电流、电压等参数来实现。
3. 按键检测的方法按键检测可以通过以下几种方法来实现:3.1 基于轮询的方法基于轮询的方法是最常见的按键检测方法之一。
它的原理是周期性地读取按键状态,并进行判断。
以下是基于轮询的按键检测方法的基本步骤:1.设置一个循环,周期性地读取按键状态。
2.如果按键被按下,则进行相应的操作。
3.如果按键未被按下,则继续进行轮询。
3.2 基于中断的方法基于中断的方法是另一种常见的按键检测方法,它的原理是通过中断信号来判断按键状态的变化。
以下是基于中断的按键检测方法的基本步骤:1.设置一个中断服务程序,用于处理按键中断信号。
2.当按键被按下时,触发中断信号并调用中断服务程序。
3.中断服务程序对按键进行判断,并进行相应的操作。
3.3 基于矩阵扫描的方法基于矩阵扫描的方法是一种多按键检测的方法,它可以同时检测多个按键的状态。
以下是基于矩阵扫描的按键检测方法的基本步骤:1.将按键排列成一个矩阵的形式。
2.循环地扫描矩阵的每一个按键。
3.根据扫描结果判断按键的状态,并进行相应的操作。
4. 按键检测的应用按键检测在各种电子设备和计算机系统中都有广泛的应用。
以下是一些常见的按键检测应用:•键盘:计算机键盘是最常见的按键检测应用之一,它用于输入文字和命令。
•手机:智能手机中的物理按键和虚拟按键都需要按键检测来进行操作和控制。
•游戏机:游戏机中的控制器需要按键检测来实现玩家的操作。
键盘检测原理
键盘检测原理
键盘检测原理是指通过对键盘输入信号的监听和解析,判断出用户在键盘上按下的具体按键,并将其转换为计算机可识别的数字或字符,以便进行相应的操作或数据输入。
键盘是计算机最常用的输入设备之一,它由一组按键组成,每个按键代表着一个特定的字符或功能。
当用户按下键盘上的某个按键时,按键会向计算机发送一个电信号,通过按键与控制电路的连通,电信号会被传送到计算机的主板或键盘控制器。
键盘检测的原理可以分为两个主要阶段:扫描和解码。
在扫描阶段,键盘控制器会周期性地向键盘发送扫描码。
扫描码是通过按键被按下或释放时,在按键的电路中产生的电信号。
键盘控制器会按照一定的扫描码规则依次向键盘发送扫描码,然后等待键盘的应答。
当键盘接收到扫描码后,在按键的电路中会产生相应处理,并将处理好的扫描码返回给键盘控制器。
键盘控制器会将这些扫描码保存在缓冲区中,以便后续的解码。
在解码阶段,键盘控制器对缓冲区中的扫描码进行解码。
解码的过程通常是通过查找键盘的映射表,将扫描码转换成对应的字符或功能。
映射表可以存储在键盘控制器中,也可以在计算机的操作系统中进行配置。
解码完成后,操作系统会将解码后的字符或功能传送给相应的
应用程序或系统模块,以完成相应的操作或数据输入。
总结起来,键盘检测原理是通过键盘控制器对键盘输入信号的扫描和解码,将按键的电信号转换为计算机可识别的数字或字符,以实现数据输入和操作的目的。
这个过程在键盘控制器的控制下进行,并且需要与操作系统和应用程序进行配合。
浅析4×4键盘扫描原理
e a s e 0 x 0 7 : {} r e a k ;
s wi t c h ( t 1 / / s wi t c h - c a s e 循 环
f 分为编码键盘和非编码键盘。编码键盘能 1被按下。 j 硬件逻辑 自动提供与被按键 自动的编码, 若 Y3 、Y2 、Y1 、 YO为 1 0 1 1 , 代 表 按 键 还有去抖动、多键识别等功能。这种键盘
一
i f Ke y l = O x O 0 / / 不等有按键被按下 { d e l a y ( 2 0 ) ; / / 延 时 去 抖 动
i f ( Ke y ! = O x O f ) / / 再 次判断是否有按键被 个 电阻到公共端 ( c o n)上 。根据 扫描方式 r 按 下 的不 同,c o m可能连接 到 VC C或 G | ND,当我 f Ke y = 0 x e g H 1 1 1 0 1 1 1 1 从第一列开始 们 要进行键盘 扫描时 ,则将扫描信 号送至 XO 扫 描 键词 】键盘 电平 扫描 到X 3 ,再 由 Y O 至 Y3 读取键盘状态 ,即可判 t = Ke y &0 x 0 f ; / / 读取按键状态并保留行 断哪个按键被按 下。键盘扫描 的方式有两种 , 值 即低 电平扫描与高 电平扫描 ,说 明如下。 s wi t c h ( t 1 / / s wi t c h — c a s e循环 低 电平扫描 是将公共 端 t o m 连接 VC C, { c a s e 0 x 0 e : {} b r e a k ; 没 有 任 何 按 键按 下时 ,Y3 、Y 2 、Y1 、YO端 e a s e 0 x 0 d : {} b r e a k ; 能保 持 高 电平。送 入 X 3 、X2 、X1 、X O的 扫 键盘 是单 片机应 用系 统 中最常用 的输 入 c a s e O x O b : {} b r e k; a 之一,由若干按键按照一定规则组成,每 描信 号之 中,只有 一个 为低电平,其 余三个 为 c a s e O x 0 7 : {) b r e k; a 个 阶段,在第一个 按键实际上是一个开关元件,按其构造可 高电平。整个工作可分为 4 d e f a u l t : br e a k; 、按键 2 、按 7 有触点、无触点两类。有触点开关按键有 阶段里 ,主 要 目的是判断按 键 3 } 1 1 0 B信 i 开关 、弹片式微动开关、导电橡胶等;无 键 l及按键 0有没有被按下 首先将 1 Ke y = 0 x d f ; H 1 1 0 1 1 1 1 1 从 第 二 列 开 始 扫 、X 2 、X1 、X0 ,也 就是只有 X0为 ( 开关按键有 电容式按键、光电式按键和磁 号送入 X3
反转法键盘扫描原理
反转法键盘扫描原理
标题:反转法键盘扫描原理
引言概述:
反转法键盘扫描原理是一种常用的键盘输入检测方法,通过利用键盘矩阵的特性,实现对按键的扫描和识别。
本文将从五个大点来详细阐述反转法键盘扫描原理,包括键盘矩阵的构成、按键扫描的流程、按键状态的判断、消除按键冲突的方法以及常见的应用场景。
正文内容:
1. 键盘矩阵的构成
1.1 键盘矩阵的基本概念
1.2 键盘矩阵的物理结构
1.3 键盘矩阵的电气结构
2. 按键扫描的流程
2.1 初始化键盘矩阵
2.2 逐行扫描键盘矩阵
2.3 判断按键状态
2.4 输出按键值
3. 按键状态的判断
3.1 按键按下的检测
3.2 按键释放的检测
3.3 按键状态的保存与更新
4. 消除按键冲突的方法
4.1 基于时间分片的消除方法
4.2 基于硬件编码的消除方法
4.3 基于软件算法的消除方法
5. 常见的应用场景
5.1 电脑键盘
5.2 手机触摸屏键盘
5.3 数字键盘
5.4 游戏手柄
总结:
通过本文的阐述,我们了解了反转法键盘扫描原理的基本概念和工作原理。
键盘矩阵的构成、按键扫描的流程、按键状态的判断、消除按键冲突的方法以及常见的应用场景都被详细介绍。
反转法键盘扫描原理在各种输入设备中得到广泛应用,为我们提供了高效、准确的输入方式。
在今后的技术发展中,我们可以进一步优化反转法键盘扫描原理,提升输入设备的性能和用户体验。
4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理是一种常用的键盘扫描方法,也称为矩阵键盘扫描。
它可以将多个按键连接在一起并使用较少的引脚来检测按键的状态。
4x4矩阵键盘由4行和4列组成,共有16个按键。
通常使用单片机或电路来进行扫描,以下是简要的原理:
1. 行扫描:首先,将行引脚设置为输出,同时将列引脚设置为输入,并将其上拉或下拉。
所有行引脚中只有一个为低电平,其余为高电平。
然后逐行检测按键状态。
2. 列检测:对于每一行,将对应的行引脚置为低电平后,检测列引脚的电平状态。
如果有按键按下,则相应的列引脚会变为低电平。
通过读取列引脚的状态,可以确定按键的位置。
3. 组合键:由于只能一次检测一行,因此当同时按下多个按键时,可能会导致误检。
为了解决这个问题,可以在检测到按键按下时,延迟一段时间,并再次检测按键的状态。
如果在第二次检测时仍然检测到按键按下,则确认按键有效。
4. 反向扫描:为了检测按键的释放状态,可以将行引脚设置为输入,列引脚设置为输出,并将其置为低电平。
然后逐列检测行引脚的电平状态,如果有按键释放,则相应的行引脚会变为高电平。
通过不断地循环扫描所有的行和列,可以实时检测按键的状态,并根据需要进行相应的处理。
堪称一绝的键盘扫描方法
堪称一绝的键盘扫描方法
键盘扫描是计算机视觉系统中经常使用的一种技术,它的作用是检测
用户输入的键盘输入,从而实现用户与计算机的交互。
目前,键盘扫描技
术有许多种形式,它们的特点是方式不同,用于输入控制信息的类型也不同。
其中最为出色的键盘扫描方法之一就是时序扫描。
时序扫描是一种用以检测用户输入的键盘扫描方法,它具有以下特点:
1、可以识别出按下的每个按钮:通过识别连接在芯片上的每一排的
按钮,可以检测到按下的每一个按钮,并能够识别出其它按键的状态;
2、具有低成本:时序扫描不需要复杂而昂贵的硬件,也不需要任何
软件,只要在芯片上使用一些简单的电路就可以实现;
3、可用于多行键盘:时序扫描可以非常方便地支持多行键盘,而且
用户还可以使用灯光状态监视器来指示按键状态。
4、具有高可靠性:在使用时序扫描技术进行键盘扫描时,用户可以
忽略硬件布线和失效的可能性,这是其他技术无法实现的;
5、可以使用多种程序进行实现:时序扫描可以使用不同的芯片、不
同的程序,以及不同的键盘应用来实现控制;
6、可以在低压下工作:时序扫描可以在低电压和低功耗的情况下工作,具有非常好的电气性能。
4×4键盘扫描程序开启原理及实例(精心整理)
单片机4*4键盘扫描程序时如何开启的?按照行顺序,一行一行的开启,如下图:4*4共16键,假设P0.0-P0.3为H0-H3,P0.4-P0.7为L0-L3(列) L0 L1 L2 L3(行) H0 0 1 2 3H1 4 5 6 7H2 8 9 A BH3 C D E F首先让H0 = 0,然后依次检测L0-L3,看那个键按下了,则对应的L0-L3为0,这样第一行检测结束。
比如扫描H0行时第一个键按下了,则L0=0,获得的P0=0xee,你也可以返回一个值,比如就是0,来代表第一个键(0)被按下,这样依次检测就扫描满16个键就行了。
4*4键盘扫描程序#include <reg52.h>//包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=dofly[1];break;//1case 0x7b:P0=dofly[2];break;//2case 0x77:P0=dofly[3];break;//3case 0xbe:P0=dofly[4];break;//4case 0xbd:P0=dofly[5];break;//5case 0xbb:P0=dofly[6];break;//6case 0xb7:P0=dofly[7];break;//7case 0xde:P0=dofly[8];break;//8case 0xdd:P0=dofly[9];break;//9case 0xdb:P0=dofly[10];break;//acase 0xd7:P0=dofly[11];break;//bcase 0xee:P0=dofly[12];break;//ccase 0xed:P0=dofly[13];break;//dcase 0xeb:P0=dofly[14];break;//ecase 0xe7:P0=dofly[15];break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖if(cord_h!=0x0f){cord_h=P3&0x0f; //读入列线值P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}void delay(uint i)//延时函数{while(i--);}以下为详细解释:假设按下的是S1键进行如下检测(4*4键盘)先在P3口输出p3 00001111低四位行会有变化cord_h =00001111&00001110 =00001110if !=00001111延时0.1uscord_h=00001110&00001111=00001110if !=00001111P3再输出11111110P3 =00001110|11110000=11111110输出高四位cord_l=P3&0xf0 //此时P3口就是输入值01111110 而不是上面的11111110cord_l=01111110&11110000=01110000cord_h+cord_l=00001110+01110000=01111110=0x7e //此编码即为S1的编码#include <reg52.h>//包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0x7e:P0=table[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=table[1];break;//1case 0x7b:P0=table[2];break;//2case 0x77:P0=table[3];break;//3case 0xbe:P0=table[4];break;//4case 0xbd:P0=table[5];break;//5case 0xbb:P0=table[6];break;//6case 0xb7:P0=table[7];break;//7case 0xde:P0=table[8];break;//8case 0xdd:P0=table[9];break;//9case 0xdb:P0=table[10];break;//acase 0xd7:P0=table[11];break;//bcase 0xee:P0=table[12];break;//ccase 0xed:P0=table[13];break;//dcase 0xeb:P0=table[14];break;//ecase 0xe7:P0=table[15];break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f){P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}void delay(uint i)//延时函数{while(i--);}在P3口做的键盘你的去抖检测没有做好通过电平输入来引发中断,必须是由P3.2或P3.3引脚输入,这样才能触发中断。
按键控制键盘检测原理与应用
按键控制键盘检测原理与应用首先,键盘由许多按键组成,每个按键都与一个电路连接,通常以矩阵的形式排列。
键盘的每一列都对应一个行线和一个列线,而键盘的每一行则是由按键连接的。
当用户按下一个按键时,行线和列线之间会产生一个短路,形成一个通路,从而使得电流可以流动。
这里有两种常用的按键检测原理:矩阵检测原理和扫描检测原理。
矩阵检测原理是最常见的按键检测方法。
它将键盘上的按键排列成一个矩阵,通过检测行线和列线的电流变化来确定用户按下的是哪个按键。
在矩阵检测原理中,每按下一个按键,会在对应的行和列之间形成一个电流回路。
检测电路会周期性地扫描每一行和每一列,检测是否有电流流动,从而确定用户是否按下了一些按键。
扫描检测原理是另一种常用的按键检测方法。
它通过周期性地扫描每一个按键,并检测是否有按键被按下。
在扫描检测原理中,检测电路会依次给每个按键的行线上加上电压,并检测列线上的电压变化情况。
如果有电压变化,则表示有按键被按下。
按键控制键盘检测有广泛的应用。
最常见的应用是在计算机键盘和电视遥控器中。
在计算机键盘中,通过检测按键的信号来输入字符和执行命令。
而在电视遥控器中,通过检测按键的信号来控制电视的开关、频道和音量等功能。
此外,按键控制键盘检测还可以应用于人机交互设备,如触摸屏和游戏手柄等。
在触摸屏上,通过检测用户触摸的位置来实现相应的操作,从而实现与设备的交互。
在游戏手柄上,通过检测按键的信号来触发游戏中的不同操作,如跳跃、射击和切换武器等。
总之,按键控制键盘检测是通过检测按键的信号来实现相应操作的一种技术。
它的原理是基于键盘的物理结构和工作原理,通过分析按键行和列的输入信号来确定用户按下的是哪个按键,并将其转换为对应的字符或功能。
它有广泛的应用领域,包括计算机键盘、电视遥控器、触摸屏和游戏手柄等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本资源为网上搜集而来,如果该程序涉及或侵害到您的版权请立即写信通知我键盘扫描键盘是由按键构成,是单片机系统里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人-机通信。
1.按键及键抖动按键是一种常开型按钮开关。
平时,按键的两个触点处于断开状态,按下按键时两个触点才闭合(短路)。
如图1-1所示,平常状态下,当按键K未被按下时,按键断开,PA0输入口的电平为高电平;当按键K被按下时,按键闭合,PA0输入口的电平为低电平。
图1-1 按键电路图1-2 按键抖动一般的按键所用开关都是机械弹性开关,由于机械触点的弹性作用,按键开关在闭合时不会马上稳定地连接,在断开进也不会马上完全的断开,在闭合和断开的瞬间均有一连串的抖动。
按键按下的电压信号波形图如图1-2所示,从图中可以看出按键按下和松开的时候都存在着抖动。
抖动时间的长短因按键的机械特性不同而有所不同,一般为5ms~10ms。
如果不处理键抖动,则有可能引起一次按键被误读成多次,所以为了确保能够正确地读到按键,必须去除键抖动,确保在按键的稳定闭合和稳定断开的时候来判断按键状态,判断后再做处理。
按键在去抖动,可用硬件或软件两种方法消除。
由于使用硬件方法消除键抖动,一般会给系统的成本带来提高,所以通常情况下都是使用软件方法去除键抖动。
常用的去除键抖动的软件方法有很多种,但是都离不开基本的原则:就是要么避开抖动的时候检测按键或是在抖动的时候检测到的按键不做处理。
这里说明一下常用的两种方法:第一种方法是检测到按键闭合电平后先执行一个延时程序,做一个12ms~24ms的延时,让前抖动消失后再一次检测按键的状态,如果仍是闭合状态的电平,则认为真的有按键按下;若不是闭合状态电平,则认为没有键按下。
若是要判断按键松开的话,也是要在检测到按键释放电平之后再给出12ms~24ms的延时,等后抖动消失后再一次检测按键的状态,如果仍为断开状态电平,则确认按键松开。
这种方法的优点是程序比较简单,缺点是由于延时一般采用跑空指令延时,造成程序执行效率低。
第二种方法是每隔一个时间周期检测一次按键,比如每5ms扫描一次按键,要连续几次都扫描到同一按键才确认这个按键被按下。
一般确认按键的扫描次数由实际情况决定,扫描次数的累积时间一般为50ms~60ms。
比如,以5ms为基本时间单位去扫描按键的话,前后要连续扫描到同一个按键11次而达到50ms 来确认这个按键。
按键松开的检测方法也是一样要连续多次检测到按键状态为断开电平才能确认按键松开。
这种方法的优点是程序执行效率高,不用刻意加延时指令,而且这种方法的判断按键抗干扰能力要更好;缺点是程序结构较复杂。
在以下的介绍中,我们将使用第二种方法来去除键抖动。
2.键盘结构及工作原理键盘一般有独立式和行列式(矩阵式)两种。
当然还有其它的结构,比如交互式结构等等,不过其它的结构比较少用,在这里就不介绍了。
在中颖的单片机中,有些单片机的LCD驱动引脚的SEGMENT口可以共享按键扫描口,当选择为按键扫描口时,可以使用这些口来扫描按键,所以在外部电路可以连接LCD和按键矩阵,采用分时扫描进行处理,下面也将介绍这个特殊应用的方法和注意的地方。
独立式键盘结构独立式键盘是指各个按键相互独立地连接到各自的单片机的I/O口,I/O 口只需要做输入口就能读到所有的按键。
独立式键盘可以使用上拉电阻也可以使用下拉电阻,基本原理是一样的。
使用上拉电阻的独立式键盘结构如图1-3所示。
图1-3 独立式键盘结构图1-3所示的是利用PB口和PC口共8个I/O口独自连接8个按键,使用外部上拉电阻构成的独立式键盘。
在中颖的单片机中,有很多型号的单片机有I/O内部上拉电阻或内部下拉电阻,所以在实际应用,若是使用到这样的单片机,是不需要接外部上拉电阻或下拉电阻了,只需在程序中把内部上拉电阻或内部下拉电阻打开即可。
从图1-3可以看出,当按键没有被按下的时候,连接到该按键的I/O口输入电平为高电平,当按键按下去之后,输入电平则变为低电平。
所以要判别有无按键按下,只需判断输入口的电平即可,程序写起来十分方便。
这种键盘虽然有电路简单、程序容易写的优点,但是也有缺点:当按键个数较多的时候,要占用较多的I/O口资源。
所以当按键个数比较多的时候,比较少用这样的按键结构,而是使用下面我们要讲的行列式结构。
行列式键盘结构为了减少键盘占用太多的单片机I/O口资源,当按键个数较多的时候,通常都使用行列式键盘。
行列式键盘同样可以使用上拉电阻或是下拉电阻,使用上拉电阻的行列式键盘结构如图1-4所示。
图1-4 行列式键盘结构跟独立式键盘一样,若是使用有内部上拉电阻或是下拉电阻的单片机时,外面不需连接上拉电阻或是下拉电阻,只需在程序内打开内部上拉电阻或是内部下拉电阻即可。
行列式键盘的原理就是每一行线与每一列线的交叉地方不相通,而是接上一个按键,通过按键来接通。
所以利用这种结构,a个I/O口可以接a个行线,另外的b个I/O可以接b个列线,总共可以组成a×b个按键的键盘。
如图1-11所示,共有4个行线,4个列线,可以组成4×4=16个按键的键盘。
可以看出,行列式的键盘结构可以省出不少的I/O口资源。
对行列式的键盘进行扫描的时候,要先判断整个键盘是否有按键按下,有按键按下才对哪一个按键按下进行判别扫描。
对按键的识别扫描通常有两种方法:一种是比较常用的逐行(或逐列)扫描法,另一种是线反转法。
现以图1-4的4×4键盘为例,讲解一下这两种扫描方法的工作原理。
a)逐行(或逐列)扫描法的工作原理首先要先判别整个键盘中是否有按键按下,由单片机连接到列线的PC 口输出低电平,然后读取连接到行线的PB口的电平状态。
若是没有按键按下,则PB口读进来的数据为0FH;若读进来的数据不是0FH,那就是有按键按下,因为只要有按键按下,该按键连接到的行线电平就会被拉至低电平。
若是有判断到按键按下之后就要进行对按键的识别扫描。
扫描的方法是将列线逐列置低电平,幷检测行线的电平状态来实现的。
依次向PC口的每个列线送低电平,然后检测所有行线PC口的状态,若是全为1,则所按下的按键不在此列,进入下一列的扫描;若是不全为1,则所按下的按键必在此列,幷且按键正是此列与读取到为低电平的行线的交点上。
b)线反转法线反转法的优点是扫描速度比较快,但是程序处理起来却是比较不方便。
线反转法最好是将行、列线按二进制顺序排列。
线反转法同样也要先判别整个键盘有无按键按下,有按键按下才对键盘进行扫描。
当有某一按键按下时,键盘扫描扫到给该列置低电平时,读到了行状态为非全1,这个时候就可以将行数据和列数据组合成一个键值。
如图4的键盘从左到右、从上到下的键值依次是EE,ED,EB,E7;DE,DD,DB,D7;…;7E,7D,7B,77。
这是负逻辑的排列,可以通过软件的取反指令把这些数据变成正逻辑:11,12,14,18;21,22,24,28;…;81,82,84,88。
不过不管是正逻辑还是负逻辑的数据,可以看出这样的数据是很难使用散转指令的。
所以一般都要想办法把这样的键值数据再修正一下成为等距能用于散转指令的键值数据。
若是所使用的单片机内部具有上拉电阻的话,还不需要逐列去置低电平,外部无上拉电阻。
先使用PB口作为输入口,打开PB口上拉电阻,而PC口作为输出口输出低电平,读PB口得到列数据;再使用PC口作为输入口,打开PC口上拉电阻,而PB口作为输出口输出低电平,读PC口得到行数据。
这样就可直接得到行数据和列数据,而得组合的键值。
线反转法一般用于4的倍数的键盘,比如4×4键盘、4×8键盘、8×8键盘。
共享LCD SEGMENT输出口的键盘结构中颖的一些单片机通过共享LCD SEGMENT输出口作为键盘扫描的输出控制口来节省IO口资源,例如SH6613/SH6614,SH6790/SH6791等等。
当采用共享LCD SEGMENT驱动输出口键盘结构时,键盘扫描的输出控制口与SEGMENT口共享。
在这种键盘结构中,为了减小在按键按下时电流对LCD 的影响,需要在扫描输入口接一个约1M的上拉电阻;同时为了防止同一行两个按键按下时,两个SEGMENT口之间不会出现大电流,需要在每一个SEGMENT扫描输出口接一个几十KΩ的电阻或二极管。
如图1-5所示:图1-5 共享LCD SEGMENT输出口的键盘矩阵结构对于共享LCD SEGMENT口的键盘结构,扫描原理跟行列式键盘矩阵基本是一样的,只是在扫描的时候要将共享在键盘的SEGMENT口切换为按键扫描输出口,输出扫描电平再通过I/O口来读取状态,读取状态后将SEGMENT 口切换回LCD显示就可以了,需要注意的是:2.1这种结构中上拉电阻较大,因此当扫描输出口输出低电平后,需等待一段时间,待放电完毕后再读输入口状态,一般约几十us。
2.2为了减少键盘扫描对LCD显示的影响,必须让SEGMENT切换为按键扫描输出口的时间尽可能的短。
一般为当SEGMENT切换为按键扫描输出口后读到扫描输入口电平状态,将电平状态备份至临时寄存器后马上将扫描输出口切换回SEGMENT输出状态,然后再对备份的电平状态寄存器进行判断。
2.3由于带有LCD SEGMENT驱动口可以共享按键扫描口的这些单片机都是有低频时钟源和高频时钟源,当系统时间选择为低频时钟时,指令周期时间比较长,共享口在作为按键扫描输出口时执行尽可能少的指令显得尤为重要。
3.行列式键盘扫描模块原理及应用程序使用SH69P25做4×4键盘的键盘扫描程序,分别用逐行(或逐列)扫描法和线反转法进行按键扫描。
电路原理图使用SH69P25为控制芯片,利用PB口和PC口来扫描一个4×4=16个按键的行列式键盘的电路原理图如图1-6所示。
图1-6 行列式键盘扫描模块电路原理图电路中单片机SH69P25作用4MHz的晶振Y1作为主振荡器,使用PB口连接到行列式键盘的行线,使用PC口连接到行列式键盘的列线,由于SH69P25有内部上拉电阻和内部下拉电阻,所以外部不需再接上拉电阻了。
16个按键的键值从左到右、从上到下,分别为0,1,2,3,4,5,6,…,A,B,C,D,E,F。
程序根据上面的电路图,这里分别有逐行(或逐列)扫描法和线反转法的两个程序对这两种方法进行按键扫描作出描述。
例[3-1] 逐行(或逐列)扫描法LIST P=69P25ROMSIZE=4096;************************************************; 系统寄存器;************************************************IE EQU 00H ;中断使能标志IRQ EQU 01H ;中断请求标志TM0 EQU 02H ;Timer0模式寄存器TL0 EQU 04H ;Timer0装入/记数寄存器低四位TH0 EQU 05H ;Timer0装入/记数寄存器高四位PORTB EQU 09H ;PORTB数据寄存器PORTC EQU 0AH ;PORTC数据寄存器TBR EQU 0EH ;查表寄存器INX EQU 0FH ;间接寻址伪索引寄存器DPL EQU 10H ;INX数据指针低四位DPM EQU 11H ;INX数据指针中三位DPH EQU 12H ;INX数据指针高三位SETTING EQU 15H ;位1: PBC中断设置为上升沿/下降沿;位2: 设置I/O口上拉电阻/下拉电阻;位3: I/O口上拉电阻/下拉电阻使能控制PBOUT EQU 17H ;PORTB输入/输出控制寄存器PCOUT EQU 18H ;PORTC输入/输出控制寄存器;************************************************; 用户定义寄存器(Bank0);************************************************AC_BAK EQU 20H ;AC值备份寄存器TMP EQU 21H ;临时寄存器TMP_T0 EQU 22H ;用在Timer0中断服务程序的临时寄存器PB_BAK EQU 23H ;PortB数据备份寄存器PC_BAK EQU 24H ;PortC数据备份寄存器F_TIMER EQU 25H ;位0=1, 5ms到FLAG1 EQU 26H;位0=1, 按键未松开标志;位1=1, 有按键按下标志KCODE_OLD EQU 27H ;上次扫描到的键码(用于按键扫描) KCODE_NEW EQU 28H ;本次扫描到的键码(用于按键扫描) KEYCODE EQU 29H ;按下的按键键码T5MS_CT1 EQU 2AH ;5ms定时计数器(14H)T5MS_CT2 EQU 2BHKEYS_CT EQU 2CH ;按键扫描次数;************************************************; 程序;************************************************ORG 0000HJMP RESETRTNIJMP TIMER0_ISPRTNIRTNI;*******************************************; 子程序: TIMER0中断服务程序;*******************************************TIMER0_ISP:STA AC_BAK,00H ;备份AC值ANDIM IRQ,1011B ;清TIMER0中断请求标志 J5MS:SBIM T5MS_CT1,01HLDI TMP_T0,00HSBCM T5MS_CT2,00HOR T5MS_CT1,00HBNZ TIMER0_ISP_END ;没到5ms, 跳转LDI F_TIMER,0001B ;设置“5ms到”标志LDI T5MS_CT2,01H ;重置5ms计数器LDI T5MS_CT1,04HTIMER0_ISP_END:LDI IE,0100B ;打开TIMER0中断LDA AC_BAK,00H ;取出AC值RTNI ;返回;*******************************************; 上电程序;*******************************************RESET:NOP;--------------------------------------;清用户寄存器POWER_RESET:LDI DPL,00HLDI DPM,02HLDI DPH,00HPOWER_RESET_1:LDI INX,00HADIM DPL,01HLDI TMP,00HADCM DPM,00HBA3 POWER_RESET_2JMP POWER_RESET_3POWER_RESET_2:ADIM DPH,01HPOWER_RESET_3:SBI DPH,01HBNZ POWER_RESET_1SBI DPM,04HBNZ POWER_RESET_1;--------------------------------------;初始化系统寄存器SYSTEM_INITIAL:;TIMER0初始化LDI TM0,07H ;设置TIMER0预分频为/1LDI TL0,06HLDI TH0,00H ;设置中断时间为250usLDI T5MS_CT2,01HLDI T5MS_CT1,04H ;计数器=14H=20, 计到5ms;初始化I/O口LDI SETTING,1100B ;设置上拉电阻使能;--------------------------------------MAIN_PRE:LDI IRQ,00HLDI IE,0100B ;打开Timer0中断;************************************************MAIN:ADI F_TIMER,0001BBA0 HALTMODE ;未到5ms, 跳转ANDIM F_TIMER,1110B ;清"5ms到"标志;**************************************; 模块: 逐行(逐列)扫描法按键扫描; 输入变量: FLAG1; 使用变量: PB_BAK, PC_BAK, PORTB, PORTC, PBOUT, PCOUT, TMP; KCODE_OLD, KCODE_NEW, KEYS_CT; 输出变量: FLAG1;**************************************KEYSCAN:LDI PC_BAK,0FHSTA PORTC,00H ;打开PORTC电阻LDI PB_BAK,00HSTA PORTB,00HLDI PBOUT,0FH ;PORTB输出低电平NOP ;等待稳定NOPNOPLDA PORTC,00H ;读PC口STA TMP,00H ;暂存于临时寄存器SBI TMP,0FH ;若是没有按键按下, 则读入的数据全为1BAZ NO_KEY ;没有按键按下, 跳转LDI KCODE_NEW,00H ;先将本次扫描的键值清零LDI PB_BAK,1111B ;PB口输出高电平, 准备从PB0开始逐行扫描, 直到PB3 KS_LINE:LDA PB_BAK,00HADDM PB_BAK,00HSTA PORTB,00H ;左移, 扫描到下一行NOP ;等待稳定NOPNOPLDA PORTC,00H ;读PC口STA TMP,00H ;暂存于临时寄存器SBI TMP,0FH ;若是按键不在此行,则读入的数据全为1BNZ KS_ROW ;按键在此行, 准备寻找在哪一列;不在此行LDA PB_BAK,00HBAZ NO_KEY ;四行已都扫描完毕, 仍未发现按键, 认为没有按键, 跳转ADIM KCODE_NEW,04H ;键值加4JMP KS_LINE ;准备扫描下一行KS_ROW:EORIM TMP,0FH ;由于是读进来的PC口数据是负逻辑的,取反变成正逻辑KS_ROW_1:LDA TMP,00HSHRSTA TMP,00H ;右移, 下一列(从PC0开始)BAZ KS_CHECK ;右移之后数据变为0, 则在此列, 已经得到键值ADIM KCODE_NEW,01H ;不在此列, 键值加1JMP KS_ROW_1 ;准备查找下一列KS_CHECK:LDI PBOUT,00H ;设置PORTB口为输入口LDA FLAG1,00HBA0 NO_KEY_1 ;之前的按键未松开, 不做处理, 跳转ADIM KEYS_CT,01H ;按键扫描次数加一SBI KEYS_CT,01HBAZ KEYSCAN_2 ;第一扫到该按键, 直接把新扫到的键值赋给旧的键值, 跳转LDA KCODE_OLD,00HSUB KCODE_NEW,00H ;比较本次扫的键值与上次扫的键值是否相等BAZ KEYSCAN_2 ;相等LDI KEYS_CT,01H ;不相等, 认为是新的, 将扫描次数设置为1 KEYSCAN_2:LDA KCODE_NEW,00HSTA KCODE_OLD,00H ;把新扫到的键值赋给旧的键值SBI KEYS_CT,0BH ;前后连续扫描同一按键11次, 中间间隔达到50msBNC KEYSCAN_END ;不到50ms, 跳走;到50msLDI KEYS_CT,00H ;将扫描次数清零ORIM FLAG1,0011B ;置"按键未松开”标志和"有按键按下”标志JMP KEYSCAN_ENDNO_KEY:ADI FLAG1,0001BBA0 NO_KEY_1 ;按键已松开, 不需再判断按键松开, 跳走ADIM KEYS_CT,01H ;扫描次数加一SBI KEYS_CT,0BH ;前后连续扫描到没有按键11次, 中间间隔达到50msBNC KEYSCAN_END ;不到50ms, 跳走ANDIM FLAG1,1110B ;清"按键未松开”标志NO_KEY_1:LDI KEYS_CT,00H ;扫描次数清零KEYSCAN_END:;**************************************KEY_PROC:ADI FLAG1,0010BBA1 HALTMODE ;没有按键按下, 跳转KEY_PROC_1:ANDIM FLAG1,1101B ;清"有按键按下”标志LDA KCODE_OLD,00HSTA KEYCODE,00H ;把扫描到的键值送给真正的键码;----------------------;这里可以对按键按下后的程序状态进行处理;----------------------KEY_PROC_END:;**************************************HALTMODE:NOPHALTNOPNOPJMP MAIN;************************************************END例[5-3-2]线反转法LIST P=69P25ROMSIZE=4096;************************************************; 系统寄存器;************************************************IE EQU 00H ;中断使能标志IRQ EQU 01H ;中断请求标志TM0 EQU 02H ;Timer0模式寄存器TL0 EQU 04H ;Timer0装入/记数寄存器低四位TH0 EQU 05H ;Timer0装入/记数寄存器高四位PORTB EQU 09H ;PORTB数据寄存器PORTC EQU 0AH ;PORTC数据寄存器TBR EQU 0EH ;查表寄存器INX EQU 0FH ;间接寻址伪索引寄存器DPL EQU 10H ;INX数据指针低四位DPM EQU 11H ;INX数据指针中三位DPH EQU 12H ;INX数据指针高三位SETTING EQU 15H ;位1: PBC中断设置为上升沿/下降沿;位2: 设置I/O口上拉电阻/下拉电阻;位3: I/O口上拉电阻/下拉电阻使能控制 PBOUT EQU 17H ;PORTB输入/输出控制寄存器PCOUT EQU 18H ;PORTC输入/输出控制寄存器;************************************************; 用户定义寄存器(Bank0);************************************************AC_BAK EQU 20H ;AC值备份寄存器TMP EQU 21H ;临时寄存器TMP_T0 EQU 22H ;用在Timer0中断服务程序的临时寄存器 ROWDATA EQU 23H ;列数据(用于按键扫描)LINEDATA EQU 24H ;行数据(用于按键扫描);--------------------------------------F_TIMER EQU 25H ;位0=1, 5ms到FLAG1 EQU 26H;位0=1, 按键未松开标志;位1=1, 有按键按下标志;--------------------------------------KCODE_OLD EQU 27H ;上次扫描到的键码(用于按键扫描) KCODE_NEW EQU 28H ;本次扫描到的键码(用于按键扫描) KEYCODE EQU 29H ;按下的按键键码;--------------------------------------T5MS_CT1 EQU 2AH ;5ms定时计数器(14H)T5MS_CT2 EQU 2BHKEYS_CT EQU 2CH ;按键扫描次数;************************************************; 程序;************************************************ORG 0000HJMP RESETRTNIJMP TIMER0_ISPRTNIRTNI;*******************************************; 子程序: TIMER0中断服务程序;*******************************************TIMER0_ISP:STA AC_BAK,00H ;备份AC值ANDIM IRQ,1011B ;清TIMER0中断请求标志 J5MS:SBIM T5MS_CT1,01HLDI TMP_T0,00HSBCM T5MS_CT2,00HOR T5MS_CT1,00HBNZ TIMER0_ISP_END;5ms到LDI F_TIMER,0001B ;设置“5ms到”标志LDI T5MS_CT2,01H ;重置5ms计数器LDI T5MS_CT1,04HTIMER0_ISP_END:LDI IE,0100B ;打开TIMER0中断LDA AC_BAK,00H ;取出AC值RTNI ;返回;*******************************************; 上电程序;*******************************************RESET:NOP;--------------------------------------;清用户寄存器POWER_RESET:LDI DPL,00HLDI DPM,02HLDI DPH,00HPOWER_RESET_1:LDI INX,00HADIM DPL,01HLDI TMP,00HADCM DPM,00HBA3 POWER_RESET_2JMP POWER_RESET_3POWER_RESET_2:ADIM DPH,01HPOWER_RESET_3:SBI DPH,01HBNZ POWER_RESET_1SBI DPM,04HBNZ POWER_RESET_1;--------------------------------------;初始化系统寄存器SYSTEM_INITIAL:;初始化TIMER0LDI TM0,07H ;设置TIMER0预分频为/1LDI TL0,06HLDI TH0,00H ;设置中断时间为250usLDI T5MS_CT2,01HLDI T5MS_CT1,04H ;计数器=14H=20, 计到5ms;初始化I/O口LDI SETTING,1100B ;设置上拉电阻使能;--------------------------------------MAIN_PRE:LDI IRQ,00HLDI IE,0100B ;打开Timer0中断;************************************************MAIN:ADI F_TIMER,0001BBA0 HALTMODE ;未到5ms, 跳转ANDIM F_TIMER,1110B ;清"5ms到”标志;**************************************; 模块: 线反转法按键扫描; 输入变量: FLAG1; 使用变量: PORTB, PORTC, PBOUT, PCOUT, ROWDATA, LINEDATA, TMP; KCODE_NEW, KCODE_OLD, KEYS_CT; 输出变量: FLAG1;**************************************KEYSCAN:LDI PORTC,0FH ;打开PORTC上拉电阻LDI PORTB,00HLDI PBOUT,0FH ;PORTB输出低电平NOP ;等待稳定NOPNOPLDA PORTC,00H ;读取PORTC口电平STA TMP,00H ;暂存于TMPSBI TMP,0FH ;若是没有按键按下, 则读入的数据全为1BAZ NO_KEY ;数据全为1, 没有按键按下, 跳转;有按键按下LDA TMP,00H ;刚才从PORTC口读到的数据就是列数据STA ROWDATA,00H ;保存列数据到ROWDATALDI PBOUT,00H ;设置PORTB为输入口LDI PORTB,0FH ;打开PORTB上拉电阻LDI PORTC,00HLDI PCOUT,0FH ;PORTC输出低电平NOP ;等待稳定NOPNOPLDA PORTB,00H ;读取PORTB口电平, 得到行数据STA LINEDATA,00H ;保存行数据到LINEDATALDI PCOUT,00H ;设置PORTC为输入口;本可以使用行数据和列数据组成键值, 但为方便使用, 修改键值为0~FGET_CODE:SBI LINEDATA,0EHBAZ GET_LINE1 ;第一行, 跳转SBI LINEDATA,0DHBAZ GET_LINE2 ;第二行, 跳转SBI LINEDATA,0BHBAZ GET_LINE3 ;第三行, 跳转SBI LINEDATA,07HBAZ GET_LINE4 ;第四行, 跳转JMP KEYSCAN_END ;多个按键按下, 无效不响应, 跳转 GET_LINE1:LDI KCODE_NEW,00H ;第一行首键值为0JMP GET_CODE_1GET_LINE2:LDI KCODE_NEW,04H ;第二行首键值为4JMP GET_CODE_1GET_LINE3:LDI KCODE_NEW,08H ;第三行首键值为8JMP GET_CODE_1GET_LINE4:LDI KCODE_NEW,0CH ;第四行首键值为CGET_CODE_1:SBI ROWDATA,0EHBAZ GET_ROW1 ;第一列, 跳转SBI ROWDATA,0DHBAZ GET_ROW2 ;第二列, 跳转SBI ROWDATA,0BHBAZ GET_ROW3 ;第三列, 跳转SBI ROWDATA,07HBAZ GET_ROW4 ;第四列, 跳转JMP KEYSCAN_END ;多个按键按下, 无效不响应, 跳转 GET_ROW1:ADIM KCODE_NEW,00H ;第一列, 直接为行首键值JMP KS_CHECKGET_ROW2:ADIM KCODE_NEW,01H ;第二列, 为行首键值加一JMP KS_CHECKGET_ROW3:ADIM KCODE_NEW,02H ;第三列, 为行首键值加二JMP KS_CHECKGET_ROW4:ADIM KCODE_NEW,03H ;第四列, 为行首键值加三KS_CHECK:LDA FLAG1,00HBA0 NO_KEY_1 ;之前的按键未松开, 不做处理, 跳转ADIM KEYS_CT,01H ;按键扫描次数加一SBI KEYS_CT,01HBAZ KEYSCAN_2 ;第一扫到该按键, 直接把新扫到的键值赋给旧的键值, 跳转LDA KCODE_OLD,00HSUB KCODE_NEW,00H ;比较本次扫的键值与上次扫的键值是否相等BAZ KEYSCAN_2 ;相等, 跳转LDI KEYS_CT,01H ;不相等, 认为是新的, 将扫描次数设置为1 KEYSCAN_2:LDA KCODE_NEW,00HSTA KCODE_OLD,00H ;把新扫到的键值赋给旧的键值SBI KEYS_CT,0BH ;前后连续扫描同一按键11次, 中间间隔达到50msBNC KEYSCAN_END ;不到50ms, 跳走;到50msLDI KEYS_CT,00H ;将扫描次数清零ORIM FLAG1,0011B ;置"按键未松开”标志和"有按键按下”标志JMP KEYSCAN_ENDNO_KEY:ADI FLAG1,0001BBA0 NO_KEY_1 ;按键已松开, 不需再判断按键松开, 跳走ADIM KEYS_CT,01H ;扫描次数加一SBI KEYS_CT,0BH ;前后连续扫描到没有按键11次, 中间间隔达到50msBNC KEYSCAN_END ;不到50ms, 跳走ANDIM FLAG1,1110B ;清"按键未松开”标志NO_KEY_1:LDI KEYS_CT,00H ;扫描次数清零KEYSCAN_END:;**************************************KEY_PROC:ADI FLAG1,0010BBA1 HALTMODE ;没有按键按下, 跳转KEY_PROC_1:ANDIM FLAG1,1101B ;清"有按键按下”标志LDA KCODE_OLD,00HSTA KEYCODE,00H ;把扫描到的键值送到键码;----------------------;这里可以对按键按下后的程序状态进行处理;----------------------KEY_PROC_END:;************************************** HALTMODE:NOPHALTNOPNOPJMP MAIN;************************************************ END。