当前位置:首页 >> 信息与通信 >>

矩阵键盘是单片机编程中所使用的键盘


矩阵键盘是单片机编程中所使用的键盘.0 b |; }7 [1 m9 M z 1.矩阵式键盘的结构与工作原理 0 c; J- @/ M" O) y" X/ |6 }7 k 在键盘中按键数量较多时,为了减少 I/O 口的占用,通常将按键排列成矩阵形式,如图 1 所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加 以连接。这样,一个端口(

如 P1 口)就可以构成 4*4=16 个按键,比之直接将端口线用于 键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成 20 键的键盘, 而直接用端口线则只能多出一键(9 键) 。由此可见,在需要的键数比较多时,采用矩阵法 来做键盘是合理的。+ D3 p1 l5 K0 _5 j 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电 阻接正电源, 并将行线所接的单片机的 I/O 口作为输出端, 而列线所接的 I/O 口则作为输入。 这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平, 一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下 了。具体的识别及编程方法如下所述。3 ?8 h4 S" s; W5 r 2、矩阵式键盘的按键识别方法 确定矩阵式键盘上何键被按下介绍一种“行扫描法”。 i$ I4 W, J! v& C 行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法, 如上图所示键盘,介绍过程如下。 1、判断键盘中有无键按下 将全部行线 Y0-Y3 置低电平,然后检测列线的状态。只要 有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与 4 根行线相 交叉的 4 个按键之中。若所有列线均为高电平,则键盘中无键按下。 2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其 方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某 根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电 平的行线交叉处的按键就是闭合的按键。 c9 n6 O. u6 S e ], t: ^ 下面给出一个具体的例子:6 L' G# ^: c$ t 图仍如上所示。 8031 单片机的 P1 口用作键盘 I/O 口, 键盘的列线接到 P1 口的低 4 位, 键盘的行线接到 P1 口的高 4 位。列线 P1.0-P1.3 分别接有 4 个上拉电阻到正电源+5V,并 把列线 P1.0-P1.3 设置为输入线,行线 P1.4-P.17 设置为输出线。4 根行线和 4 根列线形成 16 个相交点。 1、检测当前是否有键被按下。检测的方法是 P1.4-P1.7 输出全“0”,读取 P1.0-P1.3 的 状态,若 P1.0-P1.3 为全“1”,则无键闭合,否则有键闭合。 2、去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。 3、 若有键被按下, 应识别出是哪一个键闭合。 方法是对键盘的行线进行扫描。 P1.4-P1.7 按下述 4 种组合依次输出: P1.7 1 1 1 0 P1.6 1 1 0 1. L2 m5 ?4 g1 r P1.5 1 0 1 1 P1.4 0 1 1 1 在每组行输出时读取 P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有 键闭合。 由此得到闭合键的行值和列值, 然后可采用计算法或查表法将闭合键的行值和列值 转换成所定义的键值 2 O; w4 w0 C# }5 [) D 4、为了保证键每闭合一次 CPU 仅作一次处理,必须却除键释放时的抖动。3 u# \3 u! Y! D"
{5 m

键盘扫描程序:

从以上分析得到键盘扫描程序的流程图如图 2 所示。程序如下 SCAN: MOV P1,#0FH MOV A,P1 ANL A,#0FH! p* h [4 v& ^& k CJNE A,#0FH,NEXT1 SJMP NEXT3 NEXT1: ACALL D20MS$ K9 s* {) ?" n/ S$ f2 \ MOV A,#0EFH NEXT2: MOV R1,A MOV P1,A3 `, h8 q& }- P: ] C, _9 X2 C MOV A,P1& Z/ K- _) B8 e' q H7 K ANL A,#0FH CJNE A,#0FH,KCODE; MOV A,R1& {, J$ \) x$ t$ |0 m SETB C RLC A JC NEXT2 NEXT3: MOV R0,#00H RET KCODE: MOV B,#0FBH NEXT4: RRC A2 v6 E( W6 A& L' o& T INC B JC NEXT40 L8 d/ b C: y, U" {; ?8 G' g MOV A,R1 SWAP A8 F2 v% `" k" f ?5 L; |( Y" n NEXT5: RRC A INC B8 Q/ C1 x9 x5 e INC B* j6 I' b+ n/ I8 z INC B( r( ]0 N/ b# ~ INC B7 j& t7 T+ G9 a8 L, {& m JC NEXT5 NEXT6: MOV A,P18 `/ e0 u3 J9 O$ ?* c3 \# c% a! | ANL A,#0FH CJNE A,#0FH,NEXT6" ^ o: r9 k3 J; R MOV R0,#0FFH RET6 H2 f& N3 x+ Y$ D! R 键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往 占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本 身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻 辑上理清, 然后用适当的算法表示出来, 最后再去写代码, 这样, 才能快速有效地写好代码。 .
E- J7 k8 K" v, Q: u

键盘是由一组规则排列的按键组成, 一个按键实际上是一个开关元件, 也就是说键盘是 一组规则排列的开关。1 i" _/ D1 l/ z% \) N 键盘工作原理

1.按键的分类 7 V6 B8 E$ k& t: m* i 按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开 关等; 另一类是无触点开关按键,如电气式按键,磁感应按键等。前者造价低, 后者寿命长。 目前,微机系统中最常见的是触点式开关按键。 按键按照接口原理可分为编码键盘与非编码键盘两类, 这两类键盘的主要区别是识别键 符及给出相应键码的方法。 编码键盘主要是用硬件来实现对键的识别, 非编码键盘主要是由 软件来实现键盘的定义与识别。 全编码键盘能够由硬件逻辑自动提供与键对应的编码, 此外, 一般还具有去抖动和多键、 窜键保护电路,这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统 较少采用。非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。由于其经济实 用,较多地应用于单片机系统中。下面将重点介绍非编码键盘接口。 2.键输入原理 在单片机应用系统中, 除了复位按键有专门的复位电路及专一的复位功能外, 其它按键 都是以开关状态来设置控制功能或输入数据。 当所设置的功能键或数字键按下时, 计算机应 用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程。' [" s9 b8 f) @9
o5 ]

