CALL MOV CALL RET
WRComL AL,AH
OR AL,Y ;列地址=列序数+列基址
WRComL
SETXYL ENDP SETXYR PROC
CALL MOV CALL RET
;设置右半屏起始显示行列地址,AL-X起始行序数(0-7),AH-Y起始列序数(0-63)
NEAR
OR AL,X ;行地址=行序数+行基址
WRComR AL,AH
OR AL,Y ;列地址=列序数+列基址
WRComR
SETXYR ENDP WRComL PROC
MOV OUT DX,AL IN
AL,DX
;写左半屏控制指令,A-写入指令
NEAR
DX,RD_BUSY_AD
;检查液晶显示是否处于忙状态
DX,WR_COM_AD_L
WRComL1:MOV
TEST RET
AL,80H
JNZ WRComL1
WRComL ENDP WRComR
MOV
NEAR
;写右半屏控制指令,A-写入指令
PROC
DX,RD_BUSY_AD
;检查液晶显示是否处于忙状态
DX,WR_COM_AD_R
OUT DX,AL IN
AL,DX
WRComR1:MOV
TEST RET
AL,80H
JNZ WRComR1
WRComR ENDP WRDataL PROC
MOV OUT DX,AL
;写左半屏数据,A-写入数据
NEAR
DX,WR_DATA_AD_L
WRDataL1:MOV DX,RD_BUSY_AD
IN AL,DX
;检查液晶显示是否处于忙状态
TEST RET
AL,80H
JNZ WRDataL1
WRDataL ENDP WRDataR PROC
MOV OUT DX,AL IN
AL,DX
;写右半屏数据,A-写入数据
NEAR
DX,WR_DATA_AD_R MOV
WRDataR1:
TEST RET
DX,RD_BUSY_AD
AL,80H ;检查液晶显示是否处于忙状态
JNZ WRDataR1
WRDataR ENDP
END START
5. 程序调试情况及运行结果分析
在程序调试过程中,遇到如下的几个问题:
1.在调试过程中,多次出现指针超出范围的问题。
解决:对各个子程序进行检查,先是检查了PUSH、POP语句是否规范,发现没有问题,后来发现在子程序结尾ret语句丢失,添加后运行正常。 2.在调试过程中出现range out的现象
解决:问题在于有条件跳转语句只能在短范围内跳转,不能跳转的范围太大,后来通过在跳转的范围中添加了一些中转站使问题得到解决。 3.在数码管显示,数码管始终无法显示
解决:起初以为问题出在实验箱,换了很多实验箱后问题仍然存在。最后发现是8155方式控制字的问题,其方式控制字与8255不同。
6. 项目的结论
项目的问题最终得到全部解决,通过改变输入,即利用开关控制输入检测项的正异常,程序能够判断检测项的正异常,并可正确显示出正异常项目,直流电机及蜂鸣器均能按照设想工作,数码管正常显示日期。
感言
通过这次项目,最大的感受就是累并快乐着,刚开始做的时候基本是一头雾水,首先对硬件根本不了解,对用软件控制硬件更是无从谈起!因为之前的微机原理实验时,课上的知识还没有学,所以实验本来要达到的熟悉硬件及了解软硬件的结合的目的没有达到!如是,项目开始的时候首先还是先做了下
实验,参照别人的程序,去了解如何用程序控制硬件!但书上对于硬件这一块的介绍还是偏少,软硬件的结合还是在调试过程中慢慢体会到的!之后开始构思整个项目,针对每一块功能进行设计,分块设计程序,分块进行调试。这一过程中,自学了8155,数码管,液晶屏!调试的过程很艰辛,因为程序比较大,加之很多自学的东西也不是特别了解,以及实验箱本身存在的问题,确实花了不少心血,跟着其他班去了很多次机房!做项目的过程中,老师对自己帮助很大,很多东西都是与老师和同学讨论出来的,团队合作能力得到锻炼。同时,查了很多资料,自学的能力也得到提高。这次项目我注意运用了这样一个科学的项目步骤“项目的优化与延伸,可行性可靠性分析,项目的执行,项目的评估”,深有体会,在答辩的时候也跟大家分享了一下!总之,花了不少时间,也学到了不少东西,成果还是不错的。
参考文献
[1] 钱晓捷. 《16/32位微机原理、汇编语言及接口技术》. 第二版,北京:机械工业出版社,2011
年10月.