北邮微原硬件实验报告.docx
- 文档编号:24582348
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:56
- 大小:591.82KB
北邮微原硬件实验报告.docx
《北邮微原硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮微原硬件实验报告.docx(56页珍藏版)》请在冰豆网上搜索。
北邮微原硬件实验报告
2015-2016学年第一学期
微机原理硬件实验报告
学院:
班级:
学号:
姓名:
序号:
实验一熟悉实验环境及IO的使用
一实验目的
1通过实验了解和熟悉实验台的结构,功能及使用方法。
2通过实验掌握直接使用Debug的I、O命令来读写I/O端口。
3学会Debug的使用及编写汇编程序。
二实验内容
1学习使用Debug命令,并用I、O命令直接对端口进行读写操作。
2用汇编语言编写跑马灯程序。
实现功能:
1)通过读入端口状态,选择工作模式(灯闪烁方式、速度等);
2)通过输出端口控制灯的工作状态(低电平灯亮)。
三实验过程
1实验原理
1在Debug下,用I是命令读输入端口的状态,即拨码开关的状态,用O命令向端口输出数据,通过LED发光管来查看。
测试结果:
1)使用命令:
I0EEE0H
读取开关状态,得出的结果为左低右高,即
是低位,
是高位。
2)实验命令:
O0EEE0H
测试LED,改变输入的值可依次测试各个数码管是否正常。
LED左边为高位,右边为低位。
2分析以下程序段的作用
MOVAH,0BH
INT21H
ORAL,AL
JZ0100
INT20H
该段程序实现了检测键盘状态,在键盘有任意键输入时退出程序返回DOS的功能。
该实现依赖于0BH号中断调用和巧妙使用程序入口返回地址直接返回。
在DOS的DEBUG模式下,地址不用添加十六进制H标志。
地址默认为16进制,多写了反而画蛇添足产生错误。
普通数据为了区分需要添加H。
2流程图
3源代码
DATASEGMENT
PORTEQU0EEE0H
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVAL,07FH;01111111
MOVDX,PORT
MOVSI,2
START:
PUSHAX;入栈保存
INAL,DX;读取拨码开关状态
MOVBL,AL;BL存储拨码开关状态
POPAX;出栈恢复
TESTBL,10H;00010000.判断左数第五个拨码开关的状态,
;实现灯型的变化
JNZTWO;ON状态为两个灯
CMPSI,1;判断AL状态
JZCONT;SI等于1时AL有两位为0,应恢复为只有一位为0,
MOVAH,AL
RORAH,1
ORAL,AH
MOVSI,2;AL恢复为只有一位为0,SI变为2
JMPCONT
TWO:
CMPSI,2
JZCONT;SI为2时只有AL只有1位为0,应对其变换
MOVAH,AL
RORAH,1
ANDAL,AH;AL有两位为0
MOVSI,1
CONT:
OUTDX,AL
TESTBL,08H;00001000.判断第四个拨码开关的状态,实现暂停
JNZSTART;ON状态实现暂停
TESTBL,02H;00000010.判断第二个拨码开关的状态,
;实现速度的变化
JNZHIGHSP;ON状态实现高速
MOVBP,0200H;低速状态时延
JMPMOVE
HIGHSP:
MOVBP,0100H;高速状态时延
MOVE:
CALLDELAY
TESTBL,04H;判断第三个拨码开关的状态,实现方向的变化
JNZLEFT;ON状态为方向向左
RIGHT:
RORAL,1;右移,以备点亮下一盏灯
JMPEXIT
LEFT:
ROLAL,1;左移,以备点亮下一盏灯
EXIT:
TESTBL,01H;判断第一个拨码开关的状态
JZSTART;OFF状态继续运行,ON状态实现退出
MOVAL,0FFH;实现全灭
OUTDX,AL
MOVAH,4CH
INT21H
DELAYPROC
MOVCX,BP;BP越大延时次数越多,速度越慢
LOOP1:
PUSHCX
MOVCX,0FFFFH
LOOP2:
LOOPLOOP2
POPCX
LOOPLOOP1
RET
DELAYENDP
CODEENDS
ENDBEGIN
4子程序清单
1)子程序名:
DELAY
功能:
实现延迟显示,即控制每个LED点亮持续一定时间;
入口参数:
BP,赋值给CX控制循环次数,从而实现速度的控制;
出口参数:
无;
使用寄存器:
CX,BP。
5代码分析
1)通过读取拨码开关地址获得拨码开关状态,将该状态的值赋给BL,实现对灯型、暂停、速度、方向以及退出的控制。
2)灯型的控制:
通过相应拨码开关的状态选择灯型。
灯型一共有两种,第一种为每次亮一盏灯,此时控制输出的寄存器AL中的值只有一位为0,其余七位为1;第二种为每次亮两盏灯,此时控制输出的寄存器AL中的值两位为0,其余六位为1。
使用寄存器SI表示当前寄存器AL中0的个数,当SI的值与控制灯型的信息不一致时,通过逻辑与/逻辑或的操作,修改AL的值。
3)暂停的控制:
通过相应拨码开关的状态判断是否执行暂停操作。
当需要暂停时,控制输出的寄存器AL中的值保持不变,当不需要暂停时,控制输出的寄存器AL中的值循环左移/循环右移。
4)速度的控制:
通过相应拨码开关的状态判断速度的大小。
在不同的状态下,对BP赋不同的值,BP作为DELAY子程序的入口参数控制延时的时间从而实现速度的变化。
BP越大,则外循环次数越多,所耗时间越长,每个LED点亮持续时间越久,即速度越慢。
5)方向的控制:
通过相应拨码开关的状态判断方向。
在不同的状态下,对控制输出的寄存器AL中的值循环左移/循环右移,即可控制显示的方向。
6)退出的控制:
通过相应拨码开关的状态判断是否退出程序。
四实验总结
虽然本次实验是第一次微原硬件实验,但是在此之前已经有了一定的软件编程基础,并且在VHDL实验中我们也曾编写过跑马灯实验,因而实验之前对实验原理及代码结构有初步的掌握。
实验过程中我们按照讲义中的要求先对拨码开关及LED进行了测试,便捷了之后程序的编写。
总而言之,通过本次实验,我们对利用汇编语言对硬件进行编程有了一定的掌握,对后续实验的开展奠定了良好的基础。
实验二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对应的编码,如下表:
字形
0
1
2
3
4
5
6
7
8
9
编码
0EDH
21H
0F4H
0F1H
39H
0D9H
0DDH
61H
0FDH
0F9H
2六位数码管静态显示
2.1实验原理
1)电路6个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型编码之后,6个数码管都将显示出相同的数字。
如果要使6个数码管“同时”显示不同的数字,必须采用扫描显示的方法。
2)通过选位寄存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;如果在一秒钟内,每一位数码管都能显示30次以上,则人眼看到的是几位数码管同时在显示。
实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。
3)在本次实验中,采用行扫描方式,一次扫描6位数码管,并进行反复循环,使得每位数码管显示虽然存在间隔,但人眼仍为同时显示。
每位数码管显示的时间即为显示延迟,在每一次扫面之后检测键盘状态,若有任意键输入,便退出返回DOS界面。
2.2流程图
2.3源代码
DATASEGMENT
NUMDB0F4H,21H,0EDH,0DDH,39H,61H;学号后六位为210647
DATAENDS
;-------------------------------------------------------------
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
;-------------------------------------------------------------
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
STAT:
MOVAL,10000000B;A,B,C口均以方式0输出
MOVDX,0EE03H;设置控制地址
OUTDX,AL;送控制字到控制地址
MOVAX,DATA
MOVDS,AX;设置段地址
MOVES,AX
LOP1:
XORSI,SI;SI清零
MOVCX,06H;循环6次,即一个周期6位数码管
MOVDX,0EE00H;A口的地址赋给DX,A口接八位段码
MOVBL,00000001B;高电平即选中该位数码管点亮
LOP2:
MOVAL,NUM[SI];将需要显示的数字赋给AL
OUTDX,AL;送AL输出至A端口
MOVAL,BL;将控制哪一位亮的功能赋给AL
INCDX;B口的地址赋给DX,B口接六位数码管
OUTDX,AL;送AL输出至B端口,完成指定位显示指定数字
DECDX;重新将A口地址赋给DX
ROLBL,1;循环移位,控制下一位数码管亮
INCSI;SI加1,使得下次显示中改变所显示的数字
CALLDELAY;延时,即每位数码管点亮的时间
CALLKEY;判断是否有键盘输入
LOOPLOP2;循环6次,6位数码管依次按要求点亮
JMPLOP1;循环,重新于第一位开始点亮
;-------------------------------------------------------------
DELAYPROCNEAR;延时程序,双重循环
PUSHBX;BX入栈,保留BX寄存器中的数据
PUSHCX;CX入栈,保留CX寄存器中的数据
MOVBX,000BH;BX重新赋值
LOP3:
MOVCX,00H;CX重新赋值
LOOP$;每循环一次,CX自减1,直至结果为0,即FF次
DECBX;BX减1
JNZLOP3;结果为0时停止,即循环11次
POPCX;CX中数据恢复为入栈前的值
POPBX;BX中数据恢复为入栈前的值
RET
DELAYENDP
;-------------------------------------------------------------
KEYPROCNEAR;判断是否有键盘输入
PUSHAX;AX入栈,保留BX寄存器中的数据
MOVAH,0BH;检查输入设备状态
INT21H
ORAL,AL;无输入字符AL为00H,有输入为FFH
JZGOON;全为0即为无输入,返回主程序
MOVDX,0EE01H
MOVAL,00H
OUTDX,AL;完成B端口清零,即6位全灭
MOVAH,4CH;退出程序
INT21H
GOON:
POPAX
RET
KEYENDP
;-------------------------------------------------------------
CODEENDS
ENDSTAT
2.4子程序清单
1)子程序名:
DELAY
功能:
实现延迟显示,即控制每个LED点亮持续一定时间;
入口参数:
无;
出口参数:
无;
使用寄存器:
BX,CX,FR。
2)子程序名:
KEY
功能:
判断是否有键盘输入,若有则退出程序;
入口参数:
无;
出口参数:
无
使用寄存器:
AX,DX,FR。
2.5代码分析
1)静态显示的过程可以分为六个状态,在每个状态中,只有一位数码管工作,显示对应数字信息。
系统循环进行这六个状态,当速度合适时有静态显示六位数字的效果。
2)在数据段中定义NUM,在NUM中存入待显示的“210647”六位数字,根据之前测试得其对应编码为0F4H,21H,0EDH,0DDH,39H和61H;CX表示循环次数;SI表示显示数字在NUM中的位置;BL控制数码管的工作状态。
3)在每个状态中,将需要显示的信息赋值给AL,送至8位段码的A口输出,然后将BL赋给AL,送至控制6位数码管的B口输出,从而使数码管在不同的位置显示数字信息。
4)在每个状态结束时,对BL做循环移位,SI自加1,调用延时函数控制显示的速度。
调用判断键盘输入函数,延时之后若无键盘输入,进入下一状态。
如此循环完成6位数码管的显示。
5)若循环一个周期仍无键盘输入,则回到第一个状态重新循环,直至有键盘输入。
6)延时程序中,采用两层嵌套循环实现延时。
对BX,CX采用入栈操作后重新赋值,BX赋初值为000BH,CX为00H,内循环为每循环一次,CX自减1,直至CX等于0,即内循环FFFFH次,外循环为每循环一次,BX减一,当BX为0时终止循环,即外循环0BH次,总共实现FFFFH*0BH次时跳出循环,BX,CX恢复为原值后返回主程序,实现延时显示。
7)判断有无键盘输入时,调用DOS命令,AH为0BH即为判断是否有键盘输入,无字符输入时AL为00H,与自身或操作之后结果仍全为0,返回主程序,若有字符输入时AL与自身或操作之后结果不为0,对B端口输出00H,即6位数码管全灭之后退出程序。
3六位数码管动态显示
3.1实验原理
1)数码管动态显示“HELLO”字符串,相当于每次显示6位静态字符,每次显示一定时间间隔之后,显示另外6位静态字符。
具体如下图所示:
显示0.5s
H
显示0.5s
H
E
显示0.5s
H
E
L
显示0.5s
H
E
L
L
显示0.5s
H
E
L
L
O
显示0.5s
H
E
L
L
O
显示0.5s
2)每次显示静态字符串的核心代码与静态显示实验的代码相同,因而可以将静态显示中的程序封装为一个子程序直接使用。
增加的功能为需要按一定时间间隔移位读取“HELLO”,程序中通过将其前加入六个空字符,作为码表存储,第一次读取为六个空字符,第二次为五个空字符和字符“H”,第三次为四个空字符和字符“HE”,依次类推,显示时依次往后读取即可。
3)可以通过读取拨码开关输入的状态,控制延时的时间,从而实现速度快慢的变化以及实现暂停的功能。
3.2流程图
3.3源代码
DATASEGMENT
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0
;据显示规律“HELLO”对应码表为3DH,0DCH,8CH,8CH,0EDH
DATAENDS
;-------------------------------------------------------------
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
;-------------------------------------------------------------
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
;-------------------------------------------------------------
MAINPROCFAR
MOVAX,DATA
MOVDS,AX;设置段地址
MOVES,AX
MOVAL,80H
MOVDX,0EE03H
OUTDX,AL;端口A,B,C均以方式0输出
LOP6:
MOVBX,OFFSETMESG;设置偏移量
MOVCX,07H;循环次数,对应7个状态
LOP5:
MOVDX,0EEE0H;拨码开关状态控制显示速度
INAL,DX;读拨码开关状态给AL
INCAL;自加1,预防全0时不便延时
ANDAL,07H;取低三位的值
XORAH,AH;高八位清零
MOVDX,AX;DX表示显示速度
LOPZ:
CALLDISP;调用静态显示函数
DECDX;DX为拨码开关后三位状态,自减1
JNZLOPZ;DX不为0时继续显示
;DX越大同一状态显示时间越长,速度越慢
INCBX;自加1,BX指向下一状态
LOOPLOP5;循环7次,实现滚动效果
JMPLOP6;每次循环结束后回到第一个状态
MAINENDP
;-------------------------------------------------------------
DISPPROCNEAR;将静态显示封装为子程序
PUSHCX;入栈保护
PUSHDX
PUSHAX
MOVBP,000AH;控制延时
LOPX:
XORSI,SI
MOVCX,06H;循环6次,即依次点亮6位数码管
MOVDX,0EE00H
MOVAH,00000001B;一次只亮一位
LOP2:
MOVAL,MESG[BX+SI];需要显示的字符对应的码值赋给AL
OUTDX,AL;完成段码输出
MOVAL,AH;控制第几个数码管工作
INCDX
OUTDX,AL;完成位码输出
DECDX
ROLAH,1;下一个数码管工作
INCSI
CALLDELAY;调用延时函数实现每位数码管的延时显示
CALLKEY;调用判断键盘输入状态的函数
LOOPLOP2;如此循环直至数码管依次被点亮
DECBP;自减1
JNZLOPX;BP不为0则继续循环,即显示的字符串不变
POPAX;出栈恢复
POPDX
POPCX
RET
DISPENDP
;-------------------------------------------------------------
KEYPROCNEAR;判断是否有键盘输入
PUSHAX;入栈保护
MOVAH,0BH
INT21H;DOS调用,将键盘输入信息赋给AL
ORAL,AL
JZGOON;若没有输入则继续工作
MOVDX=0EE00H
MOVAL,00H;若有输入则六个数码管均不工作
OUTDX,AL
MOVAH,4CH;退出程序
INT21H
GOON:
POPAX
RET
KEYENDP
;-------------------------------------------------------------
DELAYPROC;控制延时,两层循环
PUSHAX;入栈保护
PUSHCX
MOVAX,000BH;外循环0BH次
LOPD:
MOVCX,0H
LOOP$;内循环FFFF次
DECAX
JNZLOPD
POPCX
POPAX
RET
DELAYENDP
;-------------------------------------------------------------
CODEENDS
ENDMAIN
3.4子程序清单
1)子程序名:
DELAY
功能:
实现延迟显示,即控制每个LED点亮持续一定时间;
入口参数:
无;
出口参数:
无;
使用寄存器:
AX,CX,FR。
2)子程序名:
KEY
功能:
判断是否有键盘输入,若有则退出程序;
入口参数:
无;
出口参数:
无;
使用寄存器:
AX,DX,FR。
3)子程序名:
DISP
功能:
静态显示6位指定字符;
入口参数:
无;
出口参数:
无;
使用寄存器:
AX,CX,DX,SI,BP,FR。
3.5代码分析
1)动态显示的过程可以分为七个状态,在每个状态中,静态显示六位数码管信息。
系统循环进行这七个状态,当速度合适时有动态显示的效果。
2)在数据段中定义MESG数组,依次存入“0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0”;CX表示循环次数,对应表中的七个状态;BX表示当前需要显示的状态,DX表示动态显示的速度。
3)将静态显示的程序封装为子程序以供调用,在每个状态中调用子程序DISP实现六位数码管的静态显示,调用子程序DELAY实现延时,调用子程序KEY判断键盘有无输入。
4)每个状态结束时,BX加1,表示进入下一状态,如此循环完成数码管的动态显示。
5)主程序中通过读取拨码开关状态,将其后三位赋给DX,并在子程序DISP返回时,自减实现延时。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮微原 硬件 实验 报告