. . 按照正确接线之后,将实验台与计算机进行联机,再把程序通过DVCC汇编写进去,编译再次链接,然后调试无误,点击运行。数码管会显示初始命令等待58-58-58状态,然后至到下次正确的键入键盘上的值,如果键值为 F 则初始化年月日并置入相应的内存,成功后返回主控模块。如果键值为 D则初始化时分秒并置入相应的内存,成功后返回主控模块。如果键值为 B 则显示年月日内存中的值,成功后等待下次有键输入后返回主控程序。如果健值为 9 则显示时分秒内存中的值,成功后等待下次有键输入后返回主控程序。 并调用显示模块显示。每当程序运行到XX-00-XX的时候(XX代表任意数值),蜂鸣器响起,整点报时实现。
四、 课程设计总结
(一)遇到问题及解决方案:
在本次设计中我们遇到不少的难题:
我们一开始按照指导书接线,并先导入计算机上本身附带的程序后没有得到相应的效果,这让我十分的疑惑,也认真检查了硬件的接线线路,后来得知是不一定每一个的仪器都能顺利与主机链接上,后来经过多次的多部机子调试后得到能成功运行代码的平台。
然后我们在之前的程序中加入了其他的功能:整点报时、键盘初始化等。 在改进设计方案中,加入数字键盘进行时间校对的过程确实遇到了不小的麻
15
烦。在运行原先实验指导书中的CALL KEY(主要功能是从键盘上读入键入的值)函数,在我的程序中总是不能得到正确的键值,这个问题困扰了我们小组很久,于是我们进行了断点调试,在CALL KEY函数中不断的加入8255并行接口的初始化程序,将当前程序运行中的计算结果通过8255输出到小灯上,再通过观察小灯的亮灭状态判断当前断点程序是否正常的在运行。这样,我们调试了整整一天,终于发现了问题,并且解决了问题。本小组发现实验所用的编译软件存在着缺陷。当数据段的代码过长的时候,程序不能正常的找到数据段的起始地址,CALL KEY函数中的查表指令无法正常进行。我们的改进方案是将原先写在数据段的表写进代码段,通过赋初值给一片内存区域,这样又在程序开头将代码段的初始地址赋给数据段的初始地址,由于程序中代码段的初始地址与数据段的初始地址是相同的所以这次寻找代码段的初始地址便能成功查表,于是也就解决了CALL KEY函数的运行问题。
在整点报时上,融入了8255,8255由DATA22的数值决定跳转哪种状态,当分钟大于等于0分钟,则是给8253的GATE0高电平,从而使OUT0选通,将一定频率的信号传给蜂鸣器;当分钟小于等于0分钟,则是给8253的GATE0低电平,从而使OUT0不通,不能将一定频率的信号传给蜂鸣器,从而达到整点报时的效果。
还有在我的代码程序里面有通过8279判断是否有键盘输入的部分,如下:
MOV DX,PORT1 IN AL,DX AND AL,07H
(详情请参考8279的初始化过程)
这个函数若返回AL = 0,则无键盘输入。我将这个函数写在了一个程序的循环之中,并作为循环判断条件,若无键盘输入则循环继续运行,若有键盘输入则跳出循环,但是我发现实际运行的时候它却不停的跳出循环,查了很久的代码还是没有发现原因,最后突然想到有可能是中断返回的时候将AL的改变了,于是便将程序做了如下修改:
CLI
MOV DX,PORT1 IN AL,DX AND AL,07H STI
16
这次的运行结果才是正确的。
对于其他的部分,我们的实验结果完全正确。
(二)课程设计心得体会
这次的课程设计我深刻的体会到了基础语言编程的不容易,相较于C++来说,汇编语言几乎无封装性可言,也无多态性。这些特点使得我们编程的时候必须逻辑清晰,稍有差错,程序就不知道会跑到什么地方去了。同时汇编语言语法上来说是十分容易的,但是又由于逻辑上要求十分严谨,这就造成了查错过程难以进行,因为通过编译几乎是不可能报错的,但是实际运行的时候程序也许就和你预期的完全不同,逻辑错误若不细究程序是难以查出的。同时,我也体会到了程序的模块化真的对于程序的调试有着很大的便利,我也更加熟悉了分模块分段的调试方法,这对于我以后的编程道路也是一次宝贵的经历。
在课程设计过程中,我深刻地体会到:《微机原理与接口技术》这门课程对于我们的要求不仅限于对书本知识的理解,更重要的是对书本知识的运用。除此之外,我们应该在学习过程中充分发挥自己的想象力和创新意识,将对书本知识的理解与我们的创新意识相结合,设计出实用且功能良好的实物。通过本次课程设计,也提高了我们的编程能力、协作能力和创新能力,为以后的学习打下了良好的基础。另外,我深感能找到一台运行正常的机子对实验的进行真的至关重要!
参考文献
[1]梁健武 ,《微机原理与接口技术》 中国铁道出版社
附录:电子万年历软件代码及注释
CODE SEGMENT ASSUME CS:CODE INTPORT1 EQU 0020H INTPORT2 EQU 0021H
INTQ3 EQU INTERUPT3 INTQ7 EQU INTERUPT7 DATAPORT EQU 00DEH CONTPORT EQU 00DFH
PORT0 EQU 00DEH ;8279 DATA PORT PORT1 EQU 00DFH ;8279 CTRL PORT
17
DATA1 EQU 0500H DATA2 EQU 0508H DATA3 EQU 0518H DATA4 EQU 0520H DATA5 EQU 0528H DATA6 EQU 0529H DATA7 EQU 052AH DATA8 EQU 052BH DATA9 EQU 052CH DATA10 EQU 052EH DATA11 EQU 0530H DATA12 EQU 0531H DATA13 EQU 0532H DATA21 EQU 0533H DATA22 EQU 0534H DATA23 EQU 0535H DATA31 EQU 0536H DATA32 EQU 0537H DATA33 EQU 0538H CTRL EQU 0073H PORTB EQU 0071H
CNT DB 06H TEMP DB 00H BUFER DB 0H
KEYDATA EQU 0400H
ORG 1800H START: MOV AX,0H
MOV DS,AX MOV BX,0H MOV BYTE PTR DS:[BX+KEYDATA],23H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],2BH ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],33H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],3BH ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],22H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],2AH
18
ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],32H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],3AH ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],21H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],29H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],31H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],39H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],20H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],28H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],30H ADD BX,01H MOV BYTE PTR DS:[BX+KEYDATA],38H JMP TINT1 TINT1: CLI CALL FORMAT
MOV DX,CONTPORT MOV AL,00H OUT DX,AL ;KEYBORD DISPLY MODE MOV AL,2AH OUT DX,AL ;8279 CLOCK MOV AL,0d0h OUT DX,AL ;8279 CLEAR MOV AL,90h OUT DX,AL ;READ FIFO RAM COMMAND
TEST1: IN AL,DX AND AL,80H JNZ TEST1
MOV DX,004BH ;8253计数器2 MOV AL,0B6H
19
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库中南大学微机原理课程设计报告(4)在线全文阅读。
相关推荐: