1、1微机原理与接口技术课程设计报告专 业: 班 级: 姓 名: 学 号: 指导教师评语:成绩: 签名: 年 月 日2小键盘按键识别一 课题任务与要求实验箱上有一个 24 键小键盘,出厂时按键接点已经按图所示连接。小键盘有 8 根横向引出线。实验前将 8 根横向引出线与 PA0PA7 相连,3 根纵向引出线与 PB0PB2 相连,再从“I/O 口地址译码器”选择一个译码器输出连接到 8255 的片选端,做好上述连接之后,就构成了以 8255 为核心的键盘输入电路要求:在实际的自动控制系统中,键盘输入电路的作用是输入数据(09,AF)或者输入控制信号(G,M,P,R,W,X,Y,S) 。实现上述功能
2、的核心程序是“按键识别” 。本实验要求设计按键识别程序,当按下小键盘上某一个键的时候,主机屏幕显示闭合键的键名,按下小键盘“R”键之后停止演示。二完成任务的方法或方案简介本程序显示数字 0 到 9,刚刚开始提出两中解决方案一是用跳转法直接显示数值,二是用查找法间接显示数值,本程序是用第一种方案,虽然程序多了些,但直观容易理解,故采纳第一种方案。DISPLAY 函数用来将 BUFFER 中的键值显示在数码管上。设定 A 口方式 0 输出,B 口方式 0 输入。GETINPUT 函数通过行值和列值查出输入的键值,并将它保存在 AL 中,如果输入是 R,则 AL 赋值为 FFH;如果输入非法字符,则
3、 AL 赋值为 0AH。设定如果是 R 则退出程序.CHANGE 函数用来改变 BUFFER 中保存的键值,将 BUFFER 中的键值移位,最后一位加入 AL 中的新键值。CLOSEALL 此函数用在退出程序时将数码管关闭.以上是主题函数,在设计过程中还碰到了一些细节问题,例数码管的显示才用延迟 20MS的办法解决,具体方案在 DISPLAY 函数中。3三实现系统1、程序框图:预置:A 口为方式 0 输出B 口为方式 0 输入0 PA7-PA0PB2-PB0 AHAH=7?延时 20ms预置:B 口为方式 0 输出A 口为方式 0 输入列值 PB2-PB0PA7-PA0 AL根据 AX 内容,
4、查找键值表,显示相应的键值。是 R?结束演示2、实验电路图:43、8255 方式选择控制字1 D6 D5 D4 D3 D2 D1 D04、源程序:TITLE LITTLEKEYBOARDSSEG SEGMENT PARA STACK STACK方式选择控制字标志A 组方式:00方式 001方式 11X方式 2A 口 IO1输入0输出C 上半口 IO:1输入0输出B 组方式:0方式 01方式 1B 口IO:1输入0输出C 下半口 IO:1=输入0输出 5DB 256 DUP (0)SSEG ENDSDSEG SEGMENTA_8255 EQU 210HB_8255 EQU 211HCON_825
5、5 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:SSEG START PROC NEARMOV AX,DSEGMOV DS,AXCALL CLOSEALL(关掉数码管,防止因为最初数码管有显示而使程序执行不正常。)CMPAGAIN:CALL DISPLAY(DISPLAY 函数用来将 BUFFER 中的键值显示在数码
6、管上。)MOV DX,CON_8255MOV AL,10000010BOUT DX,AL(设定 A 口方式 0 输出,B 口方式 0 输入)AGAIN:CALL DISPLAYMOV DX,A_82556MOV AL,0OUT DX,AL (0PA7-PA0)MOV DX,B_8255IN AL,DXAND AL,00000111B (取出 PB0PB2CMP AL,00000111BJE AGAINMOV LIE,AL(将列值保存)CALL DELAY1(延时 20ms)MOV DX,CON_8255MOV AL,10010000BOUT DX,AL(预置 A 口方式 0 输入,B 口方式
7、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 CHANGE7(CHANGE 函数用来改变 BUFFER 中保存的键值)MOV DX,CO
8、N_8255MOV AL,10000010BOUT DX,AL(设定 A 口方式 0 输出,B 口方式 0 输入)LLL:CALL DISPLAYMOV DX,B_8255IN AL,DXAND AL,00000111B (取出 PB0PB2)CMP AL,00000111BJNE LLLJMP CMPAGAIN(不断扫描,如果不松开按键,那么就循环等待;直到按键松开就跳回。)RETSTART ENDP;*(此函数用以延时 20MS)DELAY1 PROC NEARPUSH AXPUSH CXPUSH DXMOV AH,86HMOV CX,0MOV DX,20000INT 15HPOP DXP
9、OP CXPOP AX8RETDELAY1 ENDP;*(GETINPUT 函数通过行值和列值查出输入的键值,并将它保存在 AL 中,如果输入是 R,则 AL 赋值为 FFH;如果输入非法字符,则 AL 赋值为 0AH。 )GETINPUT PROC NEARCMP LIE,00000110BJE LIE0CMP LIE,00000101BJE LIE1CMP LIE,00000011BJE LIE2MOV AL,0AHRETLIE2:CMP HANG,00010000BJE NEXTMOV AL,0AHRETNEXT:MOV AL,0FFHRETLIE0:CMP HANG,01111111B
10、JE KEY8CMP HANG,10111111BJE KEY9MOV AL,0AHRETKEY8:MOV AL,8RETKEY9:MOV AL,9RET9LIE1:CMP HANG,01111111BJE KEY0CMP HANG,10111111BJE KEY1CMP HANG,11011111BJE KEY2CMP HANG,11101111BJE KEY3CMP HANG,11110111BJE KEY4CMP HANG,11111011BJE KEY5CMP HANG,11111101BJE KEY6CMP HANG,11111110BJE KEY7MOV AL,0AHRETKEY0
11、:MOV AL,0RETKEY1:MOV AL,1RETKEY2:MOV AL,2RETKEY3:MOV AL,3RETKEY4:MOV AL,4RETKEY5:MOV AL,5RET10KEY6:MOV AL,6RETKEY7:MOV AL,7RETGETINPUT ENDP;*(CHANGE 函数用来改变 BUFFER 中保存的键值,将 BUFFER 中的键值移位,最后一位加入 AL 中的新键值。)CHANGE PROC NEARPUSH AXPUSH SIMOV SI,OFFSET BUFFERMOV AH,SI+1MOV SI,AHMOV AH,SI+2MOV SI+1,AHMOV A
12、H,SI+3MOV SI+2,AHMOV AH,SI+4MOV SI+3,AHMOV AH,SI+5MOV SI+4,AHMOV SI+5,ALPOP SIPOP AXRETCHANGE ENDP;*(DISPLAY 函数用来将 BUFFER 中的键值显示在数码管上。)DISPLAY PROC NEAR11PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIMOV BX,OFFSET TABLEMOV SI,OFFSET BUFFERMOV CL,1XUNHUAN: MOV AL,SIXLATMOV DX,201HOUT DX,ALMOV DX,200HMOV AL,CLOU
13、T DX,ALMOV DX,200HMOV AL,0OUT DX,ALINC SISHL CL,1CMP CL,40HJNE XUNHUANPOP SIPOP DXPOP CXPOP BXPOP AXRETDISPLAY ENDP12;*(此函数用在退出程序时将数码管关闭.)CLOSEALL PROC NEARPUSH AXPUSH CXPUSH DXMOV CL,1XUNHUAN1:MOV DX,200HMOV AL,CLOUT DX,ALMOV AL,0OUT DX,ALSHL CL,1CMP CL,20HJNE XUNHUAN1POP DXPOP CXPOP AXRETCLOSEALL
14、ENDPCSEG ENDEND START四、程序运行结果分析:六实验总结:1实验电路板上 8255 的端口地址位 210H213H ,这与书上给的不一样,开始时在这方面花费了较多时间。2通过此次程序设计,我对计算机读取键盘值的过程有了一定的认识。最开始编程序时并没有想到如果始终按同一个键不放,数码管上就会一下子出来很多字符。调试时发现13了这个问题,想到的解决方法有两种,一种是每一次按键后检测键是否松开,直到松开后再继续执行下一次判断;另一种是按键后延缓一个固定的时间(大约 0.2 秒)再判断(计算机的键盘就是采取这样的方法) 。 本程序采用的是第一种方法。3编程序要养成好的习惯,我最初的程序结束时并没有关掉数码管,以致下次用时数码管显示不正确。好的程序应该各方面想得周到一些,例如我后来在开始和结束时都加了关闭数码管程序(CLOSEALL) ,这就避免了上述问题。4我并没有采用查表得方法来获得键值,我觉得用跳转的方法能使程序的可读性强一些。当然,程序代码会长许多,但此法由于思路清楚,比较容易查错。