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

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

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

摘要

计算机控制技术是一门以电子技术、自动控制原理、计算机应用技术为基础,以计算机控制技术为核心,综合可编程控制技术、单片机技术、计算机网络技术,从而实现生产技术的精密化、生产设备的信息化、生产过程的自动化及机电控制系统的最佳化的专门学科。企业对具备较强的计算机控制技术应用能力专门人才需求很大。

本文在proteus7.5软件上利用8155芯片来扩展8031单片机的I/O接口,在keil软件下采用C语言编程,生成.hex文件,可以仿真实现6*6矩阵键盘的按键识别和消除按键抖动,将识别到的按键更人性化的在lcd1602的液晶显示,主要由方案设计、硬件电路设计、系统软件设计和系统调试四部分组成。

关键词:8031单片机 8155芯片矩阵键盘 I/O口扩展 1602液晶

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

1设计方案

1.1 设计任务

通过8155扩展8031微控制器I/O口组成6×6行列式键盘行列式键盘。设计非编码键盘的扫描硬件系统,画出电路图;对键盘按键能够正确识别,去抖动;键盘扫描;撰写设计说明书。

1.2 设计方案

首先,将用8155芯片扩展8031单片机的I/O口,然后需要检测6*6的矩阵键盘的12根导线可分别接在8155的PB0-PB6和PC口,LCD1602的8根数据线可接在8155的PA0口,控制线接在单片机的P2.0-P2.3,由于8155是可编程芯片,所以将的PA、PB和PC口依次设为输出、输出和输入,通过编写键盘扫描程序来识别按键并返回按键值,最后判断将识别到的按键值形象的显示在LCD1602液晶上。主电路结构框图如图1-1所示。

图1-1 系统结构图

2系统硬件设计

2.1最小应用系统

80C31单片机,它是8位高性能单片机。属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,标准MCS-51单片机的体系结构和指令系统。80C31内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。但80C31片内并无程序存储器,需外接ROM。此外,80C31还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。本次设计采用80C31的PDIP(40pin)封装形式,管脚图如图2-1所示。

图2-1 8031管脚图

80c31单片机的40根管脚,若要单片机正常工作必须满足:

1. 电源线2根

Vcc:编程和正常操作时的电源电压,接+5V。

Vss:地电平。

2. 晶振:2根

XTAL1:振荡器的反相放大器输入。使用外部震荡器是必须接地。

XTAL2:振荡器的反相放大器输出和内部时钟发生器的输入。当使用外部振荡器时用于输入外部振荡信号。

所以可以得到单片机的最小应用系统如图2-2所示。

图2-2 8031最小应用系统

2.2 8155扩展电路

8155芯片介绍关于Intel的8155/8156:是一多功能的可编程外围接口芯片,40脚双列直插封装,有A口、B口、C口和定时器/计数器低8位以及定时器/计数器高8位五个端口,另外8155内部还有一个命令/状态寄存器,所以8155内部共有

6各端口。对它们只需要使用即可实现编址,如表1-1所示。

8155的A口有输入和输出两种工作方式,B口也有输入和输出两种工作方式,而C口有输入方式(ALT1),输出方式(ALT2),A口控制端口方式(ALT3)以及A口和B口控制端口方式(ALT4)四种工作方式。这些端口的工作方式是由8155内部的命令寄存器(命令字)来控制的。命令字除了规定端口的工作方式还规定了定时器/计数器的工作方式。命令字只能进行写操作。其格式如图2-3所示。

图2-3 8155的命令字

结合8031和8155的芯片结构和特点,可设计出如图2-4所示的扩展电路。

图2-4 8155扩展电路

2.3 矩阵键盘接口电路

编码键盘与单片机的接口单片机系统所用的键盘有编码键盘和非编码键盘两种。

非编码键盘是由一些按键排列成的一个行列矩阵。按键的作用,只是简单地实现接点的接通和断开,但必须有一套相应的程序与之配合,才能产生出相应的键码。非编码键盘几乎不需要附加什么硬件电路,目前,在微型计算机控制系统中使用比较普遍。本次设计有一个6行×6列的非编码键盘,按行依次为1-36,键盘的行线接8155C口的六条线PB5~PB0,键盘的列线则接8155C口的6条线,而且在C口接下拉电阻。如图2-5所示。

图2-5 矩阵键盘接口电路

2.4 LCD1602接口电路

LCD1602字符型液晶显示模块是一种专门用于可以显示16列*2行显示字母、数字、符号等点阵式LCD, 16*2等的模块。其管脚介绍如下:

