实验5 小键盘按键识别实验

实验5 小键盘按键识别实验
实验5 小键盘按键识别实验

实验5 小键盘按键识别实验

实验目的:

掌握用软件方法识别行列式键盘的原理和方法

实验要求:

将小键盘的键号(S1-S16)用十六进制数0-F 在7段数码管上显示

分析实验设计思想;

我们如何确定小键盘上哪个键被按下了?

可以利用8255并行接口来进行确定,如果我们将8255的一个端口A 作为小键盘行值的输出端口,将8255的另一端口B 作为列值的输入端口。就可以完成对键盘按键的位置的确定了。原理如下:

键盘采用简单的线性结构,没有键闭合时,各位均处于高电平,当有一个键按下时,就使对应位接地而成为低电平,其他位仍为高电平。

程序清单及相关注释:

.model small .386

data segment

rowport dw 200h;以A 口作为行扫描线,应为输出 colport dw 201h;以B 口作为列检测线,应为输入 controlport dw 203h ;控制字写入端口地址 led_cs dw 210h ;led 灯片选地址

举例:如右图所示,如果开关0是闭合的,且第一列的电平为0,那么检测到第一行的端口状态就为低电平。如果4是闭合的,第一列的电平为0,那么第二行的端口状态就为0。就是采用此种方法来判定有那个按键被按下了。

扫描方法:先使第0行接低电平,其余行为高电平,然后看第0行是否有键闭合。这是通过检查列线电位来实现的。即在第0行接低电平时,看该列线是否为低电平。 然后依次给第1行,第2行,第3行赋低电平。分别检测该列线是否为低电平。

char db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,67h,77h,7ch,39h,5eh,79h,71h ;显示0-F16个数字的数码管编码

table dw 0fefeh ;

dw 0fefdh

dw 0fefbh

dw 0fef7h dw 0fdfeh dw 0fdfdh dw 0fdfbh dw 0fdf7h dw 0fbfeh dw 0fbfdh dw 0fbfbh dw 0fbf7h dw 0f7feh dw 0f7fdh dw 0f7fbh

dw 0f7f7h data ends code segment

assume cs:code,ds:data

beg: mov ax,data mov ds,ax

mov dx,controlport ;8255 命令口

mov al,10000010h ;设置8255控制字:0方式A 口输出,B 口输入 out dx,al ;输出8255控制字 L1 : call key1 ;判断行线、列线状态 mov bh,ah ;AH =行线状态 mov bl,al ;AL =列线状态 call delay ;延时20-30ms

call key1 ;再次判断行线、列线状态是否与第一次相同 cmp bl,al ;比较al 和bl 的值

jnz beg ;不相等说明此时又有新的按键按下则跳至beg cmp bh,ah ;比较bh ,ah 的值

jnz beg ;不相等则跳至beg

mov ax,bx ;将当前的按键行列值状态赋给ax call disp ;调用程序查表得到按下去键的数码管编码 call delay ;延时20-30ms

jmp L1 ;循环进行将小键盘输出到数码管显示

key1 proc

mov ah,0feh ;从第0行开始 key2: mov al,ah

mov dx,rowport ;8255 A 口作为扫描线

查询是哪行哪列的按键被按下了,0fe 表示第0行,0fd 表示第2

行,0fb 表示第3行,0f7表示第4行

同理也是具体哪一列的表示,4种组合成16个按键的具体位置

out dx,al ;输出一行线为低电平

mov dx,colport ;8255 B口检测线

in al,dx ;输入列线状态

or al,0f0h ;高四位置1,低四位为列线状态;与8行不同只有四行

所以高4行就置位1

cmp al,0ffh ;检查是否有按键按下

jne num1 ;有键按下就会有一位为低电平,退出

rol ah,1 ;没有键按下则检查下一行

jmp key2 ;再来一遍循环检查,直至查到有一个键按下为止num1: ret

key1 endp

delay proc

push cx

mov cx,8000h ;延时去除抖动,去除抖动后

delay1: loop delay1

pop cx

ret

delay endp

disp proc

push bx

push dx

key3: mov si,offset table;位置表的首地址

mov di,offset char;数码管显示编码表的首地址

mov cx,16;16个按键,因而要比较16次

key4: cmp ax,[si];将此时按键的行列状态值与位置表相比较

jz key5;本次查到了对应键的编码值,进行下一步处理

inc si;本次没有查到对应的码值,位置表的位置移动到下一位

inc si;由于是字,加2

inc di;数码管的编码表的值对应加一

loop key4;循环16次,16个按键都要依次的比较

key5: mov al,[di] ;将数码管的显示编码值赋给寄存器al

mov dx,led_cs ;数码管显示段吗地址

out dx,al ;要显示的段码值从该地址输入

mov al,01h ;设置数码管的位选值,是右边第一个

inc dx 从位码地址读入数据;

out dx,al

pop dx

pop bx

ret

disp endp

code ends

end beg

分析实验结果:

将实验代码在“386EX微机实验集成开发环境中”编译生成可执行文件后,在“386EX 微机实验集成开发环境中”全速运行程序后,按动试验箱右下方的小键盘中任意一个数字,在数码管中以十进制的方式显示该数字。例如,在上图中在小键盘上按9,在数码管上则显示9。

实验问题与解决:

本次试验中我采用的是将要编译的程序写成子程序,然后在主程序中调用的形式,这里就存在一个问题,如果同学是按照书上的程序直接在主程序中编写代码,就一定要加上去除抖动的程序处理步骤。我这里要进行两次按键的判断,第一次通过对小键盘行和列的比较确定某一个按键被按下,在延时20-30ms后,再次进行判断小键盘行、列状况是否与第一次相同,相同则进行计算码值的工作。书上是先整体判断键盘上有无按键按下,若有按键按下就延迟20ms来消除抖动,没有按键按下就再次知行次过程直至有键按下为止。如果不加去除抖动的话就要一直按键才能达到显示数码管值的效果。

实验收获与体会:

通过本次实验,我对8255的0方式的设置和运用化有了更进一步的认识。本次实验要求使用8255的0方式、A口输出、B口输入,所以需要把初始化命令设置为10000010。在本次实验中,如何判断一个按键的按下和释放是本次实验的关键点。通过对本次实验代码进行详细的注释,我清楚的了解了本次实验的执行过程和核心问题,让我了解到有一个清晰的解决问题的思路是解决好一个问题的关键。

相关主题
相关文档
最新文档