北邮微机硬件实验报告.docx
- 文档编号:5012352
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:40
- 大小:1.07MB
北邮微机硬件实验报告.docx
《北邮微机硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮微机硬件实验报告.docx(40页珍藏版)》请在冰豆网上搜索。
北邮微机硬件实验报告
信息与通信工程学院
微机原理硬件实验报告
班级:
姓名:
学号:
班内序号:
日期:
2018年1月6日
实验一熟悉实验环境及IO的使用
一、实验目的
1.通过实验了解和熟悉实验台的结构,功能及使用方法。
2.通过实验掌握直接使用Debug的I、O命令来读写I/O端口。
3.学会Debug的使用及编写汇编程序。
二、实验内容
1.学习使用Debug命令,并用I、O命令直接对端口进行读写操作。
2.用汇编语言编写跑马灯程序。
实现功能:
A.通过读入端口状态,选择工作模式(灯闪烁方式、速度等);
B.通过输出端口控制灯的工作状态(低电平灯亮)。
三、实验过程
1.在Debug下,用I是命令读输入端口的状态,即拨码开关的状态,用O命令向端口输出数据,通过发光管来查看。
测试结果:
A.使用命令:
读取开关状态,得出的结果是从左低右高,即
是低位,
是高位。
B.使用命令:
测试数码管的低位,改变输入的值可依次测试各个数码管是否正常。
七段数码管左边为高位,右边为低位。
2.分析以下程序段的作用
MOVAH,0BH
INT21H
ORAL,AL
JZ0100
INT20H
分析:
该段程序实现了检测键盘状态,在键盘有任意键输入时退出程序返回DOS的功能。
该实现依赖于0BH号中断调用和巧妙使用程序入口返回地址直接返回。
在DOS的DEBUG模式下,地址不用添加十六进制H标志。
地址默认为16进制,多写了反而画蛇添足产生错误。
普通数据为了区分需要添加H。
3.编写跑马灯程序。
程序流程图如下:
程序源码如下:
DATASEGMENT
DB100DUP(0)
DATAENDS
;-------------------------------------------------------------
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
;-------------------------------------------------------------
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
;-------------------------------------------------------------
PUASEMACRO
LOCALLOPP1,LOPP2,HER
PUSHAX
PUSHBX
PUSHDX
HER:
READ;读取8个拨码开关的状态
SHLAH,1
SHLAH,1;把D6位移动至CF,根据CF位是0还是1判断是否暂停
JCHER
MOVDH,AL
ANDDH,6FH;控制速度
LOPP1:
MOVAX,0FFFH
LOPP2:
DECAX
JNZLOPP2
DECDX
JNZLOPP1;两层循环,以扩大时延(延时程序)
POPDX
POPBX
POPAX
ENDM
;-----------------------------------------------
READMACRO;读取8个拨码开关的状态
MOVDX,0E8E0H
INAL,DX
MOVAH,AL
ENDM
;-------------------------------------------------------------
START:
;主程序
MOVAX,DATA
MOVDS,AX
MOVDX,0E8E0H
LOP:
READ;读取8个拨码开关的状态
SHLAL,1;D7位表示开关,左移1位,把D7移动至CF位,根据CF位是0还是1决定是否开关
JNCLOP
SHRAH,1;D0控制跑马灯方向,右移1位,将其移动至CF位,根据CF位是0还是1决定方向
JCRTOL
JNCLTOR
RTOL:
;方向:
从右到左
MOVBL,0FEH;设定灯亮的初值,低电平点亮对应位的灯,设定为最后一盏灯先亮,其余灭
LOP1:
READ;读取8个拨码开关的状态
ANDAL,02H;D1控制灯型选择
SUBBL,AL;若为0,则每次循环后不改变灯型,依然是只亮一盏灯,若为1,则每次循环后BL减2,达到随机灯型的效果
ROLBL,1;BL循环左移1位
PUSHAX
MOVAL,BL
OUTDX,AL;将BL的值输出到灯,点亮对应的灯
POPAX
PUASE;延时一段时间,使人眼可见
READ;读取拨码开关状态
SHLAL,1
JNCEXIT;如果D0为0,则退出程序
SHRAH,1
JCLOP1;判断D7位方向是否改变
LTOR:
;方向:
从左到右
MOVBL,0FEH
LOP2:
READ
ANDAL,02H
SUBBL,AL
RORBL,1;与上述注释类似,此处不再赘述
PUSHAX
MOVAL,BL
OUTDX,AL
POPAX
PUASE
READ
SHLAL,1
JNCEXIT
SHRAH,1
JNCLOP2
JMPRTOL
EXIT:
MOVAX,4C00H;返回DOS系统
INT21H
;-------------------------------------------------------------
CODEENDS
ENDSTART
注意:
本次实验中一共有8个拨码开关,其中D0表示方向的选择,有向左和向右两种选择;D7是开始和终止程序的开关;D6是暂停功能;D1是灯型的选择,分别有只亮一盏灯和随机灯型;其余的D2、D3、D4、D5是控制速度的拨码开关,不同的组合方式对应不同的移动速度。
四、实验收获和体会
这是第一次微机硬件实验,也是第一次用汇编语言将软件和硬件结合起来的实验。
主要是熟悉了将要使用的实验系统,学习了最基本的硬件测试的方法,对接口的地址、LED灯的控制、拨码开关的高低位等有了测试和记录,为后续实验作好准备。
本次实验的收获之一就是IO端口的选择与熟悉。
要想对实验板上的某一个硬件部件加以控制,必须选择对应的端口地址,这一点在debug环境下的I命令和O命令中有很深的体会。
其次就是拨码开关的状态读取。
本次实验中一共有8个拨码开关,其中D0表示方向的选择,有向左和向右两种选择;D7是开始和终止程序的开关;D6是暂停功能;D1是灯型的选择,分别有只亮一盏灯和随机灯型;其余的D2、D3、D4、D5是控制速度的拨码开关,不同的组合方式对应不同的移动速度。
对于边缘位置的拨码开关,我们可以用SHR或者SHL指令,将对应位移动若干位至CF位,通过JC或者JNC指令来决定程序跳转方向;而对于中间部位的拨码开关位(例如速度选择位),我们利用AND指令,把该几位和1相与,其余位和0与,读出该几位的状态,从而决定延时程序中循环初值的大小。
本次实验的一大特色是随机灯型的设计。
我们读取出D1位的状态,有1和0两种状态,相与后对应0和2两种数值。
在每一次循环过后,我们把BL(控制灯亮的寄存器)值减去相与后的值,也即减去0或者2:
减0代表不改变灯型,依然只亮一盏灯;而减2代表每一次循环后灯型均有所改变,由于每次循环后BL的值是不确定的,所以打乱了之前只亮一盏灯的规则,改为随机点亮,这是随机灯型设计的基本原理和思路。
本次实验目的在于熟悉IO端口的选择,从而为以后的实验打好基础。
实验二8255A并行接口应用
一、实验目的
1.掌握8255A的功能及方式0、1的实现。
2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。
3.了解七段数码管显示数字的原理。
4.掌握同时显示多位数字的技术。
二、实验内容
1.查找八段数码管的显示规律及数码管的位选规律。
2.六位数码管静态显示。
在数码管电路上静态地显示6位学号,当主机键盘按下任意键时,停止显示,返回DOS。
3.六位数码管动态显示。
要求在数码管电路1-6位数码管上,动态显示字符串HELLO,当主机键盘按下任意键时结束。
4.扩展部分:
完成扫描键盘(PC口)输入自己的学号,并在数码管上显示。
三、实验过程
1、八段数码管位选规律
在方式0(输入/输出)下,以A口为输出口,B口为输出口,A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。
测试结果如下图所示。
由此,容易得出数字0~9以及字母A~H的编码,如下表所示。
字形
0
1
2
3
4
5
6
7
编码
0EDH
21H
0F4H
0F1H
39H
0D9H
0DDH
61H
字形
8
9
A
B
C
D
E
F
编码
0FDH
0F9H
7DH
9DH
0CCH
0B5H
0DCH
5CH
2、六位数码管静态显示
电路6个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型编码之后,6个数码管都将显示出相同的数字。
如果要使6个数码管“同时”显示不同的数字,必须采用扫描显示的方法。
通过选位寄存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;如果在一秒钟内,每一位数码管都能显示30次以上,则人眼看到的是几位数码管同时在显示。
实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。
本程序采用了每次扫描一排6个数码管,然后反复循环的方式。
每个数码管间隔一定时间,也即显示延迟。
通过在每一排扫描之后检测键盘状态,可以达到任意键退出的功能。
程序框图如下。
程序源代码如下。
DATASEGMENT
NUMDB0F4H,21H,0EDH,0fdH,0eDH,0edH;我的学号210800
DATAENDS
;-------------------------------------------------------------
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
;-------------------------------------------------------------
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
STAT:
MOVAL,10000000B
MOVDX,0E803H;设置8255工作方式控制字,A、B均工作在方式0,且均为输出
OUTDX,AL
MOVAX,DATA
MOVDS,AX;数据段设置
MOVES,AX
LOP1:
XORSI,SI;扫描指针
MOVCX,06H;共6位显示
MOVDX,0E800H
MOVBL,00000001B;一次点亮一位数码管
LOP2:
MOVAL,NUM[SI];指针决定显示哪一位数字
OUTDX,AL;显示数字
MOVAL,BL;决定哪一位数码管点亮
INCDX
OUTDX,AL
DECDX
ROLBL,1;下一位数码管点亮
INCSI;对应显示下一个数字
CALLDELAY;时延
CALLKEY;检查是否有按键按下
LOOPLOP2;直到6位数码管都显示出来
JMPLOP1
;-------------------------------------------------------------
DELAYPROCNEAR;延时程序
PUSHBX
PUSHCX
MOVBX,000FH;两层循环
LOP3:
MOVCX,00H
LOOP$
DECBX
JNZLOP3
POPCX
POPBX
RET
DELAYENDP
;-------------------------------------------------------------
KEYPROCNEAR;检测是否有键盘按键按下
PUSHAX
MOVAH,0BH
INT21H
ORAL,AL
JZGOON;没按键按下,继续显示数字
MOVAH,4CH;按键按下,退出程序,返回DOS
INT21H
GOON:
POPAX
RET
KEYENDP
;-------------------------------------------------------------
CODEENDS
ENDSTAT
代码基本思路:
程序的实现思路是很明确而简单的,首先对8255A进行初始化,设置控制字,随即开始扫描数码管,这里使用了一个八位寄存器,赋值为一位为1,其余全零,依靠移位容易实现不同时刻亮不同的数码管,且每次只亮一个数码管,其余管熄灭。
亮灯的管查找显示该位应该显示的数字,每个数码管亮灯之后暂留一定的时间,依靠DELAY子程序来实现。
每次扫描六个管,然后反复,即可利用视觉暂留效应产生静态显示学号的功能。
在显示了每一位数之后,调用KEY子程序检测计算机键盘的状态,如果有任意键按下,则视为程序退出指令,终止程序并返回DOS,如果没有键按下,则跳回继续循环扫描。
3、六位数码管动态显示
数码管动态显示“HELLO”字符串,相当于每次显示6位静态字符串,然后显示一定的时间间隔之后,显示另外6位静态字符串。
其核心代码和静态显示并无差别,可将静态显示学号的代码作为一个子程序封装起来直接使用。
需要增加的只是在一定的时间间隔内去移位读取“HELLO”字符串中需要显示的部分。
实际实现时可以存储为码表的形式,移位往后读取即可。
可以在移位读取前通过读取拨码开关的状态,获得控制信息,比如暂停、速度变化等。
分析:
如上图3.2所示,本次实验共有7个状态,每个状态下所显示的字符如图所示。
在定义数据段的时候,定义为:
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0
我们定义一个指针BX,改指针从MESG的偏移地址开始,然后在设定一个SI指针,SI从BX开始向后依次移动1位,一共移动6位,代表一个状态下显示所有字符;一个状态完成后,BX+1,开始第二个状态:
SI依旧从BX开始向后显示6位,以此类推。
这样就达到了HELLO字符串向前移动的效果。
程序框图如下:
程序源代码如下:
DATASEGMENT
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0;HELLO字符串
DATAENDS
;-------------------------------------------------------------
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
;-------------------------------------------------------------
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
;-------------------------------------------------------------
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVAL,80H
MOVDX,0E803H;设置8255工作方式控制字,A、B口均工作在方式0,且均为输出
OUTDX,AL
LOP6:
MOVBX,OFFSETMESG
MOVCX,07H;Control6states
LOP5:
MOVDX,0E8E0H;读取拨码开关的状态:
D0—D2三个拨码开关决定速度
INAL,DX
INCAL
ANDAL,07H;第三位的取值决定延时循环中的循环初值
XORAH,AH
MOVDX,AX;DX是延时循环的初值
LOPZ:
CALLDISP;显示一个状态
DECDX
JNZLOPZ;显示当前状态下的所有字符,知道DX值被减到0
INCBX;BX决定显示哪个状态
LOOPLOP5;每个状态完成后可以改变速度
JMPLOP6;6个状态都显示完毕后,从头再显示该6个状态
MAINENDP
;-------------------------------------------------------------
DISPPROCNEAR;显示一个状态,与前面静态显示学号类似,此处不再赘述
PUSHCX
PUSHDX
PUSHAX
MOVBP,000AH
LOPX:
XORSI,SI
MOVCX,06H
MOVDX,0E800H
MOVAH,00000001B
LOP2:
MOVAL,MESG[BX+SI]
OUTDX,AL
MOVAL,AH
INCDX
OUTDX,AL
DECDX
ROLAH,1
INCSI
CALLDELAY
CALLKEY
LOOPLOP2
DECBP
JNZLOPX
POPAX
POPDX
POPCX
RET
DISPENDP
;-------------------------------------------------------------
KEYPROCNEAR;检测键盘是否有按键被按下,与前面代码类似,不再赘述
PUSHAX
MOVAH,0BH
INT21H
ORAL,AL
JZGOON
MOVAH,4CH
INT21H
GOON:
POPAX
RET
KEYENDP
;-------------------------------------------------------------
DELAYPROC;延时程序
PUSHAX
PUSHCX
MOVAX,000FH
LOPD:
MOVCX,0H
LOOP$
DECAX
JNZLOPD
POPCX
POPAX
RET
DELAYENDP
;-------------------------------------------------------------
CODEENDS
ENDMAIN
代码的具体分析如下:
代码直接使用了本实验中六位数码管静态显示部分的代码,封装成为了DISP子程序,便于调用。
DISP子程序即为反复扫描显示静态字形的程序。
另外有DELAY作为延时子程序供调用。
这样主程序只要考虑把每个状态定义好,并以一定的时间间隔传递给DISP显示即可。
主程序中定义六种显示状态,分别对应于动态显示的六个画面,主程序中加入了拨码开关读取的代码,这样读入速度信息,依据速度信息置循环次数,用以控制显示速度。
4、扩展:
数码管显示键盘输入学号
在前面数码管显示程序的基础上,本程序需要着重处理的是按键的检测,只要按键检测无误,将按键值存储下来,调用封装好的显示子程序就实现了按键显示的功能,按键值同时可以作为控制信息,增加如删除输入的一个数字、清除所有数字、退出程序等控制功能。
为了避免按键抖动的影响,程序设计中使用按键释放检测的方法。
一次完整的按键过程是按键、保持、释放的完整流程。
按键值的检测采用查表的方式完成,容易根据偏移量找到按键对应的字符显示码,用以输出字符。
8255数据口:
PA:
EE00(E800):
数码管段选
PB:
EE01(E801):
数码管位选
PC:
EE02(E802):
4*4矩阵键盘,高4位接行,低四位接列
端口C地址E802H
PC4、PC5、PC6、PC7接行
PC3、PC2、PC1、PC0接列
控制端口地址E803H
行反转法识别闭合键时,要将行线接一个并行口,先让他工作在输出方式,将列线接另一个并行口,先让它工作在输入方式,程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线的值,如此时某键按下则必使某一列线值为0,然后程序再对两个并行端口的工作方式进行设置,使行线工作在输入方式,列线工作在输出方式,并且将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么在闭合键所在的行线上的值必定为0。
这样,有按键时,可读得唯一的行值和列值。
程序框图如下:
程序源代码如下:
DATASEGMENT
IDDB6DUP(0)
ARRAYDB11100111B,11101011B,11101101B,11101110B
DB11010111B,11011011B,11011101B,11011110B
DB10110111B,10111011B,10111101B,10111110B
DB01110111B,01111011B,01111101B,01111110B
KEYDB0EDH,21H,0F4H,0F1H,39H;0~5
DB0D9H,0DDH,61H,0FDH,0F9H;6~9
DATAENDS
;-----------------------------------------------------
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
;-----------------------------------------------------
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
;-----------------------------------------------------
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVDX,0E823H
MOVAL,16H
OUTDX,AL
CLEAR:
XORDX,DX;清屏
MOVCX,6
MOVAL,0
XORSI,SI
LOPC:
MOVID[SI],AL
INCSI
LOOPLOPC
DELETE:
CMPDX,0;删除一个数字
JENEXT
DECDX
MOVAL,0
MOVSI,DX
MOVID[SI],AL
NEXT:
CALLDISP;显示
CALLREAD;读取键盘信息
CMPAL,0FFH;是否有按键按下?
JENEXT;无按键按下
;有按键
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 硬件 实验 报告