搜档网
当前位置:搜档网 › 非编码键盘的扫描程序设计

非编码键盘的扫描程序设计

非编码键盘的扫描程序设计
非编码键盘的扫描程序设计

目录

1设计任务及要求 (1)

1.1初始条件 (1)

1.2要求完成的主要任务 (1)

2方案比较及认证 (1)

3键盘扫描原理 (3)

4系统硬件设计 (4)

4.1选用元器件 (4)

4.1.1 8031单片机 (4)

4.1.2 8155芯片 (7)

4.2 硬件电路 (10)

4.2.1矩阵式键盘电路 (10)

4.2.2时钟电路和复位电路 (11)

4.2.3非编码键盘的总电路 (12)

5系统软件设计 (13)

5.1软件思想 (13)

5.2 程序流程图 (14)

5.3源程序 (15)

6调试记录及结果分析 (18)

心得体会 (19)

参考文献 (20)

附录 (21)

附录1 8031单片机资料 (21)

附录2 8155芯片资料 (21)

附录3 程序清单 (22)

非编码键盘的扫描程序设计

1设计任务及要求

1.1初始条件

1.通过8155扩展I/O口组成6×6行列式键盘

2.利用8031微控制器

1.2要求完成的主要任务

1.技术指标:对键盘按键能够正确识别,去抖动

2.工作原理:键盘扫描

3.课程设计说明书应包括

(1)设计任务及要求

(2)方案比较及认证

(3)键盘扫描原理

(4)硬件原理,电路图,采用器件的功能说明

(5)软件思想,流程,源程序

(6)调试记录及结果分析

(7)参考资料

(8)附录:芯片资料,程序清单

(9)总结

2方案比较及认证

(1)键盘去抖动方案的选择

键盘采用机械弹性开关来反映一个电压信号的开、断。由于机械触点的弹性作用,在闭合和断开的瞬间会有抖动发生。抖动时间的长短由按键的机械特性决

定,一般在5~10ms之间。抖动会造成被查询的开关状态无法准确读到。例如开关刚刚断开,只是因为抖动误认为开关又发生第二次闭合,这显然是不允许的。为此必须采取一些去抖动的措施,以免误读。

去抖动措施有硬件和软件两种方法。硬件去抖动的办法,就是不把开关直接接到接口,而是如图2-1那样,加接一个RS触发器,只有开关脱离a而接到b 时,触发器才能翻转,才能输出一个稳定的电平。软件去抖动是在检测到有按键按下时,执行一个10~20ms的延时程序,避开抖动信号,然后再次检测该键是否确实闭合,如果再次检测时,查不到有键按下,说明并非有效按键信号,应放弃初测结果,以免误动作。

硬件去抖动方式一般用在对按键操作过程比较严格的场合。采用硬件去抖动电路将导致系统硬件电路设计复杂化,会增加设计成本。软件去抖动方式可以简单地通过编程实现,降低了设计成本。

通过以上分析,决定采用软件去抖动方式。

(2)扫描方式的选择

通常,键盘扫描方式有三种,及编程扫描、定时扫描和中断扫描。

编程扫描就是CPU对键盘的扫描采取程序控制方式,一旦进入键扫描状态,则反复的扫描键盘,等待用户从键盘上输入命令或数据。而在执行键入命令或处理键入数据过程中,CPU将不再响应键入要求,直到CPU返回重新扫描键盘为止。

定时扫描就是CPU每隔一定的时间(如10ms)对键盘扫描一遍。当发现有键按下时,便进行读入键盘操作,以求出键值,并分别经行处理。定时时间间隔由单片机内部定时器/计数器来完成,这样可以减少计算机扫描键盘的时间,以减少CPU的开销。具体做法是,当定时时间一到,定时器便自动输出一脉冲信号,使CPU转去执行扫描程序。但有一点需要指出,即采用定时扫描法时,必须在其初始化程序中,对定时器写入相应的命令,使之能定时产生中断,以完成定时扫描的任务。

中断扫描的工作过程如下:当无键按下时,CPU不对键盘进行扫描以节省出大量的时间对系统经行监控和数据处理,当有键按下时,产生中断请求,CPU 转去执行键盘扫描子程序,并识别键号。无论是编程扫描还是定时扫描,均占用

CPU大量的时间。无论有没有输入操作,CPU总要在一定的时间内进行扫描,这对于单片机控制系统是很不利的。中断扫描更进一步的节省了CPU的时间,由于本次课程设计只是设计一个行列式键盘,所以不用去考虑节省CPU的时间,而且编程扫描比定时扫描的控制程序简单,所以选用编程扫描方式。

图2-1 RS触发器去抖动电路

3键盘扫描原理

行列式键盘又称为矩阵式键盘,适用于按键数量较多的场合,它由行线和列线组成。按键位于行线和列线的交叉点上,行线、列线分别接到按键开关的两端。行线通过上拉电阻接到+5V上。平时无按键动作时,行线处于高电平状态,而当有按键按下时,行线电平状态由与此行线相连的列线电平决定。列线电平如果为低,则行线电平为低;列线电平如果为高,则行线电平亦为高。这一点是识别矩阵键盘按键是否被按下的关键所在。由于矩阵键盘中行线、列线为多键共用,各按键均影响该键所在的行和列的电平。因此各按键彼此将相互发生影响,所以必须将行线、列线信号配合起来并作适当的处理,才能确定闭合键的位置。

扫描法是非编码键盘常用的方法。

用扫描法来识别矩阵键盘按键分两步经行。

(1)识别有无按键被按下:让所有列线均置为零电平,检查各行线电平是否有变化。如果有变化,则说明有按键被按下;如果没有变化,则说明无键被按

下。

(2)识别具体按键的方法:首先逐列置零电平,其余各列置为高电平,然后检查各行线电平的变化,如果某行电平由高电平变为零电平,则可确定此行此列交叉点处的按键被按下。

4系统硬件设计

4.1选用元器件

4.1.1 8031单片机

8031单片机共有40条引脚,其中有2条专用于主电源的引脚,2条外接晶体的引脚,4条控制或与其它电源复用的引脚,32条输入/输出(I/O)引脚。其引脚图如图4-1所示。