对于一组键或一个键盘, 总有一个接口电路与 CPU 相连。 CPU 可以采用查询或中断方 式了解有无将键输入并检查是哪一个键按下,将该键号送入累加器 ACC,然后通过跳转指 令转入执行该键的功能程序,执行完后再返回主程序。 3.按键结构与特点 微机键盘通常使用机械触点式按键开关, 其主要功能是把机械上的通断转换成为电气上 的逻辑关系。也就是说,它能提供标准的 TTL 逻辑电平,以便与通用数字系统的逻辑电平 相容。 机械式按键再按下或释放时, 由于机械弹性作用的影响, 通常伴随有一定时间的触点机 械抖动,然后其触点才稳定下来。其抖动过程如图 7.2 所示,抖动时间的长短与开关的机械 特性有关,一般为 5~10ms。7 b2 n0 J* s' U& J 在硬件上可采用在键输出端加 R-S 触发器(双稳态触发器)或单稳态触发器构成去抖动 电路,图 7.3 是一种由 R-S 触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会 对其产生任何影响。) }+ e& M& f `1 l: p4 V4 | 电路工作过程如下:按键未按下时,a = 0,b = 1,输出 Q = 1,按键按下时,因按键 的机械弹性作用的影响,使按键产生抖动,当开关没有稳定到达 b 端时,因与非门 2 输出 为 0 反馈到与非门 1 的输入端,封锁了与非门 1,双稳态电路的状态不会改变,输出保持为 1,输出 Q 不会产生抖动的波形。当开关稳定到达 b 端时,因 a = 1,b = 0,使 Q = 0,双 稳态电路状态发生翻转。当释放按键时,在开关未稳定到达 a 端时,因 Q = 0,封锁了与非 门 2,双稳态电路的状态不变,输出 Q 保持不变,消除了后沿的抖动波形。当开关稳定到 达 b 端时,因 a = 0,b = 0,使 Q = 1,双稳态电路状态发生翻转,输出 Q 重新返回原状态。 由此 右图 双稳态去抖电路 5 y9 X; @0 X4 Q3 c' y( H2 v3 v 可见,键盘输出经双稳态电路之后,输出已变为规范的矩形方波。' V1 @1 P. r( t# \. c _ 软件上采取的措施是:在检测到有按键按下时,执行一个 10ms 左右(具体时间应视所 使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持 闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步 骤进行确认,从而可消除抖动的影响。 4.按键编码 一组按键或键盘都要通过 I/O 口线查询按键的开关状态。根据键盘结构的不同,采用不

同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的 键值,以实现按键功能程序的跳转。 5.编制键盘程序/ K4 N4 Y; H; o) g 一个完善的键盘控制程序应具备以下功能: (1)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。
5 h8 [, B$ D8 G/ @; c

(2)有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不 产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3)准确输出按键值(或键号) ,以满足跳转指令要求。 独立式按键 ^+ F/ C7 [: C5 h6 B# x7 V- | 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1.独立式按键结构 9 u+ L K5 \* x) q% i 独立式按键是直接用 I/O 口线构成的单个按键电路, 其特点是每个按键单独占用一根 I/O 左图 独立式按键电路 口线,每个按键的工作不会影响其它 I/O 口线的状态。独立式按键的典型应用如图 7.4 所示。* X8 f' y+ Q, [7 F- l 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根 I/O 口线,因此, 在按键较多时,I/O 口线浪费较大,不宜采用。6 Z# m M* q, s2 Y# e/ z1 F6 p2 S 图 7.4 中按键输入均采用低电平有效,此外,上拉电阻保证了按键断开时,I/O 口线有 确定的高电平。当 I/O 口线内部有上拉电阻时,外电路可不接上拉电阻。 2.独立式按键的软件结构 1 _* b$ x T/ z5 M2 G# l: v& T 独立式按键软件常采用查询式结构。 先逐位查询每根 I/O 口线的输入状态, 如某一根 I/O 口线输入为低电平,则可确认该 I/O 口线所对应的按键已按下,然后,再转向该键的功能处 理程序。图 7.4 中的 I/O 口采用 P1 口,请读者自行编制相应的软件。1 ^! @- w7 o: r9 }6 s 7.1.3 矩阵式按键 单片机系统中,若使按键较多时,通常采用矩阵式(也称行列式)键盘。 1.矩阵式键盘的结构及原理 矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上,其结构如下图所示。# d.
n$ m( g5 G7 S

由图可知,一个 4×4 的行、列结构可以构成一个含有 16 个按键的键盘,显然,在按键 数量较多时,矩阵式键盘较之独立式按键键盘要节省很多 I/O 口。 矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V 上。 当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将 由与此行线相连的列线电平决定。 这是识别按键是否按下的关键。 然而, 矩阵键盘中的行线、 列线和多个键相连, 各按键按下与否均影响该键所在行线和列线的电平, 各按键间将相互影 响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。2 L% F$ r: ]'
x0 N

2.矩阵式键盘按键的识别 识别按键的方法很多,其中,最常见的方法是扫描法。下面以图 7.5 中 8 号键的识别为 例来说明扫描法识别按键的过程。 按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平,显然,如 果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须 使所有列线处在低电平,只有这样,当有键按下时,该键所在的行电平才会由高电平变为低 电平。CPU 根据行电平的变化,便能判定相应的行有键按下。8 号键按下时,第 2 行一定

为低电平,然而,第 2 行为低电平时,能否肯定是 8 号键按下呢?回答是否定的,因为 9、 10、11 号键按下同样使第 2 行为低电平。为进一步确定具体键,不能使所有列线在同一时 刻都处在低电平,可在某一时刻只让一条列线处于低电平,其余列线均处于高电平,另一时 刻, 让下一列处在低电平, 依此循环, 这种依次轮流每次选通一列的工作方式称为键盘扫描。 采用键盘扫描后,再来观察 8 号键按下时的工作过程,当第 0 列处于低电平时,第 2 行处 于低电平,而第 1、2、3 列处于低电平时,第 2 行却处在高电平,由此可判定按下的键应 是第 2 行与第 0 列的交叉点,即 8 号键。 3.键盘的编码 2 D, z& z, \: I. T1 s1 H2 W* H9 g 对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按 键的位置由行号和列号唯一确定, 因此可分别对行号和列号进行二进制编码, 然后将两值合 成一个字节,高 4 位是行号,低 4 位是列号。如图 7.5 中的 8 号键,它位于第 2 行,第 0 列,因此,其键盘编码应为 20H。采用上述编码对于不同行的键离散性较大,不利于散转 指令对按键进行处理。 因此, 可采用依次排列键号的方式对安排进行编码。 以图 7.5 中的 4×4 键盘为例,可将键号编码为:01H、02H、03H…0EH、0FH、10H 等 16 个键号。编码相互 转换可通过计算或查表的方法实现。" a1 c/ r1 R0 c+ ?7 d( w) g) n" F 4.键盘的工作方式. k3 d1 W/ p# }! N$ Z, N1 n 在单片机应用系统中, 键盘扫描只是 CPU 的工作内容之一。 CPU 对键盘的响应取决于 键盘的工作方式,键盘的工作方式应根据实际应用系统中 CPU 的工作状况而定,其选取的 原则是既要保证 CPU 能及时响应按键操作,又不要过多占用 CPU 的工作时间。通常,键 盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。 1)编程扫描方式& i$ U* H4 g4 P0 Y0 l% y 编程扫描方式是利用 CPU 完成其它工作的空余调用键盘扫描子程序来响应键盘输入的 要求。在执行键功能程序时,CPU 不再响应键输入要求,直到 CPU 重新扫描键盘为止。' c%
h$ H) }: {9 }

