基本IO的应用.docx
《基本IO的应用.docx》由会员分享,可在线阅读,更多相关《基本IO的应用.docx(9页珍藏版)》请在冰豆网上搜索。
基本IO的应用
学生
实验报告
学院:
软件与通信工程学院
课程名称:
微机原理
专业班级:
姓名:
学号:
学生实验报告
(1)
学生姓名
学号
同组人:
无
实验项目
实验四基本I/O口的应用
■必修□选修□演示性实验□验证性实验■操作性实验□综合性实验
实验地点
H123
实验仪器台号
指导教师
实验日期及节次
2016.05.11星期三第一二节
一、实验综述
1、实验目的及要求
实验目的:
(1)加深对锁存器和缓冲器的基本原理的了解;
(2)掌握I/O口编程的基本方法;
(3)掌握基本I/O口的扩展方法及编程方法。
实验要求:
(1)编写程序使开关Ki闭合时,对应LEDi灯亮;
(2)编写程序:
开关K8闭合时,实现八个LED灯从上到下循环点亮;K8断开停止循环;
(3)编写程序实现八个LED灯从两边到中间,从中间到两边循环点亮,按下K1停
止循环。
2、实验仪器、设备或软件
计算机、DEBUGMasmforwindow集成实验环境,proteus软件。
二、实验过程(实验步骤、记录、数据、分析)
1、实验原理
锁存器74LS373与发光二极管LED1~LED8;缓冲器74LS245与K1~K8开关相连,本实验为模拟灯亮暗实验,开关闭合对应LED亮。
2.利用MASM进行汇编程序
(1)编写程序:
使开关Ki闭合时,对应LEDi灯亮
程序代码如下:
DATASSEGMENT
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKSSTART:
MOVAX,DATAS
MOVDS,AX
MOVDX,600H;IO3#的地址为600H
L1:
INAL,DX;读输入口的开关状态
NOTAL;取反
OUTDX,AL;写输出口,使对应LED灯点亮
JMPL1
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果:
当K1闭合时,LED1灯亮
当K6闭合时,LED6灯亮
(2)编写程序:
开关K8闭合时,实现八个LED灯从上到下循环点亮;
K8断开停止循环。
程序代码如下:
DATASSEGMENT
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAH,01H;灯循环显示初值
LP1:
MOVDX,600H
WAIT1:
INAL,DX;取端口数据
TESTAL,00000001B;对key8的判断
JNZWAIT1;JZ表示key8按下,若没有闭合则等待,直到key8按下
MOVDX,600H
MOVAL,AH
OUTDX,AL
MOVCX,2801H;延时
WAIT2:
NOP;表示空循环一个机器指令的时间
NOP
LOOPWAIT2;—个LOOP相当于两个NOP
ROLAH,1;由于要循环显示,则要找规律
JMPLP1
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果:
当K8闭合时,LED灯自下而上循环点亮
突然断开K8,则LED灯停止循环,一直停留在断开前的状态
TB
(3)编写程序实现八个LED灯从两边到中间,从中间到两边循环点亮,
按下K1停止循环。
程序代码如下:
DATASSEGMENT
;此处输入数据段代码
TABDB81H,42H,24H,18H,18H,24H,42H,81H
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
MOVDX,600H
LEABX,TAB
LP2:
MOVAH,00H
LP1:
WAIT2:
INAL,DX;取端口数据
TESTAL,00000001B;对key8的判断
JNZWAIT2;JZ表示key8按下,若没有闭合则等待,直到key8按下
MOVAL,AH;把数据取出
XLAT;(换码指令,把数据段中偏移地址为BX+AL的内存单元的内容送到AL中)无规则的数据放到表格中可以有序输出
OUTDX,AL
MOVCX,2801H;延时
WAIT1:
NOP
NOP
LOOPWAIT1
INCAH;目的是在一次执行时,把TAB的指针下移
CMPAH,08H;比较是否把TAB的数据全读完。
JNZLP1
JMPLP2
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果:
(3)编写程序实现八个LED灯从两边到中间,从中间到两边循环点亮,
按下K1停止循环。
第三个实验也可以这样做,不用查表,用循环指令
ROL和ROF来实现
源代码程序如下:
DATASSEGMENT
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES
START:
MOVDX,600H
MOVBL,80H
MOVBH,01H
LOP2:
WAIT2:
INAL,DX;取端口数据
TESTAL,00000001B;对key8的判断
JNZWAIT2;JZ表示key8按下,若没有闭合则等待,直到key8按下INAL,DX
TESTAL,80H
MOVAL,0
JZJP1
ROLBL,1
RORBH,1
MOVAH,BL
ADDAH,BH
MOVAL,AH
JP1:
OUTDX,AL
MOVCX,2000H;延时
WAIT1:
NOP
NOP
LOOPWAIT1
LOOPLOP2
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验结果同上
三、结论
1分析讨论
(1)刚开始的时候不知道NOP的作用,自己查了资料
NOP指令即“空指令”,在x86的CPU中机器码为0x90(144)。
执行到NOP旨令时,CPU十么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。
所以NOP指令自然也会占用执行一个指令的CPU时间片。
常用于程序延时或精确计时,不过在较快的CPU上不明显。
(2)还有之前不明白一开始仿真时,为十么这些灯是全亮的?
可能是没有数据的
输入,悬空就是高电平吧(LED是高电平有效)
(3)在做实验时,学到了延时子程序和要把无序的数据输出时,可用查表方式
(4)在做从两边到中间亮时,自己做了一个程序,没有用查表方式,而是参仿了循环的程序,使用ROL和ROF指令
(5)—开始使用的是PROTUES8.做的实验,但是做不了,只能用比8.0版本低的来做,不知道老师如何使用8.0版本来做这个实验仿真,求解?
?
?
四、指导教师评语及成绩:
评语:
该同学实验报告详细认真,非常好完成了该次实验,并有所体会,有自己独立的思考,还做了一个自己的程序。
成绩:
93
指导教师签名:
批阅日期: