代码输入器课程设计说明书.docx
《代码输入器课程设计说明书.docx》由会员分享,可在线阅读,更多相关《代码输入器课程设计说明书.docx(23页珍藏版)》请在冰豆网上搜索。
![代码输入器课程设计说明书.docx](https://file1.bdocx.com/fileroot1/2023-4/1/17720bc2-7257-48f5-8525-68bc12ebaeb7/17720bc2-7257-48f5-8525-68bc12ebaeb71.gif)
代码输入器课程设计说明书
微机原理与接口技术
课程设计说明书
代码输入器设计
起止日期:
2012年12月22日至2012年12月28日
学生姓名
班级
学号
成绩
指导教师(签字)
运算机与通信学院
2012年12月28日
课题名称
微机原理与接口技术课程设计
人数
5
组长
同组人员
课
题
的
主
要
内
容
和
要
求
一、设计目的
通过该设计,掌握8255并行接口芯片的使用,普通键盘的设计和数码管的使用,并掌握相应的程序设计和电路设计的技能。
是对8255并行接口芯片章节理论学习的总结和补充,为后续的硬件课程的学习打下基础。
二、设计内容
利用开发板KB-C中的18个按钮中的前16个作为代码键,即代表:
0、1、2、…9、A、B、C、D、E、F,最后2个键,1个为删除键(S24),一个为回车键(S25),实现以下功能:
每按1个键,则在屏幕上显示相应该键代表的字符,按S25键结束输入,每个代码为4个16进制代码组成。
再利用KB-C上的6个数码管中最后面的4个,在输入代码时不在屏幕上显示,而在数码管上显示,即输第1个时,在最后1位显示,输第2个时,前的那个在倒数第2个显示,而刚才输入的那个在最后1位显示,如此等等,4个代码输完后,按S25结束输入,并在屏幕上显示出来。
具体任务
分析课题,汇总,调试,修正程序错误等
时间安排与完成情况
一、时间安排:
1、12月22日:
分组、任务分配、课题理解。
2、6月23日-6月24日:
功能分析、程序设计。
3、6月25日-6月27日:
实验验证和测试。
4、6月28日:
总结、书写实验报告。
二、完成情况:
在大家的共同努力下我们在安排的时间里顺利完成了相应的任务,同时我们也在课程设计过程中学到了很多。
一、基本原理
1、按钮的原理:
在KB-C板上,端口A负责发按键扫描信息,端口C的低3位,即PC0、PC1、PC2,负责接收扫描结果,如下图所示,先定时通过端口A(PA0,PA1,PA2,PA3,PA4,PA5)扫描各按钮,即先PA0=0,其它为1发信号,然后PA1=0,其它为1…,端口发出1个信号后,即读端口C,如果PC0,PC1,PC2全为高电平,说明无按钮按下,如果PC0为低电平(PC1,PC2肯定为高电平),且此时,端口扫描的情况是:
PA0=1,PA1=0,PA2=1,…则说明SW1被按下。
2、数码管显示原理
数码管由8255端口B和端口C联合控制,端口负责控制某个数码管中的那些段码的显示和小数点的显示(PB7)。
端口C的PC4,PC5,PC6发送的信号通过译码后,负责选择6个数码管中的1个显示,即某时刻只有1个数码显示,如果要让几个同时显示,则采用来回扫描显示的方法,且当某个数码管显示时,必须要有一定的延时,约在100ms左右,太短显示不明显(发光不够),太长会产生闪烁。
数码管的控制如下图所示:
键盘对应的ASCII码表
键盘
0
1
2
3
4
5
6
7
8
9
10
ASCII
30H
31H
32H
33H
34H
35H
36H
37H
38H
39H
41H
键盘
11
12
13
14
15
ASCII
42H
43H
44H
45H
46H
键盘对应发光二极管表
键盘
0
1
2
3
4
5
6
7
8
发光二极管
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
键盘
9
10
11
12
13
14
15
发光二极管
67H
77H
7CH
39H
5EH
79H
71H
二、设计步骤
1、程序流程图
1)、程序一流程图:
8255A的初始化
开始始
判断是否有键按下
回车
结束
在屏幕上显示
Y
Y
N
N
流程图说明:
8255初始化后,程序一直扫描键盘,如果没有按键按下则直接继续扫描键盘,如果有按键按下,则判断按键是否是回车键,如果是回车则结束程序,否则显示出按键所对应的十六进制字符到电脑屏幕上。
2)、程序二流程图
回车
在四个发光二极管上显示相应的按键值(按第一个在最右端显示,按第二个第一个左移,第二个在最右端显示)
在屏幕上显示发光二极管上的信息
开始
8255的初始化
扫描键盘
结束
Y
N
程序二流程图说明:
8255初始化后程序开始扫描键盘,如果没有按键按下则继续扫描键盘,如果有按键按下则判断是不是回车键,如果是回车键则把输入的最后四个字符输出到电脑屏幕上显示,如果不是则把数码管和屏幕显示对应的第三位左移到第四位,第二位左移到第三位,第一位左移到第二位,再把新输入进来的存到第一位。
的初始化
1)、程序一:
MOVAL,81H
MOVDX,CON_8255;CON_8255即303H
OUTDX,AL
2)、程序2:
moval,b
movdx,303h
outdx,al
程序一和程序二初始化相同,但是程序一只需要端口A和端口C低三位输入。
而程序二需要端口A和端口C低三位输入和端口B和端口C的第五六七位输出才可以。
根据课程设计要求和上面整个程序的流程图以及我们对程序的分析有下列程序段:
1)、数据段
程序1:
DATASEGMENT
PC_0DB'012345';在屏幕上显示的数据
PC_1DB'6789AB'
PC_2DB'CDEF'
DATAENDS
程序2:
datasegment
pc_0db3fh,06h,5bh,4fh,66h,6dh;发光二极管
pc_1db7dh,07h,7fh,67h,77h,7ch
pc_2db39h,5eh,79h,71h
pcA_0db30h,31h,32h,33h,34h,35h;DOS字符ASCII值
pcA_1db36h,37h,38h,39h,41h,42h
pcA_2db43h,44h,45h,46h
tempdb00h,00h,00h,00h;四个灯的变量
temp1db30h,30h,30h,30h;DOS字符的值
dataends
2)、键盘扫描
两个程序的键盘扫描基本上是一样的:
WAIT1:
MOVAL,0FEH
MOVBH,0D
WAIT2:
MOVDX,300H
OUTDX,AL
MOVBL,AL
MOVDX,302H
INAL,DX
TESTAL,00000001B;测试D0位是否为1
JZPC0
TESTAL,00000010B;测试D1位是否为1
JZPC1
TESTAL,00000100B;测试D2位是否为1
JZPC2
MOVAL,BL
ROLAL,1
INCBH
INCBH
CMPBH,12
JZWAIT1
JMPWAIT2
PC0:
MOVSI,OFFSETPC_0;响应第一排键盘的某个按钮
CALLKEYB_HANDLING
CALLDELAY
JMPWAIT1
PC1:
MOVSI,OFFSETPC_1;响应第二排键盘的某个按钮
CALLKEYB_HANDLING
CALLDELAY
JMPWAIT1
PC2:
MOVSI,OFFSETPC_2;响应第三排键盘的某个按钮
CMPBH,8
JLNEXT1
JNZNEXT
CALLBACKSPACE
JMPWR
3)、屏幕显示
程序1:
KEYB_HANDLINGPROC;键盘响应
MOVBL,BH
MOVBH,00H
MOVAL,[SI+BX]
movdl,al
movah,02h
int21h
CALLDELAY
RET
KEYB_HANDLINGENDP
程序2:
inputproc;输入到显示在屏幕上的值
callshift_e
moval,[si+bx]
movsi,offsettemp1
mov[si],al
ret
inputendp
4)、数码管显示
showproc;显示在发光二极管
pushax
pushbx
movsi,offsettemp
movcx,4
movbx,0
movah,00h
bbb:
moval,ah
movdx,302h
outdx,al
moval,[si+bx]
incbx
movdx,301h
outdx,al
addah,10h
calldelay1
loopbbb
popbx
popax
ret
showendp
5)、数码管数字和电脑屏幕字符的移动
数码管数字移动:
shift_lproc;二极管的灯左移动
pushsi
pushax
pushcx
pushbx
movsi,offsettemp
movcx,3
movbx,2
moval,2
bsss:
movbl,al
movah,[si+bx]
incbx
mov[si+bx],ah
decal
loopbsss
popbx
popcx
popax
popsi
ret
shift_lendp
电脑屏幕字符移动:
shift_eproc;显示在屏幕上的值的移动
pushsi
pushax
pushcx
pushbx
movsi,offsettemp1
movcx,3
movbx,2
moval,2
bsss1:
movbl,al
movah,[si+bx]
incbx
mov[si+bx],ah
decal
loopbsss1
popbx
popcx
popax
popsi
ret
shift_eendp
程序一比较简单,没有花费太多时间就做好了。
程序二其实也不难,只是由于我们不是一个人在设计而是五个组员都在共同工作,开始的时候我们的程序在我们看来没有错,但是运行起来没有看到想要的结果。
经过我们不懈的努力我们终于获得了成功。
最后,程序一和程序二都运行正确,需要提出来的是,程序二有一点点不影响实验结果的问题:
数码显示管某些不应该亮的地方运行时有微弱的灯光,正也是我们到最后也没有解决的问题,需要请教老师。
心得体会:
经过本次微机课题的设计与研究,我们深入的学习了除课本以外的很多微机附件的内容,掌握了很多实验室操作技能。
我们在实际设计中遇到很多问题,但结合所学知识以及参考资料的帮助,不断地尝试,设计了一种能够解决实际问题的系统。
同时也加深了我们对于现实生活中,实际的嵌入式操作系统的原理的理解。
此次微机课程设计让我懂得了实践的重要性。
即使课本知识掌握的很好,如果不会综合运用,也是一些支离破碎的无用的知识,而如果能够运用而实际动手能力很差,理论与实践结合不起来,学得再好也没用。
这次课程设计恰好是将课本知识与的巩固与综合运用结合起来,再加上实际动手能力的培养三者结合起来的。
一方面,它加深与巩固了所学的各章节的理论,并将其综合运用,提高了我们综合运用知识的能力;另一方面,培养了我们对专业知识学习的趣。
总之,在这一过程中,我们充分发挥我们的主观能动性,想象创造性,攻克了很多之前都没有想过的难关,真的受益匪浅。
这次设计不仅仅耗时耗力,而且还要整天对着电脑进行仿真且不停的调试、修改,这次课程设计对我们理论和实验都有很大的提升,我想这些对于我们今后的学习生活都有很重要的意义,这将是我们在程序设计以及大学学习过程中的宝贵经验和财富。
附件
程序源代码:
1)程序一:
只在屏幕上显示
DATASEGMENT
A_8255EQU300H
B_8255EQU301H
C_8255EQU302H
CON_8255EQU303H
PC_0DB'012345'
PC_1DB'6789AB'
PC_2DB'CDEF'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,81H
MOVDX,CON_8255
OUTDX,AL
MOVAL,00H
MOVDX,C_8255
OUTDX,AL
WAIT1:
MOVAL,0FEH
MOVBH,0d
WAIT2:
MOVDX,A_8255
OUTDX,AL
MOVBL,AL
MOVDX,C_8255
INAL,DX
TESTAL,00000001B
JZPC0
TESTAL,00000010B
JZPC1
TESTAL,00000100B
JZPC2
MOVAL,BL
ROLAL,1
INCBH
incbh
CMPBH,12
JZWAIT1
JMPWAIT2
PC0:
MOVSI,OFFSETPC_0
CALLKEYB_HANDLING
CALLDELAY
JMPWAIT1
PC1:
MOVSI,OFFSETPC_1
CALLKEYB_HANDLING
CALLDELAY
JMPWAIT1
PC2:
MOVSI,OFFSETPC_2
CMPBH,8
JLNEXT1
JNZNEXT
CALLBACKSPACE
JMPWR
NEXT:
CMPBH,10
JNZWR
CALLENTER
JMPWR
NEXT1:
CALLKEYB_HANDLING
WR:
CALLDELAY
JMPWAIT1
KEYB_HANDLINGPROC
MOVBL,BH
MOVBH,00H
MOVAL,[SI+BX]
MOVDL,AL
MOVAH,02H
INT21H
CALLDELAY
RET
KEYB_HANDLINGENDP
ENTERPROC
JMPEXIT
ENTERENDP
BACKSPACEPROC
MOVAL,00H
MOVDX,B_8255
OUTDX,AL
RET
BACKSPACEENDP
DELAYPROC
MOVCX,0D
AA1:
MOVBX,8000D
AA2:
DECBX
JNZAA2
LOOPAA1
RET
DELAYENDP
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2)程序二:
在数码管上显示
datasegment
pc_0db3fh,06h,5bh,4fh,66h,6dh;发光二极管
pc_1db7dh,07h,7fh,67h,77h,7ch
pc_2db39h,5eh,79h,71h
pcA_0db30h,31h,32h,33h,34h,35h;DOS字符ASCII值
pcA_1db36h,37h,38h,39h,41h,42h
pcA_2db43h,44h,45h,46h
tempdb00h,00h,00h,00h;四个灯的变量
temp1db30h,30h,30h,30h;DOS字符的值
dataends
codesegment
assumecs:
code,ds:
data
beg:
movax,data
movds,ax
moval,b
movdx,303h
outdx,al
moval,00h
movdx,302h
outdx,al
f1:
moval,0feh;键盘扫描开始
movbh,00h
f2:
movdx,300h
outdx,al
movbl,al
callshow
movdx,302h
inal,dx
testal,00000001b
jzpc0
testal,00000010b
jzpc1
testal,00000100b
jzpc2
moval,bl
rolal,1
incbh
cmpbh,6h
jzf1
jmpf2
pc0:
movsi,offsetpc_0;第一排键盘
callkey_press
movsi,offsetpcA_0
callinput
calldelay
jmpf1
pc1:
movsi,offsetpc_1;第二排键盘
callkey_press
movsi,offsetpcA_1
callinput
calldelay
jmpf1
pc2:
movsi,offsetpc_2;第三排键盘
cmpbh,04h
jlnext1
jnznext
jmpwr
next:
cmpbh,05h;第17键盘
jnzwr
callenter
jmpwr
next1:
callkey_press
movsi,offsetpcA_2
callinput
wr:
calldelay
jmpf1
key_pressproc;键盘按下
movbl,bh
movbh,00h
callshift_l
moval,00h
movdx,302h
outdx,al
moval,[si+bx]
movdx,301h
outdx,al
movsi,offsettemp
mov[si],al
ret
key_pressendp
enterproc;回车盘
movsi,offsettemp1
movcx,4
movbx,3
bb1:
movdl,[si+bx]
decbx
movah,02h
int21h
loopbb1
jmpexit
enterendp
inputproc;输入到显示在屏幕上的值
callshift_e
moval,[si+bx]
movsi,offsettemp1
mov[si],al
ret
inputendp
showproc;显示在发光二极管
pushax
pushbx
movsi,offsettemp
movcx,4
movbx,0
movah,00h
bbb:
moval,ah
movdx,302h
outdx,al
moval,[si+bx]
incbx
movdx,301h
outdx,al
addah,10h
calldelay1
loopbbb
popbx
popax
ret
showendp
shift_lproc;二极管的灯左移动
pushsi
pushax
pushcx
pushbx
movsi,offsettemp
movcx,3
movbx,2
moval,2
bsss:
movbl,al
movah,[si+bx]
incbx
mov[si+bx],ah
decal
loopbsss
popbx
popcx
popax
popsi
ret
shift_lendp
delayproc;按键延时
pushax
pushbx
pushcx
movcx,0
dela:
movbx,2000
dela1:
decbx
jnzdela1
loopdela
popcx
popbx
popax
ret
delayendp
delay1proc;灯光延时
pushax
pushbx
pushcx
movcx,10000
dela0:
movbx,500
dela10:
decbx
jnzdela10
loopdela0
popcx
popbx
popax
ret
delay1endp
shift_eproc;显示在屏幕上的值的移动
pushsi
pushax
pushcx
pushbx
movsi,offsettemp1
movcx,3
movbx,2
moval,2
bsss1:
movbl,al
movah,[si+bx]
incbx
mov[si+bx],ah
decal
loopbsss1
popbx
popcx
popax
popsi
ret
shift_eendp
exit:
movah,4ch;退出返回到dos界面
int21h
codeends
endbeg