键盘扫描程序一般应包括以下内容: (1)判别有无键按下。/ B# g" c$ B* e: T: C0 B/ Y (2)键盘扫描取得闭合键的行、列值。 (3)用计算法或查表法得到键值。4 e0 j! h0 X9 `2 Y4 b; L (4)判断闭合键是否释放,如没释放则继续等待。. I7 s% {0 r* `' v4 j( Q0 u, { (5)将闭合键键号保存,同时转去执行该闭合键的功能。: ^' }+ \& v& D8 o1 l 图 7.6 8155 扩展 I/O 口组成的矩阵键盘# @4 \* v& T5 H: j' h+ Q$ ^ 图 7.6 是一个 4×8 矩阵键盘电路,由图可知,其与单片机的接口采用 8155 扩展 I/O 芯 片,键盘采用编程扫描方式工作,8155C 口的低 4 位输入行扫描信号,A 口输出 8 位列扫 描信号,二者均为低电平有效。8155 的 IO/ 与 P2.0 相连, 与 P2.1 相连, 、 分别与单 片机的 、 相连。由此可确定 8155 的口地址为:* m, P) Z0 j# M) Q- t9 g: L# F 命令/状态口:0100H(P2 未用口线规定为 0) A 口:0101H$ j: O! w) X9 y( x9 y/ Z5 K' G+ t B 口:0102H) c$ g8 G) } Q' N& b C 口:0103H 图 7.6 中,A 口为基本输出口,C 口为基本输入口,因此,方式命令控制字应设置为 43H。在编程扫描方式下,键盘扫描子程序应完成如下几个功能:2 x# `* u. ~9 A# {% m (1)判断有无键按下。其方法为:A 口输出全为 0,读 C 口状态,若 PC0~PC3 全为 1,则说明无键按下;若不全为 1,则说明有键按下。 (2) 消除按键抖动的影响。 其方法为: 在判断有键按下后, 用软件延时的方法延时 10ms

