微原硬件实验报告班级:07118 班学号:070547班内序号:26姓名:杨帆实验一熟悉实验环境及IO的使用一,实验目的1. 通过实验了解和熟悉实验台的结构,功能及使用方法。
2. 通过实验掌握直接使用Debug 的I、O 命令来读写IO 端口。
3. 学会Debug 的使用及编写汇编程序二,实验内容1. 学习使用Debug 命令,并用I、O 命令直接对端口进行读写操作,2.用汇编语言编写跑马灯程序。
(使用EDIT 编辑工具)实现功能A.通过读入端口状态(ON 为低电平),选择工作模式(灯的闪烁方式、速度等)。
B.通过输出端口控制灯的工作状态(低电平灯亮)三,实验步骤1.实验板的IO 端口地址为EEE0H在Debug 下,I 是读命令。
(即读输入端口的状态---拨码开关的状态)O 是写命令。
(即向端口输出数据---通过发光管来查看)进入Debug 后,读端口拨动实验台上八位拨码开关输入I 端口地址回车屏幕显示xx 表示从端口读出的内容,即八位开关的状态ON 是0,OFF 是 1 写端口输入O 端口地址xx (xx 表示要向端口输出的内容)回车查看实验台上的发光二极管状态,0 是灯亮,1 是灯灭。
2. 在Debug 环境下,用a 命令录入程序,用g 命令运行C>Debug -amov dx, 端口地址mov al,输出内容out dx, almov ah, 0bhint 21hor al, aljz 0100int 20h-g运行查看结果,修改输出内容再运行查看结果分析mov ah, 0bhint 21hor al, aljz 0100int 20h该段程序的作用3.利用EDIT 工具编写汇编写跑马灯程序程序实现功能A.通过读入端口状态(ON 为低电平),选择工作模式(灯的闪烁方式、速度等)。
B.通过输出端口控制灯的工作状态(低电平灯亮) C>EDIT 文件名.asm录入程序按Alt 键打开菜单进行存盘或退出编译文件C>MASM 文件名.asm连接文件C>LINK 文件名.obj运行文件或用Debug 进行调试。
四,程序流程图图表1:实验1的程序流程图五,源程序代码DATA SEGMENT ;数据段BB DB 0FFH ;DATA ENDSSTACK SEGMENT PARA STACK 'STACK' ;堆栈段DB 100 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE, SS:STACK ,DS:DATA BEGIN:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV BL,7FHBEG:MOV DX,0EEE0HMOV AL,BLOUT DX,AL ;点亮第8盏灯CALL COUNT ;延时MOV BL,ALIN AL,DXTEST AL,01H ;最低位拨码被按下?方向选择MOV AL,BLJZ RLRR: ROR AL,1 ;未按键,则向右点亮JMP R1RL:ROL AL,1 ;按下则向左点亮R1:MOV BL,ALMOV AH,0BHINT 21H ;检查键盘缓冲区OR AL,ALJZ BEGMOV AX,4C00HINT 21HCOUNT PROC NEAR ;延时子程序PUSH AXMOV DX,0EEE0HIN AL,DX ;检测拨码状态MOV AH,0MOV BX,0ADD BX,AXPOP AXCOU1: MOV CX,0FFFFHCOU2: LOOP COU2COU3: DEC BX ;调速JNZ COU1RETCOUNT ENDPCODE ENDSEND BEGIN六,思考题通过实验说明用debug 中的 a 命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。
通过观察可以发现,编码时,凡是十六进制数据都是要加H的,而地址则不用。
这是因为编译时所能识别的数据有多种,为了保证编译正常进行,必须要告诉编译器数据的类型。
而地址只有默认的16进制形式,所以不需指定类型就能完成正确的编译,所以无须加H。
而在DEBUG环境下,它的默认数据格式就是十六进制的,所以就不需要写出“H”字符;否则通不过编译。
七,实验收获和体会在这次实验中,我们初步熟悉了在Debug环境下使用I/O命令,实现了对拨码开关状态的读取以及对发光二极管亮灭的控制,即初步尝试了对于微机接口的控制。
通过控制发光二极管的亮与灭,结合相关程序的设计,我们实现了一个简单的跑马灯程序。
结合查询拨码开关的状态,能够实现点亮发光二极管的方向、模式和速度的调整。
这个跑马灯实验的程序使用的是简单的分支结构。
这次实验的要点是对I/O接口译码电路的理解以及使用,通过在Debug环境下的I/O命令,我们测试了外设功能,这使我们了解了地址与端口的对应情况,从而明确了跑马灯程序编写的流程和注意事项。
通过该译码电路实验,我掌握了地址译码电路的设计方法和实现原理,对硬件的I/O接口技术有了进一步的认识。
这次实验也为以后的实验打下了基础,特别是,应先理解了译码电路的工作原理,然后才能进行编程。
实验二8255A并行接口应用一,实验目的1.掌握8255A 的功能及方式0、1 的实现2.熟悉8255A 与CPU 的接口,以及传输数据的工作原理及编程方法。
3.了解七段数码管显示数字的原理。
4.掌握同时显示多位数字的技术。
二,实验内容在实验一的基础上学习PIO 芯片(8255)编程应用,熟悉平台的主要内容。
CS 用Y0 (EE00H)(一) 简要说明:在方式0(输入/输出)下,以 A 口为输出口,B 口为输出口, A 口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段, B 口接数码管的位选(即要使哪个数码管亮), 高电平选中某一位数码管点亮。
8255A 中A 端口地址E E00HB 端口地址E E01HC 端口地址E E02H控制地址EE03H 八段数码管的显示规律及数码管的位选规律自己查找,可用实验一中,学过的I、O 命令来做。
(二)6 位数码管静态显示在数码管电路上静态地显示6 位学号,当主机键盘按下任意键时,停止显示,返回DOS。
提示:该电路 6 个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型编码之后,6 个数码管都有可能显示出相同的数字。
如果要使 6 个数码管“同时”显示不同的数字,必须采用扫描显示的方法,通过选位寄存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;如果在一秒钟内,每一位数码管都能显示30 次以上,则人眼看到的是几位数码管同时在显示。
实验证明,在扫描显示过程中,每一位显示延迟1ms 是最佳选择。
(三)6 位数码管动态显示要求在数码管电路1-6 位数码管上按图 3.2 所示的规律,动态显示字符串HELLO,当主机键盘按下任意键时结束。
二,程序流程图程序一:静态显示学号图表2:静态显示学号的程序流程图四,源程序代码程序一:显示静态学号DATA SEGMENT ;数据段SHOW DB 0EDH,61H,0EDH,0d9H,39H,61H;”0”,”7”,”0”,”5”,”4”,”7”COUNT EQU $-SHOWCAT DB 01H ;8段数码管选通信号DATA ENDSSTACK SEGMENT STACK'STACK'DB 100H DUP(?)STACK ENDS ;代码段CODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACK START PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXNEXT: MOV CX,COUNTLEA BX,SHOWMOV CAT,01H ;最先点亮第1个数字AGAIN:MOV AL,80H ;8255的方式选择MOV DX,0EE03H ;A口方式0输出OUT DX,AL ;B口方式0输出MOV AL,CATMOV DX,0EE01H ;B口为数码管选通端口OUT DX,ALMOV AL,[BX]MOV DX,0EE00H ;A口为8段数码管OUT DX,AL ;依次显示学号数字MOV AL,00HMOV DX,0EE00HOUT DX,AL ;熄灭INC BXSHL CAT,1 ;左移点亮数字位置LOOP AGAINMOV AH,0BH ;检测键盘缓冲区INT 21HOR AL,ALJZ NEXTRETSTART ENDPCODE ENDSEND START程序二:动态显示HELLODATA SEGMENT ;数据段COUNTDOWN DW ? ;时延计数器SPDCOUNT DW 00H ;控速计数器LEDCOUNT DB 00H ;LED COUNT CATCOUNT DB 00H ;CAT COUNT TMP DB 00HLED DB ?CAT DB 01H ;数码管选通信号SPEED DW 0000HDATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE, DS:DATA, SS:STACK;延时子程序DELAY1 PROCMOV COUNTDOWN,03FFH LOOPD: DEC COUNTDOWNJNZ LOOPDRETDELAY1 ENDP;给变量LED赋值的子程序ENCODE PROC;根据LEDCOUNT的当前值,给变量LED赋值;使其显示相应的字符CMP LEDCOUNT,00HJA EN1MOV LED,00H ;BLANK "_"JMP NEXTEN1: CMP LEDCOUNT,01HJA EN2MOV LED,00H ;BLANK "_"JMP NEXTEN2:CMP LEDCOUNT,02HJA EN3MOV LED,00H ;BLANK "_" JMP NEXTEN3:CMP LEDCOUNT,03HJA EN4MOV LED,00H ;BLANK "_" JMP NEXTEN4:CMP LEDCOUNT,04HJA EN5MOV LED,00H ;BLANK "_" JMP NEXTEN5: CMP LEDCOUNT,05HJA EN6MOV LED,00H ;BLANK "_"JMP NEXTEN6: CMP LEDCOUNT,06HJA EN7MOV LED,3DH ;”H”JMP NEXTEN7: CMP LEDCOUNT,07HJA EN8MOV LED,0DCH ;”E”JMP NEXTEN8: CMP LEDCOUNT,08HJA EN9MOV LED,8CH ;”L”JMP NEXTEN9:CMP LEDCOUNT,09HJA ENAMOV LED,8CH ;”L”JMP NEXTENA:CMP LEDCOUNT,0AHJA ENBMOV LED,0EDH ;”O”JMP NEXTBENB:MOV LED,00H ;BLANK "_"NEXTB: RET;这里请注意:若要改变LED点亮的模式,改变ENCODE子程序中;变量LED的赋值模式即可ENCODE ENDP;循环点亮控制子程序;CAT是8段数码管的选通信号,这个子程序将;根据当前CATCOUNT的值给CAT赋值CATENCO PROCCMP CATCOUNT,00HJA EB1MOV CAT, 01HJMP NEXTEB1: CMP CATCOUNT,01HJA EB2MOV CAT, 02HJMP NEXTEB2: CMP CATCOUNT,02HJA EB3MOV CAT, 04HJMP NEXTEB3: CMP CATCOUNT,03HJA EB4MOV CAT, 08HJMP NEXTEB4:CMP CATCOUNT,04HJA EB5MOV CAT, 10HJMP NEXTEB5: MOV CAT, 20HNEXT: RETCATENCO ENDP;主程序START:MOV AX, DATAMOV DS, AXMOV ES, AXMOV AL, 80H ;8255初始化MOV DX, 0EE03HOUT DX, AL;A口方式0输出,B口方式0输出,C口无关S1S:MOV DX,0EEE0H ;检测拨码开关状态IN AL, DX ;若拨码开关最低位置位MOV SPEED,0FFFH ;则选择快速模式AND AL, 01H ;未被置位则选择慢速模式JZ FL3MOV SPEED 07FFH ;快速模式FL3:INC CATCOUNTCMP CATCOUNT,06H ;一轮是否显示完毕?JB FL1MOV CATCOUNT,00H ;CATCOUNT值回零INC SPDCOUNTMOV DX,SPEEDCMP SPDCOUNT,DX ;根据速度选择,JB FL1 ;控制改变CAT的频率MOV SPDCOUNT,00HINC TMPCMP TMP,06HJB FL1MOV TMP,00HFL1: MOV DL,CATCOUNTADD DL,TMPMOV LEDCOUNT,DLCMP LEDCOUNT,0CHJB FL2SUB LEDCOUNT,0CHFL2: CALL CATENCO ;依次点亮数码管MOV DX, 0EE01HMOV AL, CATOUT DX, ALCALL ENCODE ;选择此数码管显示的字符MOV DX, 0EE00HMOV AL, LEDOUT DX, ALCALL DELAY1 ;调用延时子程序MOV AH, 0BH ;检测键盘缓冲区INT 21HOR AL, ALJZ S1SMOV AX, 4C00HINT 21HCODE ENDSEND START五,实验心得与体会这次实验中,我们使用8255A并行接口芯片和数码管实现了一个数码管的静态和动态显示字符的程序。