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

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

摘要

计算机控制技术课程设计是在教学及实验基础上,对课程所学理论知识的深化和提高。本次课程设的内容是利用8031微控制器,通过8155扩展I/O口行列式键盘。要求通过8155扩展I/O口组成4×8行列式键盘,设计非编码键盘的扫描系统,并且能够对键盘的按键正确识别,去抖动。

关键词:8155非编码去抖

目录

1 课程设计目的 (1)

2 非编码键盘 (2)

3 芯片介绍 (3)

3.1 8031芯片介绍 (3)

3.2 8155芯片介绍 (4)

4 电路设计 (6)

5 程序设计 (7)

6 电路仿真 (10)

7 心得体会 (13)

附录程序清单 (14)

参考文献 (17)

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

1 课程设计目的

(1)了解并掌握非编码键盘的工作原理;

(2)熟悉和掌握8155与8031的结构及工作原理;

(3)通过课程设计,掌握电路设计的基本方法和技术;

(4)掌握单片机的接口技术及相关外围芯片的外特性,控制方法,从而加深对计算机控制技术知识的理解;

(5)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

2 非编码键盘

键盘可以分为编码式和非编码式两种。编码式键盘是通过数字电路直接产生对应于按键的ASCⅡ码,这种方式目前很少使用。非编码式键盘将案件排列成矩阵的形势,由硬件或软件随时对矩阵扫描,一旦某一键被按下,该键的行列信息即被转换为位置码并送入主机,再由键盘驱动程序查表,从而得到按键的ASC Ⅱ码,最后送入内存中的键盘缓冲区供主机分析执行。非编码式键盘由于结构简单,按键重定义方便而成为目前最常采用的键盘类型。由此,多姿多彩的多媒体键盘便应运而生,这些键盘通常出现在品牌机上,如联想、同方等,品牌机上的“单键上网”也是基于此原理。

非编码键盘又分为:独立键盘和行列式(又称为矩阵式)键盘。本次课程设计要求设计的是4×8行列式键盘。

3 芯片介绍

3.1 8031芯片介绍

8031和8051一样是最常见的MCS51系列单片机,是inter公司早期的成熟的单片机产品,应用范围涉及到各行各业。8031有40个引脚,采用双列直插封装,其引脚图如图3-1所示。

图3-18031引脚图

XTAL1:内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。

XTAL2:内部振荡电路反相放大器的输出端。是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。

RST:当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位。

PSEN:程序选通有效信号,当从外部程序存贮器读取指令时产生低电平时,指令寄存器的内容读到数据总线上。

ALE:地址锁存有效信号,其主要作用是提供一个适当的定时信号,在它的

下降沿用于外部程序存储器或外部数据存贮器的低8位地址锁存,使总线P0输出/输入口分时用作地址总线(低8位)和数据总线,此信号每个机器出现2次,只是在访问外部数据存储器期间才不输出ALE。

EA:当保持TTL高电平时,如果指令计数器小于4096,8031执行内部ROM 的指令;当使TTL为低电平时,从外部程序存贮器取出所有指令。

P0.0~P0.7:通道0,它是8位漏极开路的双向I/O通道,当扩展外部存贮器时,这也是低八位地址和数据总线,在编程校验期间,它输入和输出字节代码,通道0吸收/发出二个TTL负载。

P1.0~P1.7:通道1是8位拟双向I/O通道,在编程和校验时,它发出低8位地址。通道1吸收/发出一个TTL负载。

P2.0~P2.7:通道2是8位拟双向I/O通道,当访问外部存贮器时,用作高8位地址总线。通道2能吸收/发出一个TTL负载。

P3.0~P3.7:通道3准双向I/O通道。通道3能吸收/发出一个TTL负载。

3.2 8155芯片介绍

8155是一多功能的可编程外围接口芯片,内部资源有256B的RAM,2个8位、1个6位的I/O口和1个14位的“减1”计数器。8155有40个引脚,采用双列直插封装,总线型的8155引脚图如图3-2所示。

图3-2总线型8155引脚图

AD0~AD7:三态地址/数据线,是低8位地址与数据复用线。地址可以是8155片内RAM单元地址或I/O端口地址。AD0~AD7上的地址由ALE的下降沿存到8155片内地址锁存器。也就是由ALE信号来区别AD0~AD7上出现的地址信息还是数据信息。

ALE:锁存允许信号。在ALE信号的下降沿把ADO~AD7上的8位地址信息,CS片选信号及IO/M信号都锁存到8155内部存储器中。

