小键盘按键识别微机原理课程设计.docx

上传人:b****8 文档编号:12912052 上传时间:2023-06-09 格式:DOCX 页数:14 大小:83.24KB
下载 相关 举报
小键盘按键识别微机原理课程设计.docx_第1页
第1页 / 共14页
小键盘按键识别微机原理课程设计.docx_第2页
第2页 / 共14页
小键盘按键识别微机原理课程设计.docx_第3页
第3页 / 共14页
小键盘按键识别微机原理课程设计.docx_第4页
第4页 / 共14页
小键盘按键识别微机原理课程设计.docx_第5页
第5页 / 共14页
小键盘按键识别微机原理课程设计.docx_第6页
第6页 / 共14页
小键盘按键识别微机原理课程设计.docx_第7页
第7页 / 共14页
小键盘按键识别微机原理课程设计.docx_第8页
第8页 / 共14页
小键盘按键识别微机原理课程设计.docx_第9页
第9页 / 共14页
小键盘按键识别微机原理课程设计.docx_第10页
第10页 / 共14页
小键盘按键识别微机原理课程设计.docx_第11页
第11页 / 共14页
小键盘按键识别微机原理课程设计.docx_第12页
第12页 / 共14页
小键盘按键识别微机原理课程设计.docx_第13页
第13页 / 共14页
小键盘按键识别微机原理课程设计.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

小键盘按键识别微机原理课程设计.docx

《小键盘按键识别微机原理课程设计.docx》由会员分享,可在线阅读,更多相关《小键盘按键识别微机原理课程设计.docx(14页珍藏版)》请在冰点文库上搜索。

小键盘按键识别微机原理课程设计.docx

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

 

微机原理与接口技术

课程设计报告

 

专业:

班级:

姓名:

学号:

 

指导教师评语:

 

成绩:

签名:

年月日

小键盘按键识别

一.课题任务与要求

实验箱上有一个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,B

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,B

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,B

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,B

JEKEY9

MOVAL,0AH

RET

KEY8:

MOVAL,8

RET

KEY9:

MOVAL,9

RET

LIE1:

CMPHANG,01111111B

JEKEY0

CMPHANG,B

JEKEY1

CMPHANG,B

JEKEY2

CMPHANG,B

JEKEY3

CMPHANG,B

JEKEY4

CMPHANG,B

JEKEY5

CMPHANG,B

JEKEY6

CMPHANG,B

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.通过此次程序设计,我对计算机读取键盘值的过程有了一定的认识。

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

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

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

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

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

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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2