北邮微机硬件实验报告.docx

上传人:b****5 文档编号:5012352 上传时间:2022-12-12 格式:DOCX 页数:40 大小:1.07MB
下载 相关 举报
北邮微机硬件实验报告.docx_第1页
第1页 / 共40页
北邮微机硬件实验报告.docx_第2页
第2页 / 共40页
北邮微机硬件实验报告.docx_第3页
第3页 / 共40页
北邮微机硬件实验报告.docx_第4页
第4页 / 共40页
北邮微机硬件实验报告.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

北邮微机硬件实验报告.docx

《北邮微机硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮微机硬件实验报告.docx(40页珍藏版)》请在冰豆网上搜索。

北邮微机硬件实验报告.docx

北邮微机硬件实验报告

信息与通信工程学院

微机原理硬件实验报告

 

班级:

姓名:

学号:

班内序号:

日期:

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;无按键按下

;有按键

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1