后,再判断键盘状态,如果仍为有键按下状态,则认为有一个按键按下,否则当作按键抖动 来处理。 (3)求按键位置。根据前述键盘扫描法,进行逐列置 0 扫描。图 7.6 中,32 个键的键 值分布如下(键值由 4 位 16 进制数码组成,前两位是列的值,即 A 口数据,后两位是行的 值,即 C 口数据,X 为任意值) : FEXE FDXE FBXE F7XE EFXE DFXE BFXE 7FXE FEXD FDXD FBXD F7XD EFXD DFXD BFXD 7FXD FEXB FDXB FBXB F7XB EFXB DFXB BFXB 7FXB9 `. g4 ]# p! J" ^/ q FEX7 FDX7 FBX7 F7X7 EFX7 DFX7 BFX7 7FX79 b$ g9 I# ^- y, g0 B 按键键值确定后,即可确定按键位置。相应的键号可根据下述公式进行计算:键号=行 首键号+列号。图 7.6 中,每行的行首可给以固定的编号 0(00H) ,8(08H) ,16(10H) , 24(18H) ,列号依列线顺序为 0~7。 (4)判别闭合的键是否释放。按键闭合一次只能进行一次功能操作,因此,等按键释 放后才能根据键号执行相应的功能键操作。 键盘扫描程序流程图请参阅实训 7 图 7.1 中的主程序流程图。 键盘扫描程序请参阅实训 7 源程序中的键盘查询程序、键盘扫描程序和按键查询子程 序三部分。* P, E' e) a- O; g* | 实训 7 是矩阵式键盘的一种典型应用,与图 7.6 相比,8155 入口地址不同,矩阵键盘 列数不同,再就是为兼顾键盘和显示,防抖所用的延时子程序由显示子程序替代。 2)定时扫描方式: 定时扫描方式就是每隔一段时间对键盘扫描一次, 它利用单片机内部的定时器产生一定 时间(例如 10ms)的定时,当定时时间到就产生定时器溢出中断,CPU 响应中断后对键 盘进行扫描,并在有键按下时识别出该键,再执行该键的功能程序。定时扫描方式的硬件电 路与编程扫描方式相同,程序流程图如下图所示。 图中,标志 1 和标志 2 是在单片机内部 RAM 的位寻址区设置的两个标志位,标志 1 为 去抖动标志位,标志 2 为识别完按键的标志位。初始化时将这两个标志位设置为 0,执行中 断服务程序时,首先判别有无键闭合,若无键闭合,将标志 1 和标志 2 置 0 后返回;若有 键闭合,先检查标志 1,当标志 1 为 0 时,说明还未进行去抖动处理,此时置位标志 1,并 中断返回。由于中断返回后要经过 10ms 后才会再次中断,相当于延时了 10ms,因此,程 序无须再延时。下次中断时,因标志 1 为 1,CPU 再检查标志 2,如标志 2 为 0 说明还未 进行按键的识别处理,这时,CPU 先置位标志 2,然后进行按键识别处理,再执行相应的 按键功能子程序,最后,中断返回。如标志 2 已经为 1,则说明此次按键已做过识别处理, 只是还未释放按键, 当按键释放后, 在下一次中断服务程序中, 标志 1 和标志 2 又重新置 0, 等待下一次按键。 3)中断扫描方式" B! m k+ u; A 采用上述两种键盘扫描方式时,无论是否按键,CPU 都要定时扫描键盘,而单片机应 用系统工作时,并非经常需要键盘输入,因此,CPU 经常处于空扫描状态,为提高 CPU 工 作效率,可采用中断扫描工作方式。其工作过程如下:当无键按下时,CPU 处理自己的工 作,当有键按下时,产生中断请求,CPU 转去执行键盘扫描子程序,并识别键号。 左图是一种简易键盘接口电路,该键盘是由 8051P1 口的高、低字节构成的 4×4 键盘。 键盘的列线与 P1 口的高 4 位相连,键盘的行线与 P1 口的低 4 位相连,因此,P1.4~P1.7 是键输出线,P1.0~P1.3 是扫描输入线。图中的 4 输入与门用于产生按键中断,其输入端与 各列线相连,再通过上拉电阻接至+5V 电源,输出端接至 8051 的外部中断输入端 。具体 工作如下:当键盘无键按下时,与门各输入端均为高电平,保持输出端为高电平;当有键按

下时,端为低电平,向 CPU 申请中断,若 CPU 开放外部中断,则会响应中断请求,转去 执行键盘扫描子程序。. W0 t! v+ z1 i. K4 Z. ^ 这是初学时写的最简单、最详细、效率最高的矩阵键盘扫描程序,只用了四条常用命令 (MOV/送数、JB/高电平转移、JMP/直接转移、RET/子程序返回) ,保证初学者一看就懂! 本程序已经在本站电子实验板上验证通过,占用CPU时间少,效率高,被选作单片机的测 试程序!. T9 o0 v5 w/ X7 G2 a 矩阵按键扫描程序是一种节省 IO 口的方法,按键数目越多节省 IO 口就越可观,本程序 的思路跟书上一样:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按 下。但是,在程序的写法上,站长采用了最简单的方法,使得程序效率最高。 本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需 要,又能节省大量的 CPU 时间。另外,本人认为键盘用延时程序来消除抖动,完全是浪费 时间。试想,如果不用中断执行(用中断执行需要更多的硬件资源)的方法来扫描键盘,每 秒钟扫描20-100次, 每次都要延时10-20MS的话, 我们的单片机还有多少时间 做正事呢?0 I! u3 N* Q8 z4 Z, j 其实,延时的这段时间,CPU 可以做其它的事呀。所以,本键盘扫描程序的前面后面 都可以加入少少代码,既可以达到完美的消抖动效果,又可以扩展其它的功能(例如按键封 锁、按键长按等按键功能复用! ) 本键盘扫描子程序名叫 key,每次要扫描时用 call key 调用即可。以下子程序内容: key:mov p0,#00001111b;上四位和下四位分别为行和列,所以送出高低电压检查有没有 按键按下 9 E) V; P' U& v+ n- j! p jmp k10;跳到 K10 处开始扫描,这里可以改成其它条件转移指令来决定本次扫描是否 要继续,例如减 1 为 0 转移或者位为 1 或 0 才转移,这主要用来增加功能,确认上一按键 功能是否完成?是否相当于经过了延时?是否要封锁键盘? goend:jmp kend;如果上面判断本次不执行键盘扫描程序,则立即转到程序尾部,不要 浪费 CPU 的时间 1 a: K0 @6 m! ?3 r( ? k10:jb p0.0,k20;扫描正式开始,先检查列 1 四个键是否有键按下,如果没有,则跳到 K20 检查列 2 k11:mov p0,#11101111b;列 1 有键按下时,P0.0 变低,到底是那一个键按下?现在分别输 出各行低电平 5 g$ P; s0 F# |1 t8 u jb p0.0,k12;该行的键不按下时,p0.0 为高电平,跳到到 K12,检查其它的行: x+ W% R0 z5 Q+
a# @6 J% R! v

mov r1,#1;如果正好是这行的键按下, 将寄存器 R0 写下 1, 表示 1 号键按下了% S8 S& g3
c; j! I

k12:mov p0,#11011111b/ g x1 t" P" G- V3 b jb p0.0,k13 mov r1,#2;如果正好是这行的键按下, 将寄存器 R0 写下 2, 表示 2 号键按下了/ g6 Y# g/ K;
R, k& c

k13:mov p0,#10111111b( d( b! }/ |! i) { jb p0.0,k14 mov r1,#3;如果正好是这行的键按下,将寄存器 R0 写下 3,表示 3 号键按下了) |# I- u/ g.
s- W7 A7 ?

k14:mov p0,#01111111b/ Y" [) S5 W5 v! G r9 O' n jb p0.0,kend;如果现在四个键都没有按下, 可能按键松开或干扰, 退出扫描 (以后相同) mov r1,#4 如果正好是这行的键按下,将寄存器 R0 写下 4,表示 4 号键按下了

jmp kend;已经找到按下的键,跳到结尾吧 k20:jb p0.1,k30;列 2 检查为高电平再检查列 3、42 F+ J8 V+ J& U$ Q% ` L; } k21:mov p0,#11101111b;列 2 有健按下时,P0.0 会变低,到底是那一行的键按下呢? 分别输出行的低电平 1 q9 O4 \: m5 a4 u# C7 v jb p0.1,k22;该行的键不按下时 p0.0 为高电平, 跳到到 K22, 检查另外三行 5 m% ^* n8 _. Z:
Z% d. R0 o6 s

mov r1,#5;如果正好是这行的键按下,将寄存器 R0 写下 5,表示 5 号键按下了(以后 相同,不再重复了)7 C: q0 q/ C7 `* | k22:mov p0,#11011111b jb p0.1,k23! F4 z0 m6 i3 @* ]! w# S( j& X mov r1,#62 S" @5 z4 j! i* |5 @ k23:mov p0,#10111111b( T3 T1 r# ?1 b. U, E1 o jb p0.1,k241 A9 P: X" V! d4 n0 F: } mov r1,#7 k24:mov p0,#01111111b. ]9 j$ K" J- W4 _- ` jb p0.1,kend1 i ]0 _$ c; `" L* ` mov r1,#8. g% g9 e1 b2 D. D1 D+ b jmp kend;已经找到按下的键,跳到结尾吧(以后相同,不要重复了)! `' c2 m5 k4 |; U k30:jb p0.2,k40 k31:mov p0,#11101111b jb p0.2,k32 mov r1,#9 k32:mov p0,#11011111b; U0 m2 z; n4 p; v* z jb p0.2,k33 mov r1,#10( l% D/ Q* q* X5 p' ~0 Z4 Z k33:mov p0,#10111111b jb p0.2,k34 mov r1,#11 k34:mov p0,#01111111b jb p0.2,kend mov r1,#125 y: p2 B$ K+ l. z( c jmp kend k40:jb p0.3,kend, O& \, S3 a: \ V i k41:mov p0,#11101111b* r% c1 a. J! h- k jb p0.3,k42 mov r1,#138 R& A0 A9 _0 `7 h1 @9 a k42:mov p0,#11011111b* i& R' P T- A- n jb p0.3,k43 mov r1,#14* _/ Q# j) @3 ~7 C3 L k43:mov p0,#10111111b jb p0.3,k44% @1 n: t! M8 ]! `* o3 Y mov r1,#152 c) @& h- H, G; ^2 J; R k44:mov p0,#01111111b, p% c/ s: B* d jb p0.3,kend

