当前位置:文档之家› 小键盘按键识别(微机原理课程设计)

小键盘按键识别(微机原理课程设计)

微机原理与接口技术课程设计报告专业:班级:姓名:学号:小键盘按键识别一.课题任务与要求实验箱上有一个24键小键盘,出厂时按键接点已经按图所示连接。

小键盘有8根横向引出线。

实验前将8根横向引出线与PA0~PA7相连,3根纵向引出线与PB0~PB2相连,再从“I/O口地址译码器”选择一个译码器输出连接到8255的片选端,做好上述连接之后,就构成了以8255为核心的键盘输入电路要求:在实际的自动控制系统中,键盘输入电路的作用是输入数据(0~9,A~F)或者输入控制信号(G,M,P,R,W,X,Y,S)。

实现上述功能的核心程序是“按键识别”。

本实验要求设计按键识别程序,当按下小键盘上某一个键的时候,主机屏幕显示闭合键的键名,按下小键盘“R”键之后停止演示。

二.完成任务的方法或方案简介本程序显示数字0到9,刚刚开始提出两中解决方案一是用跳转法直接显示数值,二是用查找法间接显示数值,本程序是用第一种方案,虽然程序多了些,但直观容易理解,故采纳第一种方案。

DISPLAY函数用来将BUFFER中的键值显示在数码管上。

设定A口方式0输出,B口方式0输入。

GETINPUT函数通过行值和列值查出输入的键值,并将它保存在AL中,如果输入是R,则AL赋值为FFH;如果输入非法字符,则AL赋值为0AH。

设定如果是R则退出程序.CHANGE函数用来改变BUFFER中保存的键值,将BUFFER中的键值移位,最后一位加入AL中的新键值。

CLOSEALL此函数用在退出程序时将数码管关闭.以上是主题函数,在设计过程中还碰到了一些细节问题,例数码管的显示才用延迟20MS的办法解决,具体方案在DISPLAY函数中。