图4-1 8031单片机引脚图

下面按其引脚功能分为四部分叙述这40条引脚的功能。

(1)主电源引脚VCC和VSS

VCC——(40脚)接+5V电压;

VSS——(20脚)接地。

(2)外接晶体引脚XTAL1和XTAL2

XTAL1(19脚)接外部晶体的一个引脚。在单片机内部,它是一个反相放大

器的输入端,这个放大器构成了片内振荡器。当采用外部振荡器时,对HMOS 单片机,此引脚应接地;对CHMOS单片机,此引脚作为驱动端。

XTAL2(18脚)接外晶体的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端。采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。

(3)控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP

①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF的电容,以保证可靠地复位。

VCC掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。当VCC主电源下掉到低于规定的电平,而VPD在其规定的电压范围(5±0.5V)内,VPD就向内部RAM提供备用电源。

②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。因此,它可用作对外输出的时钟,或用于定时目的。然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。

对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。

③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。PSEN同样可以驱动(吸收或输出)8个LS型的TTL输入。

④EA/VPP(引脚):当EA端保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对851/8751/80C51)或1FFFH(对8052)时,将自动转向执行外部程序存储器内的程序。当EA保持低电平时,则只访问外部程序存储器,不管是否有内部程序存储器。对于常用的8031来说,无内部

程序存储器,所以EA脚必须常接地,这样才能只选择外部程序存储器。

对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。

(4)输入/输出(I/O)引脚P0、P1、P2、P3(共32根)