mov r1,#161 m6 e" ~/ h7 V* n$ H% Z- { kend: ret 键盘扫描结束了,寄存器 R1 的值就直接表示了是那个键按下的,根据不同的键值去执 行不同的程序,从而实现了十六个矩阵键盘扫描,同样原理,最多可以识别 255 个按键的 矩阵扫描。& P$ ]8 u' }% ^ ?3 \ 我们可以每次键盘扫描开始时检查 R0 的值是否为 0,只有在为 0 才扫描键盘,不为 0 就证明刚刚扫描过键值,相应的按键工作还没有完成。但是必须记得,每个按键命令执行完 成后,要给 R0 写上 0,表示可以扫描键盘。 本键盘扫描程序的优点在于:不用专门的按键延时程序,提高了 CPU 效率,也不用中 断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用 CPU 时最短,不 论有键按下或者无键按下都可以在很短的时间完成一次扫描。9 月 17 日
键盘驱动原理 9 月 17 日键盘是一组按键的组合,它是最常用的单片机输入设备,操

作人员可以通过键盘输入数据或命令,实现简单的人机对话。单片机使用的键盘 是一种常开型的开关,通常键的两个触点处于断开状态,按下键时它们才闭合。 键盘分编码和非编码键盘,键盘的识别可用软件识别也可用专用芯片识别。 MCS-51 单片机扩展键盘接口的方法用很多,从硬件结构上,可通过单片 机 I/0 接口扩展键盘,也可通过扩展 I/O 接口设计键盘,还有些用的是专用键盘 芯片。 键盘的工作原理: 1. 键盘的工作原理: 键盘从结构上分为独立式键盘与矩阵式键盘。 一般按键较少时采用独立式 键盘,按键较多时采用矩阵式键盘。 ( 1) 独立式键盘。 独立式键盘。 在由单片机组成的测控系统及智能化仪器中,用的最多的是独立式键盘。 这种键盘具有硬件与软件相对简单的特点,其缺点是按键数量较多时,要占用大 量口线。图 1 是一个利用 MCS-51 单片机的 P1 口设计的非编码键盘。

图1

独立式键盘

当按键没按下时,CPU 对应的 I/O 接口由于内部有上拉电阻,其输入为高 电平;当某键被按下后,对应的 I/O 接口变为低电平。只要在程序中判断 I/O 接口的状态,即可知道哪个键处于闭合状态。以下是非编码键盘键处理子程序。 JNB P1.0, KEY00 ;转按键 1 处理程序 JNB P1.1, KEY01 ;转按键 1 处理程序 JNB P1.2, KEY02 ;转按键 1 处理程序 JNB P1.3, KEY03 ;转按键 1 处理程序 JNB P1.4, KEY04 ;转按键 1 处理程序 JNB P1.5, KEY05 ;转按键 1 处理程序 JNB P1.6, KEY06 ;转按键 1 处理程序 JNB P1.7, KEY07 ;转按键 1 处理程序 RET ;无键按下,返回 KEY00: … RET KEY01: … RET … 矩阵式键盘。 (2) 矩阵式键盘。 矩阵式键盘使用于按键数量较多的场合,它由行线与列线组成,按键位于 行、 列的交叉点上。 一个 3*3 的行列结构可以构成一个有 9 个按键的键盘。 同理, 一个 4*4 的行列可以构成一个 16 按键的键盘。很明显,在按键数量较多的场合, 与独立式键盘相比,矩阵式键盘要节省很多 I/0 接口。

2.键盘按键识别方法 2.键盘按键识别方法 (1)扫描法。 扫描法。 下面以图 2 的 K2 键按下为例,说明此键是如何识别出来的。

图2

8031 与键盘连接

扫描法有行扫描和列扫描两种,无论采用哪种,无论采用哪种,其效果是 一样的,只是在程序中的处理方法有所区别。下面以列扫描法为例来介绍扫描法 识别按键的方法。首先在键处理程序中将 P1.4-P1.7 依次按位变低,P1.4-P1.7 在某一时刻只有一个为低。在某一位为低时读行线,根据行线的状态即可判断出 哪一个按键被按下。 2 号键按下, 如 当列线 P1.5 为低时, 读回的行线状态中 P1.0 被拉低,由此可知 K2 键被按下。一般在扫描法中分两步处理按键,首先是判断 有无键按下,如行线有一个为低,则有键按下。当判断有键按下时,使列线依次 变低,读行线,进而判断出具体哪个键被按下。 线反转法。 (2)线反转法。 扫描法是逐行或逐列扫描查询,当被按下的键处于最后一列时,要经过多 次扫描才能最后获得此按键所处的行列值。而线反转法则显的简练,无论被按的 键处于哪列,均可经过两步即能获得此按键所在的行列值,仍以图 4.38 为例来 介绍线反转法。 首先将行线 P1.0-P1.3 作为输入线,列线 P1.4-P1.7 作为输出线,并且输 出线输出全为低电平,读行线状态,则行线中电平为低的是按键所在的行。然后 将列线作为输入线,行线作为输出线,并将输出线输出为低电平,读列线状态, 则列线是电平为低的是按键所在的列。综合上述两步结果,确定按键所在的行和 列,从而识别出所按下的键。

假设 10 号键被按下,在第一步 P1.3-P1.0 全为低电平时,读 P1.4-P1.7 的值, P1.5 为低电平; 则 在第二步 P1.4-P1.7 输出全为低电平时, P1.3-P1.0 读 时,P1.2 为低电平。由此可判断第 3 行第 2 列有键被按下,此键就是 K10 键。 3. 键盘的接口电路 设计 MCS-51 单片机键盘时可根据单片机系统的实际情况来灵活处理。在使 用内部有程序存储器的单片机时,如单片机的 I/O 接口够用,可直接利用单片机 的 I/O 接口连接键盘。如果 I/O 接口不够用,可利用扩展 I/O 接口连接键盘,有 时也可使用专用的键盘接口芯片。 接口连接键盘。 ( 1) 利用单片机的 I/O 接口连接键盘。 利用 MCS-51 单片机的 I/O 接口连接键盘时分两种情况,一是当 P0、P1、 P2、P3 均为普通输入/输出时,可使用任意 I/0 接口连接键盘;二是当单片机系 统扩展程序存储器、数据存储器、I/O 时,由于 P0、P2 作为地址数据总线的使 用,所以扩展键盘时只能使用 P1 口、P3 口。如图 2 所示为利用 MCS-51 单片机 的 P1 口设计的 4*4 矩阵键盘。 注意如果用 P0 口设计键盘,要给 P0 口各口线提供上拉电阻,其大小一般为 2-10kn。 接口设计键盘。 ( 2) 利用扩展 I/O 接口设计键盘。 MCS-51 单片机在总线扩展凡是时由于 P0 口、P2 口分别作为数据总线及地 址总线,而 P1 口、P3 口又有其他用途时,扩展键盘可利用扩展的 I/O 接口。利 用 8255 的 PC 口设计的 4*4 矩阵键盘如图 3 所示, 利用 8255 的 PC 口设计的编码 键盘,PC0-PC3 为行输入,PC4-PC7 为列输出。