第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

图2-6 LCD1602接口电路

第15脚:背光源正极。

第16脚:背光源负极。

综合可设计液晶与8031单片机及8155芯片的接口电路如图2-6所示。

2.5 主电路设计

综上各子模块电路的设计,可设计出主电路图如图2-7所示

图2-7 主电路图

3系统软件设计

3.1主程序设计

主程序主要包括三个部分:初始化程序,调用判断子程序和调用检测子程序,其中显示子程序被调用在检测子程序中。其流程图如图3-1所示。

图3-1 主程序流程图

3.2 延时程序设计

延时程序是采用双重for语句循环自减的方法,将i赋值t,j赋值110运用循环重复t遍110自减到0。延时时间计算方法:

振荡器的频率为12MHz,一个振荡器周期为1/12微秒,一个机器周期为12/12=1微秒计算机执行每步就需要1微秒,延时时间就是执行步数*1微秒。子程序流程图如图3-2所示。

图3-2 延时子程序流程图

3.3 键盘扫描子程序设计

设置8155的PA、PB和PC口依次设为输出、输出和输入,这样在没有任何键按下时,所有键盘行线成高电平,列线上的信号都是低电平。按键识别有各种方法,此系统只“行扫描”法:

(1)确定是否有按键按下。PB口输出111111到键盘的行线,然后检测键盘的列线信号。若没有键按下,则为00000。若有任一个按键按下,则有某一条列线为0,也就是当PB5~PB0不为000000时,就表示有键按下。

(2)通过“行扫描”确定已按键的行、列位置。所谓行扫描就是依次给每条行线输入1信号,而其余各行都输入0,并检测每次扫描时所对应的列信号。并检测每次所对应的C口输入。只有在某行上有键按下时,在这一行上输入1,在列输出上才能检测到1信号。若是输入为1的这一行上没有按键按下,则收到的列

信号仍然全是0。因此,只要记下列信号不全为0时的B口输出及C口输入,就能确定以按键的位置。这样,通过行扫描,就可以确定按键的行、列坐标。

(3)消除键抖动。一般按键在按下的时候有抖动的问题,即键的簧片在按下时会有轻微的弹跳,需经过一个短暂的时间才会可靠地接触。若在簧片抖动时进行扫描就可能得出不正确的结果。因此,在程序中要考虑防抖动的问题。最简单的办法是在检测到有键按下时,等待(延迟)一段时间再进行“行扫描”,延迟时间为10~20ms,这可通过调用子程序来消除抖动。扫描子程序流程图如图3-3所示。

图3-3 扫描子程序流程图

3.4 显示子程序设计

1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。

指令1:清显示,指令码01H,光标复位到地址00H位置。

指令2:光标复位,光标返回到地址00H

指令3:光标和显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。

指令4:显示开关控制。D:控制整体的显示开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C :高电平时显示移动的文字,低电平时移动光标

指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时为双行显示,F:低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。

指令7:字符发生器RAM地址设置。

指令8:DDRAM地址设置。

指令9:读忙信号和光标地址 BF:忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙。

读写操作时序如图3-4、3-5所示

图3-4 读时序图

图3-5 读时序图

4 系统调试与结果

4.1 调试内容与问题解决

软件与硬将件连接,仿真运行时,发现液晶的光标移动但是不显示初始化的字符,经检查发现液晶控制线与单片机的接线出现了错误,改正后可显示初始化字符。当按下按键时,发现液晶的显示与按键不对应,不能正确显示按键,甚至有的按键不能按下去没有反应,经检查是扫描子程序的逻辑发生错误,出现死循环,修改后可正确运行。

4.2 运行结果与分析

仿真运行开始,初始化后液晶显示器上出现预设的字符串“PLEASE ENTER”,如图4-1所示

图4-1 初始化的界面

当按下第一行,第二列的按键时,液晶上出现了行和列的标号,别且计算出是2,如图4-2所示。

图4-2 按键2显示

当按下第4行,第3列时,液晶上也正确显示了按键的位置并且计算出为21,图4-3所示。

图4-3 按键21显示

依次按下每个键,并且检查液晶的显示,发现36个按键都能正确识别显示,所以本设计合理、正确。

小结