①P0口(39脚至32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。

②P1口(1脚至8脚):是准双向8位I/O口。由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。P1口能驱动(吸收或输出电流)4个LS型的TTL负载。对8052、8032,P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2的外部控制端。对EPROM编程和程序验证时,它接收低8位地址。

③P2口(21脚至28脚):是准双向8位I/O口。在访问外部存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。在对EPROM编程和程序验证期间,它接收高8位地址。P2可以驱动(吸收或输出电流)4个LS型的TTL负载。

④P3口(10脚至17脚):是准双向8位I/O口,在MCS-51中,这8个引脚还用于专门功能,是复用双功能口。P3能驱动(吸收或输出电流)4个LS型的TTL 负载。

作为第一功能使用时,就作为普通I/O口用,功能和操作方法与P1口相同。

作为第二功能使用时,各引脚的定义如表4-1所示。P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。

表4-1 P3各口线的第二功能定义

4.1.2 8155芯片

8155芯片是为8086系列微机开发出的系列通用可编程I/O接口芯片。8155不仅可以提供三个并行的I/O端口,在其内部还集成有256个字节的RAM存储空间、一个14位的定时/计数器,因此非常适合与MCS-51单片机连接实现系统功能的扩展。

8155的引脚图如图4-2所示:

图4-2 8155引脚图

(1)8155各引脚功能说明如下:

RST:复位信号输入端,高电平有效。复位后,3个I/O口均为输入方式。

AD0~AD7:三态的地址/数据总线。与单片机的低8位地址/数据总线(P0口)相连。单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。

RD:读选通信号,控制对8155的读操作,低电平有效。

WR:写选通信号,控制对8155的写操作,低电平有效。

CE:片选信号线,低电平有效。

IO/M :8155的RAM存储器或I/O口选择线。当IO/M =0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/M =1时,选择 8155的I/O口,AD0~AD7上的地址为8155 I/O口的地址。

ALE:地址锁存信号。8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及,IO/ 的状态都锁存到8155内部锁存器。因此,P0口输出的低8位地址信号不需外接锁存器。

PA0~PA7:8位通用I/O口,其输入、输出的流向可由程序控制。

PB0~PB7:8位通用I/O口,功能同A口。

PC0~PC5:有两个作用,既可作为通用的I/O口,也可作为PA口和PB 口的控制信号线,这些可通过程序控制。

TIMER IN:定时/计数器脉冲输入端。

TIMER OUT:定时/计数器输出端。

VCC:+5V电源。

(2)8155的地址编码及工作方式

在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线提供, CE=0,选中该片。

当 CE=0,IO/M =0时,选中8155片内RAM,这时8155只能作片外RAM使用,其RAM的低8位编址为00H~FFH;当 CE=0,IO/M =1时,选中8155的I/O口,其端口地址的低8位由AD7~AD0确定,如表4-2所示。

IEB IEA: A、B口中断允许位:0 禁止中断;1 允许中断。

TM2 TM1:计数器工作方式:00 无操作;01 停止计数; 10 计满后停止;11开始计数。

在ALT1~ALT4的不同方式下,A口、B口及C口的各位工作方式如下:ALT1:A口,B口为基本输入/输出,C口为输入方式。

ALT2:A口,B口为基本输入/输出,C口为输出方式。

ALT3:A口为选通输入/输出,B口为基本输入/输出。PC0为AINTR,PC1为ABF,PC2为,PC3~PC5为输出。

ALT4:A口、B口为选通输入/输出。PC0为AINTR,PC1为ABF,PC2为,PC3为BINTR,PC4为BBF,PC5为。

8155内还有一个状态寄存器,用于锁存输入/输出口和定时/计数器的当前状态,供CPU查询用。状态寄存器的端口地址与命令寄存器相同,低8位也是00H,状态寄存器的内容只能读出不能写入。所以可以认为8155的I/O口地址00H是命令/状态寄存器,对其写入时作为命令寄存器;而对其读出时,则作为状态寄存器。

4.2 硬件电路

4.2.1矩阵式键盘电路

矩阵式键盘将按键设置在行列线的交叉点上,行列线分别连接到按键的两端。行线通过上拉电阻接至+5V电压,即行线的输出被钳位到高电平状态;判断有无按键按下时通过列线送出扫描信号,然后行线读取状态得到。其方法是依次给列线送低电平,检查行线的输入。若行线为高电平,则代表所在行无按键被按下,如果行线出现低电平,则低电平所在的行和出现低电平的列的交叉点处有按键按下。矩阵式键盘电路如图4-4所示。

图4-4 矩阵式键盘电路

4.2.2时钟电路和复位电路

时钟振荡器是单片机工作节奏的原始动力,单片机的所有工作时序都是靠时钟振荡信号来控制的,没有时钟振荡,单片机就无法工作。8031的内部时钟电路实际上仅是一个可以构成振荡器的电路。使用时还要外接元件才能变成振荡器。

外部连接的晶振电路如图4-5所示。

图4-5 晶振电路

复位的目的是对单片机的片内电路重新进行初始化,使有关部件都恢复到原先规定的初始工作状态。8031的外接复位电路如图4-6所示。

图4-6 复位电路

4.2.3非编码键盘的总电路

图4-7为总电路图。总电路是用8031单片机控制,通过8155扩展I/O口组

成的6×6行列式键盘电路。其中8031的P0口与8155的AD0~AD7相连,传递地址、数据、命令与状态信息。PA0~PA5作为列线输出,PC0~PC5作为行线输入。PC0~PC5通过上拉电阻接到+5V上,而当有按键按下时,行线电平状态由与此行线相连的列线电平决定。列线电平如果为低,则行线电平为低;列线电平如果为高,则行线电平亦为高。进行扫描时,先令PA0~PA5均输出0,确定有没有键被按下,若有键被按下,则令PA0~PA5逐个输出为0,其它输出为1,然后读入PC口的数据,看哪一行为零电平,则此行与此列的交叉处的键被按下。

图4-7 非编码键盘总电路图

5系统软件设计

5.1软件思想

编程的依据是键盘扫描的原理。在程序里,先将PA口置零输出,然后读取PC口的值,看PC口有没有为低电平的位,如果有,则表示有按键按下,接下来将PA0~PA5逐位置零,读取PC口的值,看哪一位为零,则改行与该列交点处的按键被按下,计算键值入栈保存。

本次选择使用编程扫描的方法,所以在一开始的时候就要通过初始化程序定义8155PA、PB、PC口的工作方式。

本次选用软件方法去抖动,所以要编写去抖动延时程序。

5.2 程序流程图

程序流程图如图5-1所示。

图5-1 键盘扫描流程图

5.3源程序

ORG 0000H

AJMP MAIN

ORG 0100H

MAIN: NOP

;8155控制字

KD1:MOV DPTR ,#7F00H ;PA,PB口为输出,PC口为输入MOV A,#03H

MOVX @DPTR,A

LCALL KEY1 ;调用扫描子程序

KEY1:ACALL KS1 ;有无键按下子程序 JNZ LK1 ;有键按下,转去抖延时程序 AJMP KEY1 ;无键按下,继续扫描

LK1:ACALL DELA12 ;12ms延时程序调用 ACALL KS1 ;判断键是否真正按下

JNZ LK2 ;有键按下,转逐列扫描

AJMP KEY1 ;无键按下,继续扫描

LK2:MOV R2,#0FEH ;R2=11111110B

MOV R4,#00H ;R4存放键值

LK4:MOV DPTR,#7F01H ;使PA0=0

MOV A,R2

MOVX @DPTR,A

INC DPTR ;指向PC口

INC DPTR

MOVX A,@DPTR ;读入行状态

JB ACC.0,LONE ;第0行无键按下,转LONE

MOV A,#00H ;有键按下,设置行首键号

AJMP LKP ;转求键号

LONE:JB ACC.1,LTWO ;第1行无键按下,转LTWO MOV A,#06H ;有键按下,设置行首键号

AJMP LKP ;转求键号

LTWO:JB ACC.2,LTHR ;第2行无键按下,转LTHR MOV A,#0CH ;有键按下,设置行首键?

AJMP LKP ;转求键号

LTHR:JB ACC.3,LFOR ;第3行无键按下,查下一列 MOV A,#012H ;有键按下,设置行首键LFOR:JB ACC.4,LFIV

MOV A,#18H

LFIV:JB ACC.5,NEXT

MOV A,#1EH

LKP: ADD ACC,R4 ;求键号,键号=行首键号+列号 PUSH ACC ;保护键号

LK3: ACALL KS1 ;等待键释放

JNZ LK3 ;键未释放,继续等待

POP ACC ;键释放,键号送A

AJMP OVER ;键扫描结束

NEXT:INC R4 ;列号加1,指向下一列 MOV A,R2 ;判断8列扫描完否

JNB ACC.7,KND ;8列扫描完,继续

RL A ;扫描字左移一位

MOV R2,A ;送扫描字

AJMP LK4 ;转下一列扫描

LTHR:JB ACC.3,NEXT ;第3行无键按下,查下一列 MOV A,#18H ;有键按下,设置行首键

LKP: ADD A,R4 ;求键号,键号=行首键号+列号

PUSH ACC ;保护键号

LK3:ACALL KS1 ;等待键释放JNZ LK3 ;键未释放,继续等待

POP ACC ; 键释放,键号送A

AJMP OVER ;键扫描结束

NEXT:INC R4 ;列号加1,指向下一列 MOV A,R2

JNB ACC.7,KND ; 8列扫描完,继续

RL A ;字左移一位

MOV R2,A ;送扫描字

AJMP LK4 ;下一列扫描

KND:AJMP KEY1

OVER:RET ;扫描结束

KS1:MOV DPTR,#7F01H ;向PA口

MOV A,#00H ;扫描字

MOVX @DPTR,A ;描字送PA口

INC DPTR ;向PC口

INC DPTR

MOVX A,@DPTR ;入PC口状态

CPL ;高电平表示有键按下

ANL A,#0FH ;蔽高4位

RET

;晶振为6MHz时的12ms延时子程序

DELL:MOV R7,#12

DEL:MOV R6,#250

NN:DJNZ R6,NN

DJNZ R7,DEL

RET

END

6调试记录及结果分析

程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。

在调试过程中,会发现程序中的错误,例如分号不是在英文输入状态下输入的,为使程序正常运行,要对这些错误进行改正。

编写的程序能够完成按键识别和去抖动的功能。

非编码键盘的扫描程序设计

摘要 ------------------------------------------------------------------------------------------------------- 1 1设计方案 ------------------------------------------------------------------------------------------------ 2 1.1设计任务 ---------------------------------------------------------------------------------------- 2 1.2设计方案 ---------------------------------------------------------------------------------------- 2 2系统硬件设计------------------------------------------------------------------------------------------ 3 2.1最小应用系统 ------------------------------------------------------------------------------------ 3 2.28155扩展电路---------------------------------------------------------------------------------- 4 2.3矩阵键盘接口电路 ---------------------------------------------------------------------------- 6 2.4LCD1602接口电路----------------------------------------------------------------------------- 6 2.5主电路设计 --------------------------------------------------------------------------------------- 8 3系统软件设计------------------------------------------------------------------------------------------ 8 3.1主程序设计 --------------------------------------------------------------------------------------- 9 3.2延时程序设计----------------------------------------------------------------------------------- 9 3.3键盘扫描子程序设计 ------------------------------------------------------------------------ 10 3.4显示子程序设计------------------------------------------------------------------------------- 11 4 系统调试与结果 ---------------------------------------------------------------------------------- 13 4.1调试内容与问题解决----------------------------------------------------------------------- 13 4.2运行结果与分析 ----------------------------------------------------------------------------- 13 小结 ------------------------------------------------------------------------------------------------------- 15 参考文献 ------------------------------------------------------------------------------------------------ 16 附录 ------------------------------------------------------------------------------------------------------- 17

密码键盘

摘要:介绍PC键盘和键盘接口的PS/2通信协议,以及用89C51实现可锁定键盘的软件和硬件设计方法。具有安全可靠、容错能力强、可以直接采用标准键盘进行改装、便于实现等优点,并保留标准键盘的全部功能。 关键词:PS/2 89C51 C51 键盘 引言 在智能仪器、自动控制等领域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。为适应开放式、模块化的要求,嵌入式PC具有标准的PC接口,如VGA显示器控制接口、以太网接口、RS232接口、PC/AT键盘接口等。所以,可以用标准的PC键盘对嵌入式PC进行操作与控制。键盘在输入指令之后,可能很长一段时间不用。为计算机安全和防止误触发,需要将键盘锁定,还要对某些键采取屏蔽措施,但是PC标准键盘不能满足这些要求。本文介绍一种用89C51设计实现的可锁定加密PC/AT键盘。 1 键盘功能及工作原理 PC键盘功能主要有按键识别、去抖、重键处理、发送扫描码、自动重发、接收键盘命令、处理命令等。键盘有编码键盘和非编码键盘。编码键盘程序设计简单,但硬件电路复杂,价格较高;非编码键盘用软件来实现识别键、编码转换、去抖等功能,硬件电路简单,价格便宜。现代微机系统中广泛采用非编码键盘。PC键盘多采用18行×8列的二维矩阵行列结构。采用行扫描法识别按下的按键。 2 PS/2协议 PS/2协议是外设与主机之间通信的一种同步双向串行协议。在该协议中主机拥有较高的优先级,在一定条件下可以终止外设正在进行的发送过程。PS/2协议采用的传送数据帧

的格式为:1位起始位(0)、8位数据位、1位奇偶校验位、1位停止位(1)。数据发送时低位在前,高位在后。外设每收到主机发来的1帧数据,都要紧随该帧的停止位发送一个握手位ACK(0)应答主机。然后,外设还要发1帧应答数据(0xF0),表示外设已经完整地接收到了主机的命令;而主机则不需发送握手位,也不需要发送应答帧。 2.1 键盘到PC键盘接口的通信 当时钟线和数据线均为高电平时,允许键盘发送数据,系统将接收数据;当时钟线被拉为低电平时,表明系统禁止数据传输。图1给出了发送时序,包含1个低电平触发的起始位、8位数据位、1个奇校验位和1个高电平的结束位。 2.2 PC系统到键盘的通信协议 若时钟线出现高电平,数据线出现低电平,表明系统请求发送,键盘准备产生同步时钟脉冲串,并接收数据。包含了1个低电平触发的起始位、8位数据位、1个奇校验位、1个应答位、1个高电平的结束位。图2为时序图。 (1)键盘命令及执行过程 ①FFH:复位键盘。系统通过此软件复位命令使键盘进入程序复位和内部自测试,称为基本保证测试(BAT)。复位键盘的过程如下: a. 键盘收到FFH后立即回送ACK(FAH)作答; b. 键盘接口收到ACK后,将键盘时钟和数据线置为高电平; c. 键盘检测到此状态后开始BAT操作; d. 如果BAT正确完成,键盘发送AAH以表示结束,

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

键盘扫描码

键盘上的每一个键都有两个唯一的数值进行标志。为什么要用两个数值而不是一个数值呢?这是因为一个键可以被按下,也可以被释放。当一个键按下时,它们产生一个唯一的数值,当一个键被释放时,它也会产生一个唯一的数值,我们把这些数值都保存在一张表里面,到时候通过查表就可以知道是哪一个键被敲击,并且可以知道是它是被按下还是被释放了。这些数值在系统中被称为键盘扫描码 2扫描码大全 扫描码键 0x011b ESC 0x3b00 F1 0x3c00 F2 0x3d00 F3 0x3e00 F4 0x3f00 F5 0x4000 F6 0x4100 F7 0x4200 F8 0x4300 F9 0x4400 F10 主键盘区: 0x2960 ~ 0x0231 1 0x0332 2 0x0433 3 0x0534 4 0x0635 5 0x0736 6 0x0837 7 0x0938 8 0x0a39 9 0x0b30 0 0x0c2d - 0x0d3d = 0x2b5c \ 0x0e08 退格键 0x0f09 Tab 0x1071 q 0x1177 w 0x1265 e 0x1372 r 0x1474 t 0x1579 y

0x1769 i 0x186f o 0x1970 p 0x1a5b [ 0x1b5d ] 0x1e61 a 0x1f73 s 0x2064 d 0x2166 f 0x2267 g 0x2368 h 0x246a j 0x256b k 0x266c l 0x273b ; 0x2827 ' 0x1c0d 回车 0x2c7a z 0x2d78 x 0x2e63 c 0x2f76 v 0x3062 b 0x316e n 0x326d m 0x332c , 0x342e . 0x352f / 0x3920 空格键 0xe05b 左Win 0xe05c 右Win 0xe05d Menu 右边数字键盘: 0x5200 Insert 0x4700 Home 0x4900 Page UP 0x5300 Delete 0x4f00 End 0x5100 PageDown 0x4800 上箭头 0x4b00 左箭头 0x5000 下箭头 0x4d00 右箭头 0x352f /

按键扫描方法

说到键盘扫描,相信大多数人第一反应就是行列矩阵扫描,这样我们可以用相对有限的IO口得到尽可能多的按键。键盘扫描是单片机技术的一种基本处理方法,学校的单片机课程都会有相应章节进行阐述,只要按照课本上讲述的方法,一般都能设计出比较可靠的键盘扫描电路与程序。 课本上的键盘扫描方法(见下图接法二)不能说是尽善尽美,从易懂性、成本、程序难易程度等方面综合看应该是不错的方法,给人感觉是已经没有太多的改善空间,至少我是这么认为的。 然而前段时间一位台湾朋友画给我的键盘扫描矩阵电路(见下图接法二),让我又一次看到到自己的思维还有许多地方被自己的所谓“经验”束缚着。 单纯的从硬件接法看,两种接法并没有明显区别,接法一甚至要复杂一些,但如果结合到键盘扫描的程序来看,就会发现接法一确实更好。 两种接法我都没有把上拉电阻包含进来,来让我们看一下两种接法到底有什么不同: 接法二: 我们熟悉的传统扫键处理电路,假定键盘行列IO口标号分别为H1/H2/H3和V1/V2/V3,扫键流程通常如下。 2.1. H1设置为输出,H2/H3和V1/V2/V3设置为输入 2.2. H1分别输出1和0,读V1/V2/V3状态,如果Vy状态与H1一致,则认为H1与Vy交叉位置的键按下 2.3. H2设置为输出,H1/H3和V1/V2/V3设置为输入 2.4. H2分别输出1和0,读V1/V2/V3状态,如果Vy状态与H2一致,则认为H2与Vy交叉位置的键按下 2.5. H3设置为输出,H1/H2和V1/V2/V3设置为输入 2.6. H3分别输出1和0,读V1/V2/V3状态,如果Vy状态与H3一致,则认为H3与Vy交叉位置的键按下

键盘按键的各种编码对照表(全)

键盘按键的各种编码对照表 本附录中的各表列举了键盘按键扫描码和其ASCII码之间的对照关系,表中数据都是十六进制形式。 在用中断16H的0号功能时,当按下任意一个键或组合键时,寄存器AH和AL分别保存着该按键的扫描码和ASCII码。 表1、ASCII码的编码方案 高位 000001010011100101110111低位 0000NUL DEL SP0@P`p 0001SOH DC1!1A Q a q 0010STX DC2“2B R b r 0011ETX DC3#3C S c s 0100EOT DC4$4D T d t 0101ENQ NAK%5E U e u 0110ACK SYN&6F V f v 0111BEL ETB‘7G W g w 1000BS CAN(8H X h x 1001HT EM)9I Y i y 1010LF SUB*:J Z j z 1011VT ESC+;K[k{ 1100FF FSN^n~ 1111SI US/?O_o Del 表2、字母和空格按键的编码表 单 键SHIFT CTRL ALT 按 键 扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码 a and A1E611E411E011E00 b and B3062304230023000 c an d C2E632E432E032E00 d and D2064204420042000 e and E1265124512051200 f and F2166214621062100 g and G2267224722072200 h and H2368234823082300 i and I1769174917091700

经典的verilog键盘扫描程序

经典的verilog键盘扫描程序 作者:ilove314 拿到威百仕( VibesIC )的板子后就迫不及待的开始我的学习计划,从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中要表现出每一个寄存器,甚至每一个走线。想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽! 废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过) //当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED熄灭,按键控制LED亮灭

module key_debounce( clk,rst_n,s1_n,s2_n,s3_n,s4_n,s5_n,led_d1,led_d2,led_d3,led_d 4,led_d5); input clk; //主时钟信号,10MHz input rst_n; //复位信号,低有效 input s1_n,s2_n,s3_n,s4_n,s5_n; output led_d1,led_d2,led_d3,led_d4,led_d5; reg[4:0] s_rst; always @(posedge clk or negedge rst_n) if (!rst_n) s_rst <= 5'b11111; else s_rst <= {s5_n,s4_n,s3_n,s2_n,s1_n}; reg[4:0] s_rst_r; always @ ( posedge clk or negedge rst_n ) if (!rst_n) s_rst_r <= 5'b11111; else s_rst_r <= s_rst; wire[4:0] s_an = s_rst_r & ( ~s_rst); reg[19:0] cnt; //计数寄存器 always @ (posedge clk or negedge rst_n) if (!rst_n) cnt <= 20'd0; //异步复位 else if(s_an) cnt <=20'd0; else cnt <= cnt + 1'b1; reg[4:0] low_s; always @(posedge clk or negedge rst_n) if (!rst_n) low_s <= 5'b11111; else if (cnt == 20'h30D40) low_s <= {s5_n,s4_n,s3_n,s2_n,s1_n}; reg [4:0] low_s_r; always @ ( posedge clk or negedge rst_n ) if (!rst_n) low_s_r <= 5'b11111; else low_s_r <= low_s; wire[4:0] led_ctrl = low_s_r[4:0] & ( ~low_s[4:0]); reg d1,d2,d3,d4,d5; always @ (posedge clk or negedge rst_n) if (!rst_n) begin d1 <= 1'b0; d2 <= 1'b0; d3 <= 1'b0; d4 <= 1'b0; d5 <= 1'b0; end else begin // if ( led_ctrl[0] ) d1 <= ~d1; if ( led_ctrl[1] ) d2 <= ~d2; if ( led_ctrl[2] ) d3 <= ~d3; if ( led_ctrl[3] ) d4 <= ~d4; if ( led_ctrl[4] ) d5 <= ~d5; end assign led_d1 = d1 ? 1'b1 : 1'b0; //LED翻转输出assign led_d2 = d2 ? 1'b1 : 1'b0; assign led_d3 = d3 ? 1'b1 : 1'b0; assign led_d4 = d4 ? 1'b1 : 1'b0; assign led_d5 = d5 ? 1'b1 : 1'b0; endmodule

键盘扫描原理及应用键盘

本资源为网上搜集而来,如果该程序涉及或侵害到您的版权请立即写信通知我

键盘扫描 键盘是由按键构成,是单片机系统里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人-机通信。 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和按键矩阵,采用分时扫描进行处理,下面也将介绍这个特殊应用的方法和注意的地方。 独立式键盘结构

矩阵键盘扫描汇编程序

4*4矩阵键盘扫描汇编程序(基于51单片机) // 程序名称:4-4keyscan.asm ;// 程序用途:4*4矩阵键盘扫描检测 ;// 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下, ;// 如果发生双键同时按下时,程序将只识别其中先扫描的按键;// 程序入口:void ;// 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态;//================================================================== ==== PROC KEYCHK KEYNAME DATA 40H ;按键名称存储单元 ;(b7-b5纪录按键状态,b4位为有效位, ;b3-b0纪录按键) KEYRTIME DATA 43H ;重复按键时间间隔 SIGNAL DATA 50H ;提示信号时间存储单元 KEY EQU P3 ;键盘接口(必须完整I/O口) KEYPL EQU P0.6 ;指示灯接口 RTIME EQU 30 ;重复按键输入等待时间 KEYCHK: ;//=============按键检测程序========================================= ==== MOV KEY,#0FH ;送扫描信号 MOV A,KEY ;读按键状态 CJNE A,#0FH,NEXT1 ;ACC<=0FH ; CLR C ;Acc等于0FH,则CY为0,无须置0 NEXT1: ; SETB C ;Acc不等于0FH,则ACC必小于0 FH, ;CY为1,无须置1 MOV A,KEYNAME ANL KEYNAME,#1FH ;按键名称屏蔽高三位 RRC A ;ACC带CY右移一位,纪录当前按键状态 ANL A,#0E0H ;屏蔽低五位

堪称一绝的键盘扫描方法

堪称一绝的“IO口扫键”法 在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支! 那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一: 图一 对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方便描述,我们约定:设置某一IO口输出为“0”――称其为“扫某IO口”)。用行线输出扫键码,列线检测是否有按键的查询方法进行扫键。扫键流程:在行线依次输出011,101,110扫键值,行线每输出一个扫键值,列线检测一次。当列线检测到有按键时,结合输出的扫键值可以判断相应的按键。 但是,5个IO真的只能扫6个键吗?有人说可以扫9个,很聪明!利用行IO与地衍生3个键(要注意上拉电阻),如图二: 图二 扫键流程:先检测3个行IO口,对K1’,K2’,K3’进行扫键,之后如上述2*3

扫键流程。5个IO口能扫9个键,够厉害吧,足足比6个键多了1/2! 动动脑,还能不能再多扫几个?就几个?一个也行!好,再想一下,硬是被逼出来了!如图三: 图三 不多不少,正好10个键!这种扫键方式比较少见吧!漂亮!扫键流程:设IO1输出为“0”,检测IO2…IO5,若判断有相应健按下,则可知有健;若无键,则继续扫键:设IO2输出为“0”,检测IO3,IO4,IO5,判断有无键按下,如此类推。这里应注意:当扫某一IO口(输出为“0”)时,不要去检测已经扫过的IO口。如:此时设置IO2输出为“0”,依次检测IO3,IO4,IO5,但不要去检测IO1,否则会出错(为什么,请思考)。 感觉怎么样?不错吧!让我们再看看图三,好有成就感!看着,看着……又看到了什么?快!见图四: 图四 真强!被您看出20个键!多了一个对称的三角形。可是,像这样的排列能正确扫20个键吗?回答是肯定的:不能!上下三角形相互对称,其对称扫出的键无法区别。有没有注意到分析图三时提到的注意点?(à“当扫某IO口时,不要去检测已经扫过的IO口,否则会出错”) 我们分析一下图四:当IO1输出“0”时,按下K11或K11’键都能被IO2检测到,但IO2检测却无法区别K11和K11’键!同理,不管扫哪个IO口,都有两个对称的键不能区分。 我们假想,如果能把对称键区分开来,我们就能正常地去判断按键。我们在思考:

键盘 分类

一、概述 键盘在单片机应用系统中,实现输入数据、传送命令的功能,是人工干预的主要手段。键盘分两大类:编码键盘和非编码键盘。 编码键盘:由硬件逻辑电路完成必要的键识别工作与可靠性措施。每按一次键,键盘自动提供被按键的读数,同时产生一选通脉冲通知微处理器,一般还具有反弹跳和同时按键保护功能。这种键盘易于使用,但硬件比较复杂,对于主机任务繁重之情况,采用8279可编程键盘管理接口芯片构成编码式键盘系统是很实用的方案。 非编码键盘:只简单地提供键盘的行列与矩阵,其他操作如键的识别,决定按键的读数等仅靠软件完成,故硬件较为简单,但占用CPU较多时间。有:独立式按键结构、矩阵式按键结构。 二、键盘系统设计 首先,确定键盘编码方案:采用编码键盘或非编码键盘。随后,确定键盘工作方式:采用中断或查询方式输入键操作信息。然后,设计硬件电路。非编码键盘系统中,键闭合和键释放的信息的获取,键抖动的消除,键值查找及一些保护措施的实施等任务,均由软件来完成。 (一)非编码键盘的键输入程序应完成的基本任务 1.监测有无键按下;键的闭合与否,反映在电压上就是

呈现出高电平或低电平,所以通过电平的高低状态的检测,便可确认按键按下与否。 2.判断是哪个键按下。一.编程扫描方式:当单片机空闲时,才调用键盘扫描子程序,反复的扫描键盘,等待用户从键盘上输入命令或数据,来响应键盘的输入请求。 二.定时扫描工作方式:单片机对键盘的扫描也可用定时扫描方式,即每隔一定的时间对键盘扫描一次。三.中断工作方式:只有在键盘有键按下时,才执行键盘扫描程序并执行该按键功能程序,如果无键按下,单片机将不理睬键盘 3.完成键处理任务。 (二)从电路或软件的角度应解决的问题 1.消除抖动影响。键盘按键所用开关为机械弹性开关,利用了机械触点的合、断作用。由于机械触点的的弹性作用,一个按键开关在闭合和断开的瞬间均有一连串的抖动、抖动时间的长短由按键的机械特性决定,一般为5~10ms,这是一个很重要的参数。抖动过程引起电平信号的波动,有可能令CPU误解为多次按键操作,从而引起误处理。 为了确保CPU对一次按键动作只确认一次按键,必须消除抖动的影响。按键的消抖,通常有软件,硬件两种消除方法。 这种方法只适用于键的数目较少的情况。 软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。通常采用软件延时的方法:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真

数码管显示和键盘扫描实验资料

实验三LED数码管动态显示及4 X4 键盘控制实验 一、实验目的 1.巩固多位数码管动态显示方法。 2.掌握行扫描法矩阵式按键的处理方法。 3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。二、实验内容 使用AT89S52学习板上的4位LED数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。 三、实验系统组成及工作原理 1.4位LED数码管和4 X 4矩阵键盘阵列电路原理图

2.多位数码管动态显示方式 a b c d e f g dp com a b c d e f g dp com a b c d e f g dp com a b c d e f g dp com D0 IO(2) IO(1) 说明4位共阴极LED动态显示3456数字的工作过程 首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上, 接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,

也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后, 再由I/O口(1)送出数字4的段选码66H即01100110到段选线上,接着由I/O 口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮; 如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。 3.4 X 4 矩阵式按键扫描处理程序 行扫描法又称逐行零扫描查询法,即逐行输出行扫描信号“0”,使各行依次为低电平,然后分别读入列数据,检查此(低电平)行中是否有键按下。如果读得某列线为低电平,则表示此(低电平)行线与此列线的交叉处有键按下,再对该键进行译码计算出键值,然后转入该键的功能子程序入口地址;如果没有任何一根列线为低电平,则说明此(低电平)行没有键按下。接着进行下一行的“0”行扫描与列读入,直到8行全部查完为止,若无键按下则返回。 有时为了快速判断键盘中是否有键按下,也可先将全部行线同时置为低电平,然后检测列线的电平状态,若所有列线均为高电平,则说明键盘中无键按下,立即返回;若要有一列的电平为低,则表示键盘中有键被控下,然后再如上那样进行逐行扫描。 四、实验设备和仪器 PC机一台 AT89S52单片机学习板、下载线一套 五、实验步骤 1.按时实验要求编写源程序(实验前写)进行软件模拟调试。 2.软件调试好,连接硬件电路。

键盘码表:单键扫描码,ascii,组合键码

字母和空格按键的编码表 按键单键SHIFT CTRL ALT 扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码 a 1E 61 1E 41 1E 01 1E 00 b 30 62 30 42 30 02 30 00 c 2E 63 2E 43 2E 03 2E 00 d 20 64 20 44 20 04 20 00 e 12 65 12 45 12 05 12 00 f 21 66 21 46 21 06 21 00 g 22 67 22 47 22 07 22 00 h 23 68 23 48 23 08 23 00 i 17 69 17 49 17 09 17 00 j 24 6A 24 4A 24 0A 24 00 k 25 6B 25 4B 25 0B 25 00 l 26 6C 26 4C 26 0C 26 00 m 32 6D 32 4D 32 0D 32 00 n 31 6E 31 4E 31 0E 31 00 o 18 6F 18 4F 18 0F 18 00 p 19 70 19 50 19 10 19 00 q 10 71 10 51 10 11 10 00 r 13 72 13 52 13 12 13 00 s 1F 73 1F 53 1F 13 1F 00 t 14 74 14 54 14 14 14 00 u 16 75 16 55 16 15 16 00 v 2F 76 2F 56 2F 16 2F 00 w 11 77 11 57 11 17 11 00 x 2D 78 2D 58 2D 18 2D 00 y 15 79 15 59 15 19 15 00 z 2C 7A 2C 5A 2C 1A 2C 00 SpaceBar 39 20 39 20 39 20 39 20 功能键和数字键盘的编码表·内容正文 按键单键SHIFT CTRL ALT 扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码 F1 3B 00 54 00 5E 00 68 00 F2 3C 00 55 00 5F 00 69 00 F3 3D 00 56 00 60 00 6A 00 F4 3E 00 57 00 61 00 6B 00 F5 3F 00 58 00 62 00 6C 00 F6 40 00 59 00 63 00 6D 00 F7 41 00 5A 00 64 00 6E 00 F8 42 00 5B 00 65 00 6F 00 F9 43 00 5C 00 66 00 70 00 F10 44 00 5D 00 67 00 71 00 F11 85 00 87 00 89 00 8B 00 F12 86 00 88 00 8A 00 8C 00 键盘码表:单键扫描码,ascii,组合键码

非编码键盘的扫描程序设计

目录 1设计任务及要求 (1) 1.1初始条件 (1) 1.2要求完成的主要任务 (1) 2方案比较及认证 (1) 3键盘扫描原理 (3) 4系统硬件设计 (4) 4.1选用元器件 (4) 4.1.1 8031单片机 (4) 4.1.2 8155芯片 (7) 4.2 硬件电路 (10) 4.2.1矩阵式键盘电路 (10) 4.2.2时钟电路和复位电路 (11) 4.2.3非编码键盘的总电路 (12) 5系统软件设计 (13) 5.1软件思想 (13) 5.2 程序流程图 (14) 5.3源程序 (15) 6调试记录及结果分析 (18) 心得体会 (19) 参考文献 (20) 附录 (21)

附录1 8031单片机资料 (21) 附录2 8155芯片资料 (21) 附录3 程序清单 (22)

非编码键盘的扫描程序设计 1设计任务及要求 1.1初始条件 1.通过8155扩展I/O口组成6×6行列式键盘 2.利用8031微控制器 1.2要求完成的主要任务 1.技术指标:对键盘按键能够正确识别,去抖动 2.工作原理:键盘扫描 3.课程设计说明书应包括 (1)设计任务及要求 (2)方案比较及认证 (3)键盘扫描原理 (4)硬件原理,电路图,采用器件的功能说明 (5)软件思想,流程,源程序 (6)调试记录及结果分析 (7)参考资料 (8)附录:芯片资料,程序清单 (9)总结 2方案比较及认证 (1)键盘去抖动方案的选择 键盘采用机械弹性开关来反映一个电压信号的开、断。由于机械触点的弹性作用,在闭合和断开的瞬间会有抖动发生。抖动时间的长短由按键的机械特性决

键盘鼠标扫描码

[VB]键盘鼠标扫描码 1.??常数值描述 2.vbKeyLButton &H1 鼠标左键 3.vbKeyRButton &H2 鼠标右键 4.vbKeyCancel &H3 CANCEL 键 5.vbKeyMButton &H4 鼠标中键 6.vbKeyBack &H8 BACKSPACE键 7.vbKeyTab &H9 TAB 键 8.vbKeyClear &HC CLEAR 键 9.vbKeyReturn &HD ENTER 键 10.vbKeyShift &H10 SHIFT 键 11.vbKeyControl &H11 CTRL 键 12.vbKeyMenu &H12 MENU 键 13.vbKeyPause &H13 PAUSE 键 14.vbKeyCapital &H14 CAPS LOCK键 15.vbKeyEscape &H1B ESC 键 16.vbKeySpace &H20 SPACEBAR键 17.vbKeyPageUp &H21 PAGE UP 键 18.vbKeyPageDown &H22 PAGE DOWN键 19.vbKeyEnd &H23 END 键 20.vbKeyHome &H24 HOME 键 21.vbKeyLeft &H25 LEFT 键 22.vbKeyUp &H26 UP 键 23.vbKeyRight &H27 RIGHT 键 24.vbKeyDown &H28 DOWN 键 25.vbKeySelect &H29 SELECT 键 26.vbKeyPrint &H2A PRINT SCREEN键 27.vbKeyExecute &H2B EXECUTE 键 28.vbKeySnapshot &H2C SNAPSHOT键 29.vbKeyInsert &H2D INSERT 键 30.vbKeyDelete &H2E DELETE 键 31.vbKeyHelp &H2F HELP 键 32.vbKeyNumlock &H90 NUM LOCK键 33. 34.A至Z键与A杴Z字母的ASCII码相同: 35.常数值描述 36.vbKeyA 65 A 键 37.vbKeyB 66 B 键 38.vbKeyC 67 C 键 39.vbKeyD 68 D 键 40.vbKeyE 69 E 键 41.vbKeyF 70 F 键 42.vbKeyG 71 G 键 43.vbKeyH 72 H 键

矩阵键盘扫描代码(C语言)

#include #define unchar unsigned char #define unint unsigned int unsigned char code dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code wela[]={0,1,2,3,4,5,6,7}; unsigned char num,key; unsigned char keyscan(); unchar Keyscan(); void delay(int z) { int x,y; for(x=z;x>=0;x--) for(y=0;y<=148;y++); } void main() { P2=1; while(1) { P1 = 0xf0; if(P1 != 0xf0) //判断有无按键按下 { delay(20); //按键消抖 if(P1 != 0xf0) //第二次判断有无按键按下 { delay(20); //按键消抖 if(P1 != 0xf0) //第三次判断有无按键按下 { key = Keyscan(); } } } P0=dula[key];

} } //unchar keyscan() //{ //} unchar Keyscan(void) { unchar i,j,temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; //让矩阵键盘的每行分别为低电? for(j=0; j<4; j++) { P1 = Buffer[j]; temp = 0x10; for(i=0; i<4; i++) { if(!(P1 & temp)) //判断P1口高4位某一行为低电平 { return (i+j*4); //返回键码 } temp<<= 1; } } }

键盘扫描方法

键盘扫描方法 传统的键盘扫描方法如图1所示,该方法虽然被广泛应用于很多场合,但有一个不足的地方,如果按键一直没有释放,或者按键坏了,一直处于闭合状态,则程序一直处于检测按键是否释放,系统将无法运行。只要对其稍加改进,就可以避免产生这个问题。 假设键盘接口电路采用独立式键盘接口,所有按键公共端接地,而且没有按键按下时IO口为高电平。当按键没有按下时,IO口为高电平;当按键按下时,IO口为低电平;当按键释放时,IO口为高电平。一个完整的按键过程是——按键未按下,按键按下,按键释放,而对应的IO口的电平变化为——高电平,低电平,高电平。所以,可以通过判断IO口电平变化的变化顺序是否满足高电平→低电平→高电平,来判断是否有按键按下,而对于其它的电平变化顺序都是无效的。那么该如何实现呢?在键盘扫描过程中,如果IO口为高电平,则需要判断是由于未按键,还是按键按下后释放引起的;如果IO口为低电平,则需要判断是由于未按键还是扫描之前本来就是低电平引起的。所以我们需要引入一个全局位变量KEY_EN,来标志按键的状态, KEY_EN=0表示按键未按下;KEY_EN=1表示按键按下。另外,我们还需引入一个全局字节变量KEY_TP来暂存键值,这是因为只有当IO口电平变化满足高电平→低电平→高电平,才表示一个按键有效,而只有在IO口为低电平的时候才能够读取到键值。具体的键盘扫描流程如图2所示,键盘初始化KEY_EN=0。

图1 传统键盘扫描

图2 改进后键盘扫描 接下来我们介绍一种代码效率极高的键盘扫描方法。键盘接口电路同样采用独立式,假设有8个按键,所有按键公共端接地,键盘扫描口为P0.7~P0.0,而且没有按键按下时为高电平,键盘扫描程序如下: unsigned char Trigger; unsigned char Continue; void delayms(unsigned char n) { …… } void key_scan() { unsigned char ReadData; if (P0!=0xff&&Trigger==0x00) delayms(20); ReadData = P0 ^ 0xff; Trigger = ReadDate & (ReadData ^ Continue);

相关主题