图3 ( 3)

8255 与键盘连接图

按键去抖。 按键去抖。 由于通常的按键所用的开关是机械开关,当开关闭合、断开时并不是马上 稳定地接通和断开,而是在闭合与断开瞬间均伴随有一连串的抖动。 为了确保 CPU 对键的一次闭合仅做一次处理, 必须要在程序或硬件上进行防抖处 理。为节省硬件,通常在单片机系统中,一般不采用硬件方法消除键的抖动,而 是用软件消抖方法。即检测键闭合后延时 5-10ms,让前延抖动消失后再一次检 测键的状态,如果仍保持闭合状态电平,则确认真正有键按下。当检测到按键释 放后,也要给 5-10ms 的延时,待后延抖动消失后才转入该键处理程序。以下是 具有消抖功能的键程序,只有按键按下再放开后才做一次键处理。 KEY_00: JB P1.0, KEY_01 ;无键按下,查下一个键 LCALL DELAY ;延时 10ms JNB P1.0, $ ;键一直按下,等待 LCALL DELAY ;键松开,延时 10ms JB P1.0, KEY_00 ;一次按键完成,转键盘处理程序 KEY_01: … RET 键盘的编码。 ( 4) 键盘的编码。 对于独立式按键键盘,由于按键数目较少,可根据实际情况灵活编码。对 于矩阵式键盘,按键的位置由行号和列号唯一确定,所以分别对行号与列号进行 二进制编码,然后将两值合成一个字节,高 4 位是行号,低 4 位是列号。如 10 号键被按下时,列号读回的值为 1011,行号读回的值为 1101,此两值合成为 11011011=0DBH,据此值可转到 10 号键处理程序。这种方式虽然简单,但其离散 性很大,在读程序时必须要结合硬件电路。也可将读回的键值按一定的方式运算 后,算出对应的键值进行散转,但这样会增加程序的工作量,因而大多数单片机 系统在键盘处理程序中只根据读回的键值进行散转。 常用的专用键盘芯片。 ( 5) 常用的专用键盘芯片。 无论是利用 CPU 的 I/O 接口扩展键盘,还是利用扩展 I/O 芯片扩展键盘, 由于均是用普通 I/O 接口扩展,如果要在单片机的程序中设计专用的键盘程序, 特别是矩阵式键盘,其程序相对复杂一些。因而在较复杂一些的单片机系统中可 选用专用的键盘芯片设计键盘。现常用的键盘扩展芯片有 Intel8279、CH451、 ICM7218、PCF8574 等。 ( 6) 单片机对键盘的控制方式。 单片机对键盘的控制方式。 在单片机应用系统设计中,为了节省硬件,无论是采用独立式键盘还是 采用矩阵式键盘,单片机对键盘的控制有以下 3 种方式。 i 程序控制扫描方式。 这种方式只有单片机空闲时,才可调用键盘扫描子程序,查询 键盘的输 入状态是否改变。 ii 定时扫描方式。

单片机对键盘的扫描也可采用定时扫描方式, 即单片机每隔一 定的时间对键盘扫描一次。在这种方式中,通常采用单片机内部的定时器,产生 10ms 的定时中断,CPU 响应定时中断请求后对键盘进行扫描,以查询键盘是否有 键按下。 iii 中断扫描方式。 虽然采用程序查询与定时对键盘的扫描方式时的程序编制简 单,但一个单片机系统在运行时的大多数时间里键盘基本是不工作的。为了进一 步提高 CPU 的工作效率,可采用中断方式。当键盘有键动作时产生中断,CPU 响 应键盘中断后,执行键盘中断程序,判别键盘按下键的键号,并做相应处理。
键盘驱动原理
0 概述,578



1、先读取键盘的状态,得到按键的特征编码。 先从 P1 口的高四位输出低电平,低四位输出高电平,从 P1 口的低四位读取键盘 状态。再从 P1 口的低四位输出低电平,高四位输出高电平,从 P1 口的高四位读 取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。使用上 述方法我们得到 16 个键的特征编码。 2、根据按键的特征编码,查表得到按键的顺序编码。 将 16 个键的特征编码按顺序排成一张表,然后用当前读得的特征编码来查表, 当表中有该特征编码时,它的位置就是对应的顺序编码。 3、特征编码与顺序编码的对应关系 KEYTABLE: DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 顺序码 DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9, DB 0BBH,0B7H,07EH,07DH,07BH ;A,B,C,D,E, DB 077H,0FFH ;F, 0FF 为结束码

我们将讨论 ps/2 键盘的驱动。主要讨论的内容有,ps/2 键盘的硬件,使用键盘驱动的应用层,键盘 驱动的初始化,键盘驱动如何完成自己的工作,以及一些涉及到的相关内容。需要注意的是,以后我们提 到的键盘,如果没有特殊说明,都是指 ps/2 键盘。 1 ps/2 键盘的硬件 要以写一个硬件的驱动为目的的话,需要对这个硬件有一定的了解,但并不需要太深入,只要对于写驱 动足够就可以了。关于 ps/2 键盘的硬件知识,我们也是对讨论键盘驱动足够就可以了,一些对于驱动没 有帮助的硬件实现的细节,我们不讨论。

1.1 ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片。一个是 intel 8042 芯片,位于主板上,CPU 通过 IO 端口直接和这个芯片通信,获得按键的扫描码或者发送各种键盘命令。另一个是 intel 8048 芯 片或者其兼容芯片,位于键盘中,这个芯片主要作用是从键盘的硬件中得到被按的键所产生的扫描码, 与 i8042 通信,控制键盘本身。 当键盘上有键被按下时,i8048 直接获得键盘硬件产生的扫描码。i8048 也负责键盘本身的控制,比 如点亮 LED 指示灯,熄灭 LED 指示灯。i8048 通过 ps/2 口和 i8042 通信,把得到的扫描码传送给 i8042。CPU 通过读写端口,可以直接把 i8042 中的数据读入到 CPU 的寄存器中,或者把 CPU 寄存 器中的数据写入 i8042 中。ps/2 口一共有 6 个引脚,可以拔下 ps/2 插头看一下,这 6 个引脚分别 为,时钟,数据,电源地,电源+5V,还有 2 个引脚没有被用到。由于只有一个引脚传输数据,所以 ps/2 口上的数据传输是串行的。

