小键盘按键识别微机原理课程设计.docx
- 文档编号:2960256
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:13
- 大小:95.50KB
小键盘按键识别微机原理课程设计.docx
《小键盘按键识别微机原理课程设计.docx》由会员分享,可在线阅读,更多相关《小键盘按键识别微机原理课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
小键盘按键识别微机原理课程设计
微机原理与接口技术
课程设计报告
专业:
班级:
姓名:
学号:
指导教师评语:
成绩:
签名:
年月日
小键盘按键识别
一.课题任务与要求
实验箱上有一个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方式选择控制字
1
D6
D5
D4
D3
D2
D1
D0
4、源程序:
TITLELITTLEKEYBOARD
SSEGSEGMENTPARASTACK'STACK'
DB256DUP(0)
SSEGENDS
DSEGSEGMENT
A_8255EQU210H
B_8255EQU211H
CON_8255EQU213H
BUFFERDB6DUP(0)
HANGDB?
LIEDB?
NEWHANGDB?
NEWLIEDB?
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG,SS:
SSEG
STARTPROCNEAR
MOVAX,DSEG
MOVDS,AX
CALLCLOSEALL
(关掉数码管,防止因为最初数码管有显示而使程序执行不正常。
)
CMPAGAIN:
CALLDISPLAY
(DISPLAY函数用来将BUFFER中的键值显示在数码管上。
)
MOVDX,CON_8255
MOVAL,10000010B
OUTDX,AL
(设定A口方式0输出,B口方式0输入)
AGAIN:
CALLDISPLAY
MOVDX,A_8255
MOVAL,0
OUTDX,AL(0->PA7---PA0)
MOVDX,B_8255
INAL,DX
ANDAL,00000111B(取出PB0-PB2
CMPAL,00000111B
JEAGAIN
MOVLIE,AL(将列值保存)
CALLDELAY1(延时20ms)
MOVDX,CON_8255
MOVAL,10010000B
OUTDX,AL
(预置A口方式0输入,B口方式0输入)
MOVDX,A_8255
INAL,DX
MOVHANG,AL(将行值保存)
CALLGETINPUT
(GETINPUT函数通过行值和列值查出输入的键值,并将它保存在AL中,如果输入是R,则AL赋值为FFH;如果输入非法字符,则AL赋值为0AH。
)
CMPAL,0AH
JECMPAGAIN
(如果是非法字符则跳回)
CMPAL,0FFH
JNECONTINUE
(如果是R则退出程序.)
CALLCLOSEALL
MOVAH,4CH
INT21H
CONTINUE:
CALLCHANGE
(CHANGE函数用来改变BUFFER中保存的键值)
MOVDX,CON_8255
MOVAL,10000010B
OUTDX,AL
(设定A口方式0输出,B口方式0输入)
LLL:
CALLDISPLAY
MOVDX,B_8255
INAL,DX
ANDAL,00000111B
(取出PB0-PB2)
CMPAL,00000111B
JNELLL
JMPCMPAGAIN
(不断扫描,如果不松开按键,那么就循环等待;直到按键松开就跳回。
)
RET
STARTENDP
;*********************************
(此函数用以延时20MS)
DELAY1PROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVAH,86H
MOVCX,0
MOVDX,20000
INT15H
POPDX
POPCX
POPAX
RET
DELAY1ENDP
;********************************
(GETINPUT函数通过行值和列值查出输入的键值,并将它保存在AL中,如果输入是R,则AL赋值为FFH;如果输入非法字符,则AL赋值为0AH。
)
GETINPUTPROCNEAR
CMPLIE,00000110B
JELIE0
CMPLIE,00000101B
JELIE1
CMPLIE,00000011B
JELIE2
MOVAL,0AH
RET
LIE2:
CMPHANG,00010000B
JENEXT
MOVAL,0AH
RET
NEXT:
MOVAL,0FFH
RET
LIE0:
CMPHANG,01111111B
JEKEY8
CMPHANG,10111111B
JEKEY9
MOVAL,0AH
RET
KEY8:
MOVAL,8
RET
KEY9:
MOVAL,9
RET
LIE1:
CMPHANG,01111111B
JEKEY0
CMPHANG,10111111B
JEKEY1
CMPHANG,11011111B
JEKEY2
CMPHANG,11101111B
JEKEY3
CMPHANG,11110111B
JEKEY4
CMPHANG,11111011B
JEKEY5
CMPHANG,11111101B
JEKEY6
CMPHANG,11111110B
JEKEY7
MOVAL,0AH
RET
KEY0:
MOVAL,0
RET
KEY1:
MOVAL,1
RET
KEY2:
MOVAL,2
RET
KEY3:
MOVAL,3
RET
KEY4:
MOVAL,4
RET
KEY5:
MOVAL,5
RET
KEY6:
MOVAL,6
RET
KEY7:
MOVAL,7
RET
GETINPUTENDP
;**********************************
(CHANGE函数用来改变BUFFER中保存的键值,将BUFFER中的键值移位,最后一位加入AL中的新键值。
)
CHANGEPROCNEAR
PUSHAX
PUSHSI
MOVSI,OFFSETBUFFER
MOVAH,[SI+1]
MOV[SI],AH
MOVAH,[SI+2]
MOV[SI+1],AH
MOVAH,[SI+3]
MOV[SI+2],AH
MOVAH,[SI+4]
MOV[SI+3],AH
MOVAH,[SI+5]
MOV[SI+4],AH
MOV[SI+5],AL
POPSI
POPAX
RET
CHANGEENDP
;**********************************
(DISPLAY函数用来将BUFFER中的键值显示在数码管上。
)
DISPLAYPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
MOVBX,OFFSETTABLE
MOVSI,OFFSETBUFFER
MOVCL,1
XUNHUAN:
MOVAL,[SI]
XLAT
MOVDX,201H
OUTDX,AL
MOVDX,200H
MOVAL,CL
OUTDX,AL
MOVDX,200H
MOVAL,0
OUTDX,AL
INCSI
SHLCL,1
CMPCL,40H
JNEXUNHUAN
POPSI
POPDX
POPCX
POPBX
POPAX
RET
DISPLAYENDP
;*********************************
(此函数用在退出程序时将数码管关闭.)
CLOSEALLPROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVCL,1
XUNHUAN1:
MOVDX,200H
MOVAL,CL
OUTDX,AL
MOVAL,0
OUTDX,AL
SHLCL,1
CMPCL,20H
JNEXUNHUAN1
POPDX
POPCX
POPAX
RET
CLOSEALLENDP
CSEGEND
ENDSTART
四、程序运行结果分析:
六.实验总结:
1.实验电路板上8255的端口地址位210H-213H,这与书上给的不一样,开始时在这方面花费了较多时间。
2.通过此次程序设计,我对计算机读取键盘值的过程有了一定的认识。
最开始编程序时并没有想到如果始终按同一个键不放,数码管上就会一下子出来很多字符。
调试时发现了这个问题,想到的解决方法有两种,一种是每一次按键后检测键是否松开,直到松开后再继续执行下一次判断;另一种是按键后延缓一个固定的时间(大约0.2秒)再判断(计算机的键盘就是采取这样的方法)。
本程序采用的是第一种方法。
3.编程序要养成好的习惯,我最初的程序结束时并没有关掉数码管,以致下次用时数码管显示不正确。
好的程序应该各方面想得周到一些,例如我后来在开始和结束时都加了关闭数码管程序(CLOSEALL),这就避免了上述问题。
4.我并没有采用查表得方法来获得键值,我觉得用跳转的方法能使程序的可读性强一些。
当然,程序代码会长许多,但此法由于思路清楚,比较容易查错。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小键盘 按键 识别 微机 原理 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)