CS:片选信号,低电平有效,由ALE信号的下降沿锁存到8155内部存储器。

RD:读选通信号,低电平有效。当RD=0、CS=0时,开启AD0~AD7的缓冲器,被选中的片内RAM单元或IO口的内容送到AD0~AD7上。

WR:写选通信号。低电平有效,当CS、WR都有效时,CPU输出到AD0~AD7上的信息送到8155片内RAM单元或I/O端口。

IO/M:IO口/RAM选择。0:选内RAM;1:选内IO口。

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

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

PB0~PB7:B口的I/O线,其输入、输出的流向可由程序控制。

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

TIN:定时器输入。

TOUT:定时器输出。

4 电路设计

总设计电路图如图4-1所示。

图4-1 总设计电路图

如上图,8031的P0.0~P0.7分别与8155的AD0~AD7相连接,8155的PC 口与PB口分别控制矩阵键盘的行与列,8031的P2.0口及P2.7口分别与8155的IO/M及CS相连。按照这种连线方式,8155的命令状态寄存器地址、A口地址、B口地址和C口地址分别是0X7FF0H、0X7FF1H、0X7FF2H和0X7FF3H。

在扫描键盘时,我们将8155的B口设置为输出口、C口设置为输入口,这样8155的命令状态寄存器地址赋值为0X02。由图4-1可以看出,在矩阵键盘的行下面加了一排下拉电阻,因此我们采用的是将键盘电位拉高的扫描方式。

为了验证矩阵键盘扫描的正确性,我们在8031的P1口上加了一排发光二极管。将键盘一次从左到右从上到下编号,可以从1编到32。我们将发光二极管亮定义为“1”,灭定义为“0”。因此根据发光二极管的亮灭,按照P1口由高位到低位的顺序排列,可以得到一个八位的二进制数,再将二进制数转化为十进制数。我们定义:当第一个键盘按下时,发光二极管显示“1”;当第二个键盘按下时,发光二极管显示“2”,以此类推。

5 程序设计

在程序设计部分,我们采用模块化程序设计的方法,即将各功能模块化,编写成一段一段的子程序,最后在主程序中调用各子程序完成设计所需功能。采用模块化程序设计的方法降低了程序复杂度,使程序设计、调试和维护等操作简单化。

首先,设计主程序,其流程图如图5-1所示。在主程序一开始,我们要对各芯片初始化,例如:给8031的P1口赋初值,使所有的发光二极管都熄灭;给8155的命令状态寄存器地址赋值,设置B口与C口的输入、输出方式等等。接着,判断有无键盘按下,若有键盘按下,执行键盘扫描程序,并将返回值返回赋给8031的P1口;若没有键盘按下,则继续判断。

图5-1主程序流程图

键盘扫描时需要去抖动,键盘去抖动有两种方式,一种是软件去抖动,另一种是硬件去抖动,在这里我们采用软件去抖动的方式。即在检测到有键盘按下时

为了防止是抖动,需要在延迟一段时间后再检测是否有键盘按下。因此,接下来要设计延时子程序,延时原理很简单,只要采用循环体进行即可。由于程序很简单就不给程序流程图,延时子程序如下所示。

void delay(unsigned char t)

{

unsigned char i,j;

for(j=t;j>0;j--)

for(i=110;i>0;i--);

}

然后需要设计检测有无键盘按下子程序,在此程序中,先给8155的PB口赋值0XFF。由于PC口上接有下拉电阻,因此都是低电平。此时读回PC口上的电位值,若PC口的电位有变化,说明有键盘按下;若没有变化,说明没有键盘按下,继续检测。此子程序的流程图如图5-2所示。

图5-2检测有无键盘按下子程序流程图

最后设计的就是键盘扫描程序。先给PB口赋值0X01,检测PC口的值是否为零,若不为零,说明被按下的键盘在此列;若不为零,说明被按下的键盘不在此列,将PB左移一位继续检测。知道被按下的键盘在哪一列之后,给PB口赋值0XFF,读回此时PC口的值,并将这个值与一个初值为0X01的变量a按位与,若此时的值为零,说明被按下的键盘不在这一行,将a左移一位,即到下一行去检测;若得到的值不为零,说明被按下的键盘就在这一行。用键盘的行数乘以8再加上键盘的列数,则可以得到键盘的编号,将此编号返回。最后是松手检测。此段子程序的流程图如图5-3所示。

图5-3键盘扫描子程序流程图

6 电路仿真

此次课程设计电路的仿真是基于Proteus的仿真。Proteus软件是英国Labcenter Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。Proteus是世界上著名的EDA工具,鉴于其强大的功能及广泛的应用,我们选择了它作为此次课程设计电路的仿真工具。

仿真刚启动时,没有发光二极管亮,说明没有键盘按下,此时的仿真图如图6-1所示。

图6-1刚启动仿真时的仿真图

我们定义最上面的一行键盘是第零行,接下来一行是第一行,以此类推。前面已经介绍过键盘的行数乘以8再加上键盘的列数,可以得到键盘的编号。如果按下第零行第三列的键盘,即第三个键盘,发光二极管应该显示“3”,也就是最后一个和倒数第二个发光二极管亮。此时的仿真图如图6-2所示。

图6-2按下第三个键盘时的仿真图

如果按下第二行第六列的键盘,即第二十二个键盘,发光二极管应该显示

“22”,也就是第四、第六和第七个发光二极管亮。此时的仿真图如图6-3所示。

图6-3按下第二十二个键盘时的仿真图

从仿真的结果看来,仿真的结果完全符合要求,能够正确识别键盘按键,完成了对非编码键盘的扫描及显示,并且有效的解决了抖动问题。

7 心得体会

经过了这些天的课程设计我首先感觉到的是身心非常的疲惫,但我无怨无悔,因为当我查阅了大量的文献和参考资料后我发觉学到许多在课堂上和书本上所学不到的东西,是这些课外的知识使我更进一步地熟悉了一些芯片的结构以及掌握了各芯片的工作原理及其具体的使用方法,同时也使我也开拓了眼界对电子器件有了更进一步的了解和认识,对电子产品产生了浓厚的兴趣。通过实践我增强了动手能力和操作能力,这对我以后进入社会参加工作是很有帮助的。

同时,经过这几天的努力,我对Proteus这款软件的使用也更加熟练,尤其是掌握了对总线的理解和使用。Proteus是一款强大的软件,在以后的学习过程中,我将更加深入的去学习这款软件的使用方法和技巧。

另外通过这次课程设计,我对文档的编排也有了一定的掌握,这对于以后的毕业设计及工作需要都有很大的帮助,在完成课程设计的同时我也在复习一遍计算机控制技术这门课程,把以前很多没学懂的问题都学懂学透了。所以课程设计是理论知识的升华。

整个课程设计过程中,由于理论知识的缺乏,课程设计还有很多不足之处,在以后的课程设计中,希望能有所改善。

附录程序清单

#include //头文件

#include //XBYTE 宏定义

#define COM XBYTE[0x7FF0] //8155命令状态寄存器地址#define PA XBYTE[0x7FF1] //8155的A口地址

#define PB XBYTE[0x7FF2] //8155的B口地址

#define PC XBYTE[0x7FF3] //8155的C口地址

int x,y,z,cord_h,cord_l;

void delay(unsigned char t) //延时

{

unsigned char i,j;

for(j=t;j>0;j--)

for(i=110;i>0;i--);

}

void key() //检测有无键盘按下

{

int a=1;

cord_h=0xff;

PB=cord_h;

cord_l=0;

while(!cord_l&&a)

{

delay(10);

cord_l=PC;

if(cord_l)

a=0;

}

unsigned char keyscan() //扫描键盘并返回响应的键值{

int a;

x=0;

y=0;

cord_h=0x01;

do

{

x++;

PB=cord_h;

cord_l=PC;

cord_h<<=1;

}while(!cord_l);

a=0x01;

cord_h=0xff;

PB=cord_h;

cord_l=PC;

while(!(cord_l&a))

{

a<<=1;

y++;

cord_l=PC;

}

z=x+y*8;

return z;

while(PC);

delay(5);

while(PC);

void main()

{

COM=0x02; //8155的B口设置为输出口,C口设置为输入口P1=0;

while(1)

{

key();

P1=keyscan();

}

}

参考文献

[1] 于海生. 计算机控制技术. 机械工业出版社,2010

[2] 郑学坚,周斌. 微型计算机原理与应用. 清华大学出版社

[3] 沈美明,温冬婵. IBM-PC汇编语言程序设计. 清华大学出版社

[4] 何立民. 单片机应用系统设计. 北京航空航天大学出版社

[5] 姚燕南,薛钧义. 微型计算机原理. 西安电子科技大学出版社

[6] 沙占友等. 新编实用数字化测量技术. 国防工业出版社

[7] 宋春荣等. 通用集成电路手册. 山东科技出版社

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

摘要 ------------------------------------------------------------------------------------------------------- 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);

相关文档
最新文档