下面几幅图是一个键盘的内部,可以看到用来产生扫描码的按键矩阵( Key Martix ),可以看到键盘中 的芯片(这里不是 i8048,是一个兼容的其他型号的芯片)。

注意,i8042 并不一定在主板上单独出现,可能被整合在某一芯片中。

1.2 扫描码 ,Make Code ,Break Code ,Typematic 当键盘上有键被按下,松开,按住,键盘将产生扫描码( Scan Code ),这些扫描码将被 i8048 直 接得到。 扫描码有两种, Make Code 和 Break Code。 当一个键被按下或按住时产生的是 Make Code , 当一个键被松开产生的是 Break Code。每个键被分配了唯一的 Make Code 和 Break Code ,这样主 机通过扫描码就可以知道是哪一个键。简单的说就是按下键,产生一个 Make Code。松开键,产生一个 Break Code。

而对于按住不放的情况呢。我们可以打开一个记事本,把 $1$a$1$ 键按住不放,可以看到会不停的 产生 $1$a$1$ 直到我们松开。这是由于,当按住一个键不放时,将会 Typematic ,也就是自动打。每 隔一定时间,自动产生一个被按住的键的 Make Code,直到最后松开该键。对于 Typematic 有两个重 要的参数,一个是 Typematic Delay ,决定了按下多长时间之后,进入 Typematic,另一个是 Typematic Rate,决定了在进入 Typematic 之后,一秒钟内能产生多少个 Make Code 。现在我们再 打开记事本,按住 $1$a$1$ 不放,仔细观察,将看到第一个 $1$a$1$ 和第二个 $1$a$1$ 之间间隔 的时间明显比其他的要长,而之后每个$1$a$1$之间的时间间隔是一样的。

而对于同时按下多个键的情况呢。在一个键被按下,产生了 Make Code,而没有被松开,没有产 生 Break Code 的时候,再按下另一个键,于是产生了另一个键的 Make Code ,就算是这两个键被同 时按下。 之后, 这两个键松开时, 各自产生各自的 Break Code。 更多的键的情况也是一样。 比如要按 Ctrl 和 A,下面的情况就算作是同时按下了 Ctrl 和 A。按 Ctrl,产生 Ctrl 的 Make Code,然后按 A,产 生 A 的 Make Code,然后各自松开,各自产生各自的 Break Code。 而对于按一个键不放的时候,再按另一个键的情况呢。我们可以打开一个记事本,把$1$a$1$键按住 不放,不要松开,然后再按$1$s $1$键不放。我们可以看到当按下$1$s$1$时,$1$a$1$键并没有松, 但是并没有$1$a$1$再出现了,而是$1$s$1$开始出现,这时即使松开了$1$s$1$,$1$a$1$也不会继 续出现了。

1.3 扫描码集 到目前为止一共有三套扫描码集( Scan Code Set ),ps/2 键盘默认使用第二套。不过可以设置 i8042,让 i8042 把得到的 Scan Code 翻译成 Scan Code Set 1 中的 Scan Code ,这样键盘驱动 从 i8042 得到的所有 Scan Code 都是第一套中的 Scan Code(实际中驱动也是这么做的)。所以我 们只讨论 Scan Code Set 1 。需要说明的是 Scan Code 和 ASCII 码完全不相同。 在 Scan Code Set 1 中, 大多数键的 Make Code, Break Code 都是一个字节。 他们的 Make Code 的最高位都为 0,也就是他们的 Make Code 都小于 0x7F。而他们的 Break Code 为其 Make Code 或运算 80h ,也就是把 Make Code 的低 7 位不变,最高位设置为 1。 还有一些扩展按键,他们的 Scan Code 是双字节的。他们的第一个字节都是 E0h,表明这是一个扩 展键。第 2 个字节,和单字节 Scan Code 的情况相同。 还有一个特殊的键, Pause/Break 键, 它的 Make Code 为 E1,1D,45 E1,9D,C5, 注意是 E1h 开 头。而且它没有 Break Code 。 我们按键的 Make Code 的值的大小,列出 Scan Code Set 1 中的所有扫描码

0 概述

我们将讨论 ps/2 键盘的驱动。主要讨论的内容有,ps/2 键盘的硬件,使用键盘驱动的应用层,键盘 驱动的初始化,键盘驱动如何完成自己的工作,以及一些涉及到的相关内容。需要注意的是,以后我们提 到的键盘,如果没有特殊说明,都是指 ps/2 键盘。 1 ps/2 键盘的硬件 要以写一个硬件的驱动为目的的话,需要对这个硬件有一定的了解,但并不需要太深入,只要对于写驱 动足够就可以了。关于 ps/2 键盘的硬件知识,我们也是对讨论键盘驱动足够就可以了,一些对于驱动没 有帮助的硬件实现的细节,我们不讨论。

1.1 ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片。一个是 intel 8042 芯片,位于主板上,CPU 通过 IO 端口直接和这个芯片通信,获得按键的扫描码或者发送各种键盘命令。另一个是 intel 8048 芯 片或者其兼容芯片,位于键盘中,这个芯片主要作用是从键盘的硬件中得到被按的键所产生的扫描码, 与 i8042 通信,控制键盘本身。 当键盘上有键被按下时,i8048 直接获得键盘硬件产生的扫描码。i8048 也负责键盘本身的控制,比 如点亮 LED 指示灯,熄灭 LED 指示灯。i8048 通过 ps/2 口和 i8042 通信,把得到的扫描码传送给 i8042。CPU 通过读写端口,可以直接把 i8042 中的数据读入到 CPU 的寄存器中,或者把 CPU 寄存 器中的数据写入 i8042 中。ps/2 口一共有 6 个引脚,可以拔下 ps/2 插头看一下,这 6 个引脚分别 为,时钟,数据,电源地,电源+5V,还有 2 个引脚没有被用到。由于只有一个引脚传输数据,所以 ps/2 口上的数据传输是串行的。

下面几幅图是一个键盘的内部,可以看到用来产生扫描码的按键矩阵( Key Martix ),可以看到键盘中 的芯片(这里不是 i8048,是一个兼容的其他型号的芯片)。

注意,i8042 并不一定在主板上单独出现,可能被整合在某一芯片中。