三.实现系统1、程序框图:2、实验电路图:3、8255方式选择控制字1D6D5D4D3 D2 D1 D04、源程序:TITLE LITTLEKEYBOARDSSEG SEGMENT PARA STACK 'STACK' DB 256 DUP (0)SSEG ENDSDSEG SEGMENTA_8255 EQU 210HB_8255 EQU 211HCON_8255 EQU 213HBUFFER DB 6 DUP(0)HANG DB ?LIE DB ?NEWHANG DB ?NEWLIE DB ?TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,DSEG ENDSCSEG SEGMENTASSUME CS:CSEG, DS:DSEG,SS:SSEGSTART PROC NEARMOV AX,DSEGMOV DS,AXCALL CLOSEALL(关掉数码管,防止因为最初数码管有显示而使程序执行不正常。

) CMPAGAIN:CALL DISPLAY(DISPLAY函数用来将BUFFER中的键值显示在数码管上。

)MOV DX,CON_8255MOV AL,10000010BOUT DX,AL(设定A口方式0输出,B口方式0输入)AGAIN:CALL DISPLAYMOV DX,A_8255MOV AL,0OUT DX,AL (0->PA7---PA0)MOV DX,B_8255IN AL,DXAND AL,00000111B (取出PB0-PB2CMP AL,00000111BJE AGAINMOV LIE,AL(将列值保存)CALL DELAY1(延时20ms)MOV DX,CON_8255MOV AL,10010000BOUT DX,AL(预置A口方式0输入,B口方式0输入)MOV DX,A_8255IN AL,DXMOV HANG,AL(将行值保存)CALL GETINPUT(GETINPUT函数通过行值和列值查出输入的键值,并将它保存在AL中,如果输入是R,则AL赋值为FFH;如果输入非法字符,则AL赋值为0AH。

)CMP AL,0AHJE CMPAGAIN(如果是非法字符则跳回)CMP AL,0FFHJNE CONTINUE(如果是R则退出程序.)CALL CLOSEALLMOV AH,4CHINT 21HCONTINUE:CALL CHANGE(CHANGE函数用来改变BUFFER中保存的键值)MOV DX,CON_8255MOV AL,10000010BOUT DX,AL(设定A口方式0输出,B口方式0输入)LLL:CALL DISPLAYMOV DX,B_8255IN AL,DXAND AL,00000111B(取出PB0-PB2)CMP AL,00000111BJNE LLLJMP CMPAGAIN(不断扫描,如果不松开按键,那么就循环等待;直到按键松开就跳回。

) RETSTART ENDP;*********************************(此函数用以延时20MS)DELAY1 PROC NEARPUSH AXPUSH CXPUSH DXMOV AH,86HMOV CX,0MOV DX,20000INT 15HPOP DXPOP CXPOP AXRETDELAY1 ENDP;********************************(GETINPUT函数通过行值和列值查出输入的键值,并将它保存在AL中,如果输入是R,则AL赋值为FFH;如果输入非法字符,则AL赋值为0AH。

)GETINPUT PROC NEAR CMP LIE,00000110BJE LIE0CMP LIE,00000101BJE LIE1CMP LIE,00000011BJE LIE2MOV AL,0AHRETLIE2:CMP HANG,00010000B JE NEXTMOV AL,0AHRETNEXT:MOV AL,0FFHRETLIE0:CMP HANG,01111111B JE KEY8CMP HANG,10111111BJE KEY9MOV AL,0AHRETKEY8:MOV AL,8RETKEY9:MOV AL,9RETLIE1:CMP HANG,01111111B JE KEY0CMP HANG,10111111BJE KEY1CMP HANG,11011111BJE KEY2CMP HANG,11101111BJE KEY3CMP HANG,11110111BJE KEY4CMP HANG,11111011B JE KEY5CMP HANG,11111101B JE KEY6CMP HANG,11111110B JE KEY7MOV AL,0AHRETKEY0:MOV AL,0RETKEY1:MOV AL,1RETKEY2:MOV AL,2RETKEY3:MOV AL,3RETKEY4:MOV AL,4RETKEY5:MOV AL,5RETKEY6:MOV AL,6RETKEY7:MOV AL,7RETGETINPUT ENDP;**********************************(CHANGE函数用来改变BUFFER中保存的键值,将BUFFER中的键值移位,最后一位加入AL中的新键值。

)CHANGE PROC NEARPUSH AXPUSH SIMOV SI,OFFSET BUFFERMOV AH,[SI+1]MOV [SI],AHMOV AH,[SI+2]MOV [SI+1],AHMOV AH,[SI+3]MOV [SI+2],AHMOV AH,[SI+4]MOV [SI+3],AHMOV AH,[SI+5]MOV [SI+4],AHMOV [SI+5],ALPOP SIPOP AXRETCHANGE ENDP;**********************************(DISPLAY函数用来将BUFFER中的键值显示在数码管上。

) DISPLAY PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIMOV BX,OFFSET TABLE MOV SI,OFFSET BUFFER MOV CL,1 XUNHUAN:MOV AL,[SI]XLATMOV DX,201HOUT DX,ALMOV DX,200HMOV AL,CLOUT DX,ALMOV DX,200HMOV AL,0OUT DX,ALINC SISHL CL,1CMP CL,40HJNE XUNHUANPOP SIPOP DXPOP CXPOP BXPOP AXRETDISPLAY ENDP;********************************* (此函数用在退出程序时将数码管关闭.)CLOSEALL PROC NEARPUSH AXPUSH CX PUSH DXMOV CL,1 XUNHUAN1: MOV DX,200H MOV AL,CL OUT DX,AL MOV AL,0OUT DX,AL SHL CL,1 CMP CL,20H JNE XUNHUAN1 POP DXPOP CXPOP AXRET CLOSEALL ENDPCSEG ENDEND START四、程序运行结果分析:六.实验总结:1.实验电路板上8255的端口地址位210H-213H,这与书上给的不一样,开始时在这方面花费了较多时间。

2.通过此次程序设计,我对计算机读取键盘值的过程有了一定的认识。

最开始编程序时并没有想到如果始终按同一个键不放,数码管上就会一下子出来很多字符。

调试时发现了这个问题,想到的解决方法有两种,一种是每一次按键后检测键是否松开,直到松开后再继续执行下一次判断;另一种是按键后延缓一个固定的时间(大约0.2秒)再判断(计算机的键盘就是采取这样的方法)。

本程序采用的是第一种方法。

3.编程序要养成好的习惯,我最初的程序结束时并没有关掉数码管,以致下次用时数码管显示不正确。

好的程序应该各方面想得周到一些,例如我后来在开始和结束时都加了关闭数码管程序(CLOSEALL),这就避免了上述问题。

4.我并没有采用查表得方法来获得键值,我觉得用跳转的方法能使程序的可读性强一些。

当然,程序代码会长许多,但此法由于思路清楚,比较容易查错。

相关主题