微机课设报告Word文档格式.docx
- 文档编号:21798107
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:38
- 大小:28.66KB
微机课设报告Word文档格式.docx
《微机课设报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《微机课设报告Word文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
将键盘中的各行与A口中PA0~PA3相连,A口为输出;
将键盘中的各列与B口中PB0~PB3相连,B口为输入口。
由行与列显示的结果可以唯一确定一个键盘号。
将此键盘号定义的数值存储到存储器中,判断用户所有输入完成后,便将存储的数值取出并进行计算,判断运算符的不同跳转入不同运算中,其中对输入有误或不符合输入限制的键盘号,计算器将显示错误并初始化。
最后将计算结果显示在数码管上,并初始化计算器。
2.方案二
我们在参考实验指导书的8279键盘/LED控制器、键盘/LED电路后,发现可以直接使用8279芯片进行实验电路的组建,但是由于8279在之前并没有学习过,所以我们需要在网上进行搜索学习,使用8279芯片设计思路如下:
利用8279芯片连线比较简单,因为8279芯片内部已经与8086、键盘、LED显示数码管进行了连接,所以只需要在外部将排线、片选、时钟、地址线等连接即可。
8279芯片提供了扫描试键盘输入,并且有具有接点消除抖动,2键锁定及N键依此读出模式,只需对其控制字进行写操作即可。
对芯片的FIFORAM进行读操作即可得到按键的行号与列号,以此确定键盘上键盘号。
之后将此键盘号定义的数值存储到存储器中,判断用户所有输入完成后,便将存储的数值取出并进行计算,判断运算符的不同跳转入不同运算中,其中对输入有误或不符合输入限制的键盘号,计算器将显示错误并初始化。
3.方案讨论
我们比较了以上两种方案并与实际电路逻辑箱进行对照发现,使用方案一的8255并行接口芯片时不但连线复杂,而且也需要用到8279芯片,而且一片8255芯片无法满足16键键盘的需要,于是我们选择了连线简单,但需要学习8279芯片的方案二。
硬件设计
4.硬件电路设计图
参看附录:
电路线路图
5.各部分电路分析
8279键盘/LED控制器、键盘/LED电路:
将4*4的矩阵键盘与程序中定义的符号进行联系,使键盘号有与之对应的符号意义。
并将LED显示电路与软件进行联系使显示电路能按照程序要求进行显示。
以下是4*4键盘对应键盘号图:
7
8
9
+
4
5
6
-
1
2
3
*
AC
=
/
以下是电路线路图中行列号与键盘号对应关系:
11
21
31
41
51
61
71
81
12
22
32
42
52
62
72
82
时序分析:
首先,在第一个数字输入时,用8279对键盘进行扫描,将数据送入8088进行备用处理,如果是数字则在数码管上显示出来所输入的数字,如果是加、减、乘、除运算符,则将数码管前三位已经显示的数据抹去,等待下一次键盘输入,在第二个数字输入时,如果是等号则8279向数码管显示结果。
其中每次输入时都会判断是否是复位键,若是则初始化计算器并清空数码管。
在输入数字超过三位,或者输入不符合格式时,将显示错误指示“-EEEE-”。
二、软件设计
1.主程序
START:
MOVAX,@DATA
MOVDS,AX
MOVES,AX
MOVDX,Z8279
MOVAL,34H
OUTDX,AL
MOVAL,LEDMOD
OUTDX,AL
;
---------------------------------------------------------
MOVDX,Z8279;
清FIFORAM寄存器
MOVAL,0DEH
KAISHI:
MOVSI,OFFSETDATA1
MOVCX,16
Q1:
MOVBYTEPTR[SI],10H;
数据区清零
INCSI
LOOPQ1
XORAX,AX
CALLSHURU;
读取第一个数;
CMPAL,'
='
;
游戏区
JEGAM;
CMPAL,09H
JAERO
MOVBX,7
MOVSI,OFFSETDATA1
MOV[SI+BX],AL;
存入第一个字符
CALLDISP
ONE:
CALLSHURU;
JEERO
CMPAL,09H
JAT1
DECBX
MOV[SI+BX],AL
CMPBX,5
JAONE;
三字符以内
只能输入运算或复位
JEERO
CMPAL,10H
JBERO
T1:
PUSHAX;
存入运算符
WAIIT6:
INAL,DX
MOVBL,AL
ANDAL,80H
CMPAL,80H
JEWAIIT6
CMPAL,09H
MOVSI,OFFSETDATA2
MOVBX,7
输入第二个数
CALLDISP
TWO:
JZT99;
计算跳转
JAERO;
输入为+-*/显示错误
DECBX
MOV[SI+BX],AL
CALLDISP
JATWO;
三字符以内
JNZERO;
输入为数字和+-*/显示错误
T99:
JMPJISUAN
GAM:
CALLGAME
ERO:
MOVSI,OFFSETBUFFER
MOVAL,10H
MOV[SI],AL
MOVAL,11H
MOV[SI+1],AL
MOVAL,0EH
MOV[SI+2],AL
MOV[SI+3],AL
MOV[SI+4],AL
MOV[SI+5],AL
MOV[SI+6],AL
MOV[SI+7],AL
CALLDisplay8
JMPKAISHI
以上为主要主程序,由于篇幅限制,计算主程序见附录源程序。
(1)程序流程图
参看附录:
流程图主函数
(2)程序分析
我们将数据区分为BUFFER、DATA1、DATA2、FALG、ZY几个部分,BUFFER作为进行DISP数码管显示子程序显示部分的显示缓冲区;
DATA1、DATA2分别存储用户输入的数字1和数字2,其中DATA1还作为结果存储区,将计算结果储存;
FLAG、ZY两个部分作为游戏区的标志位,FLAG用于判断轮到玩家一还是玩家二,ZY用于判断结果返回左侧还是右侧。
我们首先对输入的第一个按键进行规定,若是‘=’,则运行游戏子程序。
之后我们对其余输入的按键进行了判别,要求符合运算规则,对不符合的输入,会显示错误指示‘-EEEE-’,并跳转至开始。
我们将用户输入的数字1、数字2分别存储至DATA1和DATA2区域,运算符则压入栈,待用户输入‘=’号时,程序跳转至计算部分。
在计算部分,我们先对DATA1和DATA2进行转换,将它们转化为十六进制数并分别存入AX,BX中,由于用户最高输入的数字为999,所以不会出现将AX、BX占满的情况。
之后弹出运算符,对运算符进行判断,跳转至运算符对应的运算处,将运算结果AX,DX压入栈,之后跳转至显示区域,其中减法运算时,若被减数小于减数,则在结果前加一个‘-’并将减数与被减数交换,在乘法运算时,若结果大于65535,则跳转至错误指示,显示溢出。
在显示部分,弹出DX,先对DX判断是否为零,若DX不为零,则为除法的余数,对余数乘十之后除以除数,得到小数点后一位小数,若DX为零,则小数点后一位小数为零。
将AX弹出,把AX转换为BCD码,个位和80H进行或运算,使之显示小数点。
将结果返回至DATA1,调用显示子程序进行显示。
2.子程序
SHURUPROCNEAR;
输入子函数
PUSHBX
PUSHCX
PUSHDX
MOVAL,0CEH
OUTDX,AL;
置空FIFO寄存器
WAIIT:
NOP
INAL,DX
MOVBL,AL
ANDAL,80H
CMPAL,80H
JEWAIIT;
FIFO正在清除期间则跳转等待
MOVAL,BL
ANDAL,0FH
CMPAL,00H
无键按下则等待
MOVAL,40H;
写读FIFORAM命令字
MOVDX,D8279;
读入FIFORAM内容
ANDAL,3FH
NOP
CMPAL,0DH
JNZT101
复位
MOVAL,0DEH
置空FIFO寄存器
WAIIT1:
MOVBL,AL
JEWAIIT1
T101:
LEABX,LEE
XLAT
POPDX
POPCX
POPBX
RET
SHURUENDP
DISPPROCNEAR;
显示子程序
PUSHAX
PUSHSI
MOVDI,OFFSETBUFFER
MOVCX,8
RNE:
MOVDL,[SI]
MOV[DI],DL
INCDI
LOOPRNE
LEASI,BUFFER
POPSI
POPAX
DISPENDP
GAMEPROCNEAR
GAM1:
CALLINIT_G;
游戏初始化
BEG1:
MOVDI,OFFSETDATA1
MOVDL,[DI]
CMPDL,10H
JNECA1
MOVDL,[DI+3]
CALLWIN
CA1:
MOVFLAG,01H
CALLSHURU;
游戏开始
CALLPAN1;
玩家1
CMPAL,7
JNZW1
MOVAL,[DI+7];
玩家1选择左侧
JEBEG1
MOVZY,0
JMPW2
NN1:
MOVBL,[DI];
玩家1选择玩家2右侧键
CMPBL,10H
ADDAL,BL
CMPAL,10
JEYIN1
XORDX,DX
XORBX,BX
MOVBL,10
DIVBX
MOVAX,DX
JMPKK1
W1:
MOVAL,[DI+4];
玩家1选择右侧
MOVZY,1
W2:
CALLSHURU
CALLPAN2;
玩家1输入选择玩家2的键
CMPAL,9
JNZNN1
MOVBL,[DI+3];
玩家1选择玩家2左侧
KK1:
MOVCL,ZY
CMPCL,0
JNZK1
MOV[DI+7],AL;
送回玩家1左侧键
MOVSI,OFFSETDATA1
JMPBEG2;
转到玩家2
K1:
MOV[DI+4],AL
YIN1:
BEG2:
MOVDL,[DI+4]
JNECA2
MOVDL,[DI+7]
CA2:
MOVFLAG,02H
玩家2
CALLPAN2;
JNZWAN1
MOVAL,[DI+3];
玩家2选择左侧键
JMPWAN2
NN2:
MOVBL,[DI+4];
玩家2选择玩家1右侧键
JEBEG2
JEYIN2
JMPKK2
WAN1:
MOVAL,[DI];
玩家2选择右侧键
WAN2:
玩家2输入选择玩家1的键
JNZNN2
MOVBL,[DI+7];
玩家2选择玩家1左侧键
KK2:
JNZK2
MOV[DI+3],AL;
送回玩家2左侧
JMPBEG1;
转到玩家1
K2:
MOV[DI],AL;
送回玩家2右侧键
YIN2:
GAMEENDP
以上为主要子程序,其中玩家输入判断子程序、游戏数据区初始化子程序和胜利显示子程序没有写入。
可以参见附录源程序。
流程图子函数
ACE-10游戏规则:
数码管初始时会显示4个‘1’,键盘最上层一行的按键分别与四个‘1’对应,玩家1控制左侧两个‘1’,玩家二控制右侧两个‘1’。
首先玩家1进行选择,然后是玩家2,再是玩家1,依次进行。
开始时,玩家需要先选择自己的两个数字中的任意一个,再选择另一个玩家两个数字中的任意一个,之后选择的两个数字会相加取个位并返回玩家选择的自己那一方的数字,若两数相加正好为10,则对应数字数码管会全灭并无法选择,当某玩家两个数字的数码管都灭时,则该玩家获胜。
输入子程序:
先清空FIFORAM,然后判断是否有键按下,若没有则等待,若有则进行判断是否为复位键,若是复位键则清空显示数码管和FIFORAM,跳至主程序开始处,若不是复位键,则对其进行查表,将按键对应的数据赋给AL并返回。
显示子程序:
将SI至SI+7地址对应数据赋给BUFFER至BUFFER+7地址内容中,将BUFFER地址赋给SI,调用Display8子函数显示。
游戏子程序:
先对游戏数据区进行初始化,之后对玩家1进行判断,判断是否获胜,若获胜则跳入获胜子程序,若没获胜,则玩家1输入按键。
若输入为按键‘7’则ZY标志赋值0,若为‘8’,ZY标志位赋值1,若为其他摁键,则输入无效,玩家1重新输入。
将对应数据取出并判断是否为10H,若是则重新选择,若不是,则玩家1再输入按键,若为按键‘9’、‘+’,则将对应数据与前一次数据相加。
当结果是10时,根据ZY判断玩家1左或者右侧对应数码管熄灭,并返回10H给对应数据。
当结果不是10时,对结果取个位数并返回玩家1左侧或右侧数据。
(ZY为0返回左侧,ZY为1返回右侧)之后跳转到玩家2,判断玩家2是否获胜。
玩家2对键盘操作顺序与玩家1类似,只不过玩家2先输入按键‘9’,‘+’再输入按键‘7’,‘8’。
玩家2操作完成,再跳转至玩家1。
获胜子程序:
若玩家1两侧数据均为10H,或玩家2两侧数据均为10H,则跳转至获胜子程序,子程序会显示‘-ACE-’字样,用户输入任意按键后,程序会再次调用游戏子程序。
三、调试与分析
1.硬件调试与分析
硬件部分连线简单,但是经过Display8子函数调试时,发现8个数码管中只有第一个数码管可以亮,更换另一个逻辑箱后硬件部分没有问题。
2.软件调试与分析
首先我们对不同模块进行了单独编写程序并运行,我们先对程序中的语法错误进行了修改,在语法没有问题之后,进行软硬件联合调试,对有问题的模块进行单步调试寻找问题。
在实验显示数码管过程中,我们发现数码管显示顺序和数据存储的顺序正好相反,比如DATA1的第一个数据显示在数码管上则位于最右侧的位置。
所以我们在编写程序时,将数据存储方式也进行了调整,把数据反向存储,这样直接调用显示子函数时,显示就变为从左向右显示。
在调试Display8子程序过程中,我们发现在调用Display8子函数之后,需要显示的数据区里的数据发生了改变,于是我们新定义了一个BUFFER区域,长度为8字节,作为显示缓冲区,需要显示的数据区先复制给BUFFER,再调用Display8进行显示。
这样我们编写了一个DISP的子函数来完成这一功能。
我们在输入子函数中加入了判断输入按键是否为复位键,使得复位键无论何时按下,都可以达到复位目的,这样不论在计算过程还是在游戏过程中,只要输入复位键,都可以直接将计算器复位。
在总程序调试过程中,我们经常出现JMP指令跳出范围的情况。
经过网上查阅,我们发现JMP只能在-127~+127指令地址范围内进行跳转,所以我们改变了超范围跳转部分的程序的顺序,使程序正常运行。
计算部分,我们对减法结果的正负进行了判断,使得结果可以为负数,我们还对除法的除数进行了判断,若除数是0,则显示错误指示,示意除数不能为0。
最后在解决了以上等问题后,我们的程序可以完美运行。
不足之处:
1.乘法运算中结果最大只能到达65535,这是由于我们将运算结果存储到AX寄存器中,AX最大只能为65535,所以结果超过65535时,数码管会显示错误指示。
2.计算不能连续输入,只能进行两个数字的运算,若想对三个或以上的数字进行运算,需要两个两个分别输入,再把结果进行运算,比较麻烦。
四、心得与体会
五、附录
程序源码
.MODELTINY
EXTRNDisplay8:
NEAR
Z8279EQU0BF01H
D8279EQU0BF00H
LEDMODEQU00000000B;
左边输入,八位显示,外部译码八位显示
.STACK
.DATA
LEE:
DB07H,08H,09H,'
+'
04H,05H,06H,'
-'
DB01H,02H,03H,'
*'
0H,0AH,'
'
/'
BUFFERDB10H,10H,10H,10H,10H,10H,10H,10H;
显示用
DATA1DB10H,10H,10H,10H,10H,10H,10H,10H;
第一个数据(作为被减数)
DATA2DB10H,10H,10H,10H,10H,10H,10H,10H;
第二个数据(作为减数)
FLAGDB01
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 报告