1.2 扫描码 ,Make Code ,Break Code ,Typematic 当键盘上有键被按下,松开,按住,键盘将产生扫描码( Scan Code ),这些扫描码将被 i8048 直 接得到。 扫描码有两种, Make Code 和 Break Code。 当一个键被按下或按住时产生的是 Make Code , 当一个键被松开产生的是 Break Code。每个键被分配了唯一的 Make Code 和 Break Code ,这样主 机通过扫描码就可以知道是哪一个键。简单的说就是按下键,产生一个 Make Code。松开键,产生一个 Break Code。

而对于按住不放的情况呢。我们可以打开一个记事本,把 $1$a$1$ 键按住不放,可以看到会不停的 产生 $1$a$1$ 直到我们松开。这是由于,当按住一个键不放时,将会 Typematic ,也就是自动打。每 隔一定时间,自动产生一个被按住的键的 Make Code,直到最后松开该键。对于 Typematic 有两个重 要的参数,一个是 Typematic Delay ,决定了按下多长时间之后,进入 Typematic,另一个是 Typematic Rate,决定了在进入 Typematic 之后,一秒钟内能产生多少个 Make Code 。现在我们再 打开记事本,按住 $1$a$1$ 不放,仔细观察,将看到第一个 $1$a$1$ 和第二个 $1$a$1$ 之间间隔 的时间明显比其他的要长,而之后每个$1$a$1$之间的时间间隔是一样的。

而对于同时按下多个键的情况呢。在一个键被按下,产生了 Make Code,而没有被松开,没有产 生 Break Code 的时候,再按下另一个键,于是产生了另一个键的 Make Code ,就算是这两个键被同 时按下。 之后, 这两个键松开时, 各自产生各自的 Break Code。 更多的键的情况也是一样。 比如要按 Ctrl 和 A,下面的情况就算作是同时按下了 Ctrl 和 A。按 Ctrl,产生 Ctrl 的 Make Code,然后按 A,产 生 A 的 Make Code,然后各自松开,各自产生各自的 Break Code。 而对于按一个键不放的时候,再按另一个键的情况呢。我们可以打开一个记事本,把$1$a$1$键按住 不放,不要松开,然后再按$1$s $1$键不放。我们可以看到当按下$1$s$1$时,$1$a$1$键并没有松, 但是并没有$1$a$1$再出现了,而是$1$s$1$开始出现,这时即使松开了$1$s$1$,$1$a$1$也不会继 续出现了。

1.3 扫描码集 到目前为止一共有三套扫描码集( Scan Code Set ),ps/2 键盘默认使用第二套。不过可以设置 i8042,让 i8042 把得到的 Scan Code 翻译成 Scan Code Set 1 中的 Scan Code ,这样键盘驱动 从 i8042 得到的所有 Scan Code 都是第一套中的 Scan Code(实际中驱动也是这么做的)。所以我 们只讨论 Scan Code Set 1 。需要说明的是 Scan Code 和 ASCII 码完全不相同。 在 Scan Code Set 1 中, 大多数键的 Make Code, Break Code 都是一个字节。 他们的 Make Code 的最高位都为 0,也就是他们的 Make Code 都小于 0x7F。而他们的 Break Code 为其 Make Code 或运算 80h ,也就是把 Make Code 的低 7 位不变,最高位设置为 1。 还有一些扩展按键,他们的 Scan Code 是双字节的。他们的第一个字节都是 E0h,表明这是一个扩 展键。第 2 个字节,和单字节 Scan Code 的情况相同。 还有一个特殊的键, Pause/Break 键, 它的 Make Code 为 E1,1D,45 E1,9D,C5, 注意是 E1h 开 头。而且它没有 Break Code 。 我们按键的 Make Code 的值的大小,列出 Scan Code Set 1 中的所有扫描码


相关文章:
矩阵键盘是单片机编程中所使用的键盘
矩阵键盘是单片机编程中所使用的键盘.0 b |; }7 [1 m9 M z 1.矩阵式键盘的结构与工作原理 0 c; J- @/ M" O) y" X/ |6 }7 k 在键盘中按键...
试述51系列单片机矩阵键盘编程
试述51系列单片机矩阵键盘编程_电子/电路_工程科技_专业资料。试述 51 系列单片机矩阵键盘编程 摘要 在单片机系统中,常常使用键盘单片机输入信息。键盘由一组常开...
矩阵键盘介绍与使用程序
矩阵键盘介绍与使用程序_计算机软件及应用_IT/计算机_专业资料。矩阵键盘的工作...原理简介键盘接口电路是单片机系统设计非常重要的一环, 作为人机交互界面里最常用...
单片机控制的矩阵键盘
单片机控制的矩阵键盘_专业资料。12距阵键盘 矩阵键盘是单片机编程中所使用的键盘. 1.矩阵式键盘的结构与工作原理 在键盘中按键数量较多时, 为了减少 I/O 口的占...
51单片机矩阵键盘的C语言程序与分析
51 单片机矩阵键盘的 C 语言程序与分析 2009-10-17 19:25 学习 51 单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分 析电路,然后终于明白其中的...
矩阵键盘单片机C语言编程
矩阵键盘单片机C语言编程_电子/电路_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 矩阵键盘单片机C语言编程_电子/电路_工程科技_专业资料。#include<reg...
自己写的单片机矩阵键盘显示程序及仿真
Protues 电路连接图如下所示: PS: 矩阵键盘说明——4×4 矩阵 从左到右依次编码为 1, 4,5,6,7,8,9,10,11,12,13,14,15,16 ,3, 按下某一按键,Led...
单片机的矩阵键盘程序
单片机的矩阵键盘程序_信息与通信_工程科技_专业资料。如果你不会单片机的矩阵键盘这里阿赫利可以帮你解决 #include<reg52.h> #define uint unsigned int #define ...
51单片机矩阵扫描键盘程序实例
然后我们把这的 P3 值赋给 y,再用 x 或上 y,把他们的值 赋给 z 了...51单片机矩阵键盘输入液... 2页 免费 51单片机的键盘扫描程序 暂无评价 4页 ...
51单片机 矩阵键盘 C语言 程序
51单片机 矩阵键盘 C语言 程序_计算机硬件及网络_IT/计算机_专业资料。51单片机...***/ /* */ /*检查 LCD 忙状态 */ /*lcd_busy 为 1 时,忙,等待。...
更多相关标签:
单片机矩阵键盘 | 单片机矩阵键盘程序 | 单片机矩阵键盘原理 | 单片机4 4矩阵键盘 | 单片机4x4矩阵键盘 | 单片机矩阵键盘电路 | 单片机矩阵键盘电路图 | 单片机矩阵键盘扫描 |