在现代科学技术的众多领域中,计算机控制技术起着越来越重要的作用,因此做好《微型计算机控制技术》这门课程的课程设计是非常有必要的,从中可以讲课本中知识运用到实际运用中,也让我深刻的体会到了实践的艰巨性和挑战性,在一周的课程设计中,我不断的改进自己的方法,通过查阅参书和网上的资料,对于自己在知识上的不足进行了非常好的补充和完善,使得我在短短两个星期对于这门业课有了有了更切实的理解,更深的掌握,也学会了通过自己的努力挑战未知的领域!

通过这次课设我才知道我们每个人的潜能是远远超过我们想象的,刚开始拿到课设题目听说可以设计成几百行的程序都有点恐惧,因为之前写的汇编程序最多才几十行,用C语言写单片机程序最多也才写过几百行,但是通过查阅资料,一步一步来发现程序越写越长,写完才发现我们的编程水平比我们想象的要高,但是离社会需求的还远。

这次课设我对程序的差错和调试也有很多新的想法,虽然我的编译器不能单步运行,但是我可以在程序中添加一些延时程序和输出“*”的语句,这样就可以知道程序运行的大致步骤,是否运行我们需要的语句了。事实在我调试和查错时的确起到了很大的作用。

最后,在排版美观方面,也有了较强的意识。在撰写实验报告的时候,格式的要求非常的严格,字体的大小要求,段距,行距也都有统一的要求,开始时候没有注意到这一点,后来发现了,需要全部更改,工作量很大。改正后,看着自己的美观排版,心中还是非常欣慰的。

参考文献

1.李朝清.《单片机原理及接口技术》北京航天航空大学出版社.1994年

2.何立民.《单片机高级教程》北京航天航空大学出版社.2000年

3.杨光友,朱宏辉等《单片机微型计算机原理及接口技术》中国水利水电出版社.2002年

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

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

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

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

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

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

附录

#include //头文件

#include //XBYTE 宏定义

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

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

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

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

sbit lcdrs=P3^0;

sbit lcden=P3^2;

sbit lcdrw=P3^1;

uchar table1[]="HANG ";

uchar table2[]=" LIE ";

uchar table3[]="WE GET ";

uchar table4[]="PLEASE ENTER ";

int x,y,z,hang,lie;

void delay(uchar t);

void wcom(uint co);

void wdate(uchar date);

void wdate1(ulong date);

void panduan();

void jiance();

void xianshi();

void wcom(uint co){ //液晶写控制字子程序lcdrs=0;

pa=co;

delay(2);

lcden=1;

delay(2);

lcden=0;

}

void wdate(uchar date){ //液晶显示单字符子程序lcdrs=1;

pa=date;

delay(2);

lcden=1;

delay(2);

lcden=0;

}

void wdate1(ulong date){ //液晶显示多字符子程序uchar m;

wcom(0x80+0x40+9);

wcom(0x04);

wcom(0x0C);

if(date){

while(date){

m=date%10;

wdate(0x30+m);

date/=10;

}

}

}

void xianshi(){ //显示按键子程序uchar m;

wcom(0x01);

wcom(0x80);

wcom(0x0c);

for(m=0;m<5;m++){

wdate(table1[m]);

delay(2);

}

wdate(0x30+x+1);

for(m=0;m<5;m++){

wdate(table2[m]);

delay(2);

}

wdate(0x30+y);

wcom(0x80+0X40);

for(m=0;m<8;m++){

wdate(table3[m]);

delay(2);

}

wdate1(z);

}

void panduan(){ //判断是否有键按下子程序int flag=1;

hang=0xff;

pb=hang;

lie=0;

while(!lie&&flag){

delay(10);

lie=pc;

if(lie)flag=0;

}

}

void jiance(){ //检测按键子程序int aa;

x=-1;

y=1;

hang=0x01;

do{

x++;

pb=hang;

lie=pc;

hang*=2;

}while(!lie);

aa=0x01;

hang=0xff;

pb=hang;

lie=pc;

while(!(lie&aa)){

aa*=2;

y++;

lie=pc;

}

z=x*6+y;

xianshi();

while(pc);

delay(5);

while(pc);

}

void init(){ //初始化子程序

int m;

pa=0;

pb=0;

pc=0;

lcdrs=lcdrw= lcden=0;

com=0x03; //

wcom(0x38);

wcom(0x0f);

wcom(0x06);

wcom(0x01);

wcom(0x80);

for(m=0;m<12;m++){

wdate(table4[m]);

delay(2);

}

}

void delay(uchar t){ //延时tms子程序uint i,j;

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

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

}

void main(){ //主程序

init();

while(1){

panduan();

jiance();

}

}

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

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

相关文档
最新文档