《计算机硬件技术基础》实验答案程序

上传人:沈*** 文档编号:119550905 上传时间:2022-07-15 格式:PDF 页数:36 大小:56.77KB
返回 下载 相关 举报
《计算机硬件技术基础》实验答案程序_第1页
第1页 / 共36页
《计算机硬件技术基础》实验答案程序_第2页
第2页 / 共36页
《计算机硬件技术基础》实验答案程序_第3页
第3页 / 共36页
点击查看更多>>
资源描述
实验一:简单程序设计实验(1)编写一个 32 位无符号数除法的程序,要求将存放在NUM1 中的 32 位无符号数与存放 在 NUM2 中的 16 位无符号数相除,结果存放在NUM3 和 NUM4 中。程序流程图略。参考源程序:DATA SEGMENT NUM1 DD 2A8B7654H NUM2 DW 5ABCH NUM3 DW?NUM4 DW?DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA;数据段寄存器初始化MOV DS,AX MOV AX,WORD PTR NUM1 MOV DX,WORD PTR NUM1+2 DIV NUM2 MOV NUM3,AX MOV NUM4,DX MOV AH,4CH;正常返回 DOS系统INT 21H CODEENDS END START(2)编写一个拆字程序。要求将存放在ARY 单元的 2 位十六进制数X1X2 拆为 X1 和 X2 两 部分,并以 0X1 和 0X2 的形式分别存入ARY+1 和 ARY+2 单元中。程序流程图略。参考源程序:DATA SEGMENT ARY DB 2AH,?,?DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET ARY;取ARY 的偏移地址MOV AL,SI;取16进制数至 ALMOV BL,AL AND AL,0F0H;取16进制数的高四位,即X1SHR AL,4 MOV SI+1,AL;存0X1MOV AL,BL AND AL,0FH;取16进制数的低四位,即X2MOV SI+2,AL;存0X2MOV AH,4CH INT 21H CODE ENDS END START实验二:分支程序设计实验(1)编写一个字符比较程序,比较3 个无符号字节数A,B,C 的大小,并根据比较结果对变量 K 赋值:如果 3 个数不相等,则K=0;如果 3 个数中有两个相等,则K=1;如果 3 个数都相等,则K=2。程序流程图略。参考源程序:DATA SEGMENT;定义待比较数A、B、C,比较结果 KA DB 20H B DB 20H C DB 20H K DB?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,A CMP AL,B;对 A、B进行比较,不相等则转到COMP2 JNE COMP2;相等则比较A、CCMP AL,C JNE K1;A、C不相等则 K=1JMP K2;A、C相等则 K=2COMP2:MOV BL,B CMP BL,C JE K1;对 B、C进行比较,相等则K=1 CMP AL,C JE K1;对 A、C进行比较,相等则K=1K0:MOV K,0 JMP EXIT K1:MOV K,1 JMP EXIT K2:MOV K,2 EXIT:MOV AH,4CHINT 21H CODE ENDS END START(2)编写一个能实现下列表达式的程序:?N=?A+BA B设 A,B,C 为小于 128 的正整数。?A-B+C程序流程图略。参考源程序:DATA SEGMENTA BA DB 22H;定义 A、B、C、N B DB 10H C DB 01H N DB?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,A CMP AL,B JG CALCUL;A 小于或等于B 则 N=A+B ADD AL,B JMP EXIT CALCUL:SUB AL,B ADC AL,C EXIT:MOV N,AL MOV AH,4CH INT 21H CODE ENDS END START实验三循环程序设计实验(1)将字符串 STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。统计结果存于N单元中。程序流程图略。参考源程序:DATA SEGMENT STRN DB What$;任意定义一个字串,以“$”结尾COUNT EQU$-STRN N DB?BUF DB COUNT DUP(?)DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,DATA MOV ES,AX LEA SI,STRN LEA DI,BUF MOV CX,COUNT MOV AL,0 LP1:MOV BL,SI;逐个取字符进行判断AND BL,BL;自己和自己做与运算JP NEXT;根据 PF 标志位的变化进行跳转INC AL OR BL,80H NEXT:MOV DI,BL INC SI INC DI LOOP LP1 MOV N,AL MOV AH,4CH INT 21H CODE ENDS END START(2)在 FIRST 开始的一片连续的数据区中存放着100 个数据,编写一个程序,统计第1个数据 0之前的数据个数。程序流程图略。参考源程序:DATA SEGMENT FIRST DB 10H,24H,34H,73H,20H,44H,03H,36H,41H;任取 9 个数做演示COUNT EQU$-FIRST NUM DB?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DL,0;计数值初始为0 MOV CX,COUNT MOV BX,OFFSET FIRST LP1:MOV AL,BX;每次取一个数,与0 比较CMP AL,00H JNE NEXT JMP EXIT;找到 0 则退出NEXT:INC DL;没找到 0 则计数值加 1INC BX LOOP LP1 EXIT:MOV NUM,DL MOV AH,4CH INT 21H CODE ENDS END START实验四:子程序设计实验将BUF开始的 10个单元中两位十六进制数转换成ASCII 码,并在屏幕上显示出来。要求码型 转换通过子程序 HEXASC 实现,参数传送采用寄存器传送方式。程序流程图略。参考源程序:(1)实现方法一:远过程调用DATA SEGMENT BUF DB 10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H COUNT EQU$-BUF;定义任意长度的一段BUF DATA ENDS STACK1 SEGMENT STACK DB 100 DUP(?);设置足够深度的栈区STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV CX,COUNT AGAIN:MOV AL,SI;逐个取数MOV BL,AL SHR AL,4 AND AL,0FH;先对高字节部分转换(寄存器AL 传参)CALL FAR PTR HEXASC;调用子程序MOV DL,AL MOV AH,02H;显示高字节部分对应的字符INT 21H MOV AL,BL AND AL,0FH;再对低字节部分转换(寄存器AL 传参)CALL FAR PTR HEXASC;调用子程序MOV DL,AL MOV AH,02H;显示低字节部分对应的字符INT 21H MOV DL,20H MOV AH,02H;显示空格INT 21HINC SI LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS CODEB SEGMENT ASSUME CS:CODEB HEXASC PROC FAR CMP AL,09H;判断是不是数字JA HEXATOF;是字母则转到 HEXATOFADD AL,30H;是数字则对应到数字的ASCII 码JMP ENDHEX HEXATOF:ADD AL,37H;是字母则对应到字母的ASCII 码ENDHEX:RET HEXASCENDP CODEBENDS END START(2)实现方法二:近过程调用DATA SEGMENT BUF DB 10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H COUNT EQU$-BUF;定义任意长度的一段BUF DATA ENDS STACK1 SEGMENT STACK DB 100 DUP(?);设置足够深度的栈区STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV CX,COUNT AGAIN:MOV AL,SI;逐个取数MOV BL,AL SHR AL,4 AND AL,0FH;先对高字节部分做转换CALL HEXASCMOV DL,AL;显示高字节部分对应的字符MOV AH,02H INT 21H MOV AL,BL AND AL,0FH;再对低字节部分做转换CALL HEXASC MOV DL,AL;显示低字节部分对应的字符MOV AH,02H INT 21H MOV DL,20H;显示空格MOV AH,02H INT 21H INC SI;继 续 循 环 或退出LOOP AGAIN MOV AH,4CH INT 21H HEXASC PROC NEAR CMP AL,09H JA HEXATOF ADD AL,30H JMP ENDHEX HEXATOF:ADD AL,37H ENDHEX:RET HEXASC ENDP CODE ENDS END START实验五:DOS 中断调用实验(1)如果从键盘上依次输入的是一个数字和一个字母,则输出“RIGHT”标记后结束程序,否则输出标记“ERROR”后转向原出错处重做。试编程实现该功能。程序流程图略。参考源程序:DATA SEGMENT MSG DB 0AH,0DH,RIGHT,0AH,0DH,$WRN DB 0AH,0DH,ERROR,0AH,0DH,$DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX AGAIN:MOV AH,01H;等待用户输入1 个字符并显示INT 21H CMP AL,39H JA EMSG CMP AL,30H JB EMSG;判断输入是否是数字,不是则报错MOV AH,01H;等待用户输入1 个字符并显示INT 21H CMP AL,A JB EMSG CMP AL,Z;判断输入是否是大写字母,不是则继续JB EXIT;判断是不是小写字母CMP AL,a JB EMSG CMP AL,z JB EXIT;不是字母则报错,是字母则转到EXIT EMSG:LEA DX,WRN MOV AH,09H INT 21H JMP AGAIN EXIT:MOV DX,OFFSET MSG MOV AH,09H;显示“RIGHT”并退出INT 21H MOV AH,4CHINT 21H CODEENDS END START(2)编写一程序分类统计字符个数:即接收键入的一串字符(字符个数不超过 50个,该字符串用回车作为结束),并按数字、字母和其它字符分类计数,然后将结果存入digit、letter 和other 3个存储单元中,并显示结果。程序流程图略。参考源程序:DATASEGMENT MSG1 DB 0AH,0DH,Number of digit:,20H,$MSG2 DB 0AH,0DH,Number of letters:,20H,$MSG3 DB 0AH,0DH,Number of other characters:,20H,$BUF DB 50 DB 0 DB 50 DUP(?);设置足够深的栈区DIGIT DB?LETTER DB?OTHER DB?DATAENDS STACK1 SEGMENT STACK DB 100 DUP(?)STACK1ENDS CODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV AH,0AH;等待用户输入字符串并显示MOV DX,OFFSET BUF INT 21H MOV SI,OFFSET BUF MOV CL,SI+1 MOV CH,00H MOV AL,00H MOV AH,00H MOV BH,00H AGAIN:MOV BL,SI+2 CMP BL,30H JB OTH;ASCII 码小于 30H 则归类为“其它”CMP BL,3AHMOV LETTER,BH MOV OTHER,ALMOV DX,OFFSET MSG1 MOV AH,09H INT 21H MOV AL,;显示“数字”有多少个MOV DX,OFFSET MSG2 MOV AH,09H INT 21H MOV AL,;显示“字母”有多少个MOV DX,OFFSET MSG3 MOV AH,09H INT 21H MOV AL,;显示“其它”有多少个MOV AH,4CH INT 21HDISPPROC NEAR;显示子程序JB DIG;ASCII 码大于等于30H 小于 3AH 则归类为“数字”CMP BL,41H JB OTH;ASCII 码大于等于 3AH 小于 41H 则归类为“其它”CMP BL,5BH JB LET;ASCII 码大于等于 41H 小于 5BH 则归类为“字母”CMP BL,61H JB OTH;ASCII 码大于等于 5BH 小于 61H 则归类为“其它”CMP BL,7BH JB LET;ASCII 码大于等于61H 小于 7BH 则归类为“字母”OTH:INC AL;“其它”计数器加 1DIG:JMP ENDLP;“数字”计数器加 1LET:JMP ENDLP;“字母”计数器加 1ENDLP:INC SI LOOP AGAIN;继续循环MOV DIGIT,AH;统计各类个数MOV AH,00H MOV DH,0AH DIV DH MOV CH,AH ADD AL,30H MOV DL,AL MOV AH,02H INT 21H ADD CH,30H MOV DL,CH MOV AH,02H INT 21H RET DISPENDP CODE ENDS END START实验六:扩展定时器/计数器接口实验(1)计数器 0工作于方式 3,编写初始化程序,观察其输出OUT0 信号的波形。修改计数初值,观察 OUT0 信号的变化情况。硬件连接方法:8254计数器 0的CLK0 端接规则的脉冲输入(频率自选),OUT0接示波器的 正极;示波器负极接地。程序流程图略。参考源程序:DATA SEGMENT DB 100 DUP(?)DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,20FH;写入计数器 0的控制字MOV AL,00010110B OUT DX,AL MOV DX,20CH;写入计数器 0的计数初值MOV AL,05H OUT DX,AL MOV AH,4CH INT 21H CODE ENDS END START(2)将计数器 1和计数器 0级联起来,二者均工作于方式3,编写初始化程序,观察 OUT1 和OUT0 信号的波形,说明二者的关系。修改计数初值,观察 OUT0 和OUT1 输出波形的变化情况。硬件连接方法:8254计数器1的CLK1 端接规则的脉冲输入(频率自选),OUT1接8254计数 器0的CLK0,计数器 0的输出 OUT0接示波器正极;示波器负极接地。程序流程图略。参考源程序:DATA SEGMENT DB 100 DUP(?)DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,20FH MOV AL,00010110B;写入计数器 0的控制字OUT DX,AL MOV DX,20CH;写入计数器 0的计数初值MOV AL,05H OUT DX,AL MOV DX,20FH MOV AL,01010110B;写入计数器 1的控制字OUT DX,AL MOV DX,20DH;写入计数器 1的计数初值MOV AL,02H OUT DX,AL MOV AH,4CH INT 21H CODE ENDS END START实验七:并行输入/输出接口 8255A 简单编程实验(1)利用 8255A 的 B 口输出控制两组发光二级管L1,L3,L5,L7 和L2,L4,L6,L8 亮灭交替变化。分析:按照题目要求,当8255A 的 B 口输出为01010101B(55H)时,发光二极管 L1,L3,L5,L7 会被点亮,当8255A 的 B 口输出为 10101010B(0AAH)时,发光二极管L2,L4,L6,L8 会被点 亮。因此,通过延时改变8255A 的 B 口输出,即可实现两组发光二极管的亮灭交替变化。由于 LED 随时出于准备好的状态,因此8255A 的 B 口可工作于方式0 输出,其它端口未使用,无需考虑。因此,8255A 的方式控制字为:10000000B(80H)。硬件连接方法:8255A 的 B 口 PB0PB7 分别连接L1L8。程序流程图略。参考源程序:.486 DATA SEGMENT PORTA DW 208H;8255A端口 A地址PORTB DW 209H;8255A端口 B地址PORTC DW 20AH;8255A 端口 C地址PORT_CTR DW 20BH;8255A 控制端口地址DATA ENDS STACK1 SEGMENT STACK DB 100 DUP(?)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV DX,PORT_CTR MOV AL,10000000B;8255A初始化;控制字OUT DX,ALMOV DX,PORTB MOV AL,00H OUT DX,AL;8255A 端口 B清零,LED 初始化(全灭)LP0:MOV BL,01010101B MOV AL,BL OUT DX,AL CALL DELAYNOT AL MOV BL,AL MOV AH,01H;调用 BIOS的 16H功能判断键盘是否有输入INT 16H JNZ EXIT JMP LP0 EXIT:MOV AH,4CH INT 21H DELAY PROC NEAR;延时子程序(可通过修改 NOP指令数量改变延时时间)MOV ECX,0FFFFFFFH LP2:NOP LOOPD LP2 RET DELAY ENDP CODE ENDS END START(2)利用 8255A 的 A 口读入 8 个开关 K1K8 的状态,当只有K1 合上时,L1L8 显示00000001B;当只有K1 和 K2 合上时,L1L8 显示 00000010B;当只有K1,K2 和 K3 合上 时,L1L8 显示 00000011B;当只有 K1,K2,K3 和 K4 合上时,L1L8 显示 00000100B;直到所有开关合上时,L1L8 显示00001000B,并结束程序的运行。发光二极管的状态通过 8255A 的 B 口进行控制。分析:按照题目要求,可以通过查询的方式读取8255A 的 B 口状态,并根据查询的结果给A 口送出相应数据,A 口工作在方式0 的输入状态,B 口工作在方式0 输出状态,C 口不需要考虑,所以8255A 的方式控制字为:10010000B)硬 件 连 接 方法:(1)8255A 的 A 口 PA0PA7 对应连接 K1K8;(2)8255A 的 B 口 PB0PB7 对应连接L1L8;源代码:DATA SEGMENT LIST DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH DATA ENDS STACK1 SEGMENT STACK DB 100 DUP(?)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATAMOV DS,AX MOV DX,20BH;8255A 初始化MOV AL,10010000B OUT DX,AL MOV DX,209H;8255A 的B口清零,LED 初始化(全灭)MOV AL,00H OUT DX,AL L0:MOV DX,208H;读8255A 的A口,获得开关状态IN AL,DX MOV BL,00H MOV CX,8 MOV SI,OFFSET LIST L1:INC BL CMP AL,SI JZ FIND INC SI LOOP L1 JMP L0FIND:MOV AL,BL MOV DX,209H;当前开关状态为表中所列状态之一;显示 LED 状态OUT DX,AL CMP AL,08H JNZ L0MOV AH,4CH INT 21HCODE ENDS END STARTDATASEGMENTPORT0 DW 20CH;8254计数器 0端口地址PORT1 DW 20DH;8254计数器 1端口地址PORT2 DW 20EH;8254计数器 2端口地址PORT3 DW 20FH;8254控制寄存器端口地址PORTA DW 208H;8255A的A口端口地址PORTB DW 209H;8255A的B口端口地址PORTC DW 20AH;8255A 的C口端口地址DATAPORT_CTR DW 20BH ENDS;8255A 的控制寄存器端口地址实验八:并行输入/输出接口 8255A 综合应用实验(1)利用 8254计数器 0、计数器 1和8255A的B口实现对发光二极管的定时控制,让 8个发光 二极管每隔 1s从左到右依次点亮。(要求计数器1的时钟脉冲频率为 250kHz)。分析:根据题目要求,需要利用8254进行定时 1s控制,定时到后,改变8255A的B口输出。可以利用中断的方式实现,8254定时到时向 CPU申请中断,CPU相应中断后在中断程序中改变8255A的B口输出。由于题目要求 8254的输入脉冲频率为250kHz,所以需要级联计数器 1和计数器 0实现 1s 定时(参考程序中利用计数器1进行 20ms定时,计数器 0进行 50次计数,计数次数到时由 OUT0 向CPU申请中断)。8255A的B口控制 LED,可工作在方式0输出,A口未使用,为了选通实验板上的中断输入C口的 PC7须输出低电平,因此 C口的高四位工作在方式0输出。综合上述要求,8254和8255A的初始化参数为:8254计数器 1的计数初值为:N=20ms/4 s=5000D;方式控制字为:01110100B(74H)8254计数器 0的计数初值为:N=50D;方式控制字为:00010100B(14H)8255A的方式控制字:10000000B (80H);C口按位置位/复位控制字:00001110B(0EH)(使PC7复位,允许 8254的OUT0中断到达系统 8259的IRQ3端)此外,利用中断方式实现题目要求的功能还需要设置系统8259芯片的中断屏蔽字和系统存储器中的中断向量表(修改中断类型号为0BH的中断向量)。硬 件 连 接 方法:(1)250kHz脉冲输出接 8254的CLK1,OUT1接CLK0,OUT0接IRQ;(2)8255A的B口PB0PB7对应连接L1L8。程序流程图略。参考源程序:STACK1 SEGMENT STACK DB 100 DUP(0)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK1START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AL,80H;8255初始化,B口方式 0输出,C口高 4位输出MOV DX,PORT_CTR OUT DX,AL MOV AL,0EH;PC7清零,允许 8254中断到 IRQ3 OUT DX,AL MOV AL,00H;发光二极管初始化(全灭)MOV DX,PORTB OUT DX,AL MOV AX,350BH;保存系统原有0BH 号中断的中断向量至堆栈INT 21H PUSH ES PUSH BX MOV AX,SEG INTPROC MOV DS,AX MOV DX,OFFSET INTPROC MOV AX,250BH;将程序要求的中断向量写入INT 21H IN AL,21H;设置 8259的IMR 寄存器,允许IRQ3中断AND AL,0F7H OUT 21H,AL STI;开中断,CPU可以响应外部可屏蔽中断MOV DX,PORT3;8254计数器 0初始化MOV AL,14H OUT DX,AL MOV DX,PORT0;计数器 0写入计数初值50D MOV AL,50D OUT DX,AL MOV DX,PORT3;8254计数器 1初始化MOV AL,74H OUT DX,AL MOV DX,PORT1;计数器 1写入计数初值5000D MOV AX,5000D OUT DX,AL MOV AL,AH OUT DX,ALMOV BH,80H;BH 存放当前 8255A 的B口输出MOV AL,BH MOV DX,PORTB;8255A 的B口输出OUT DX,AL WAIT0:NOP NOP NOP MOV AH,01H;判断键盘上是否有键按下,若有则结束程序INT 16H JNZ EXIT JMP WAIT0 EXIT:POP DX;恢复中断向量表中的原有0BH号中断向量POP DS MOV AX,250BH INT 21H MOV AH,4CH INT 21H INTPROC PROC NEAR MOV AL,BH ROR AL,1 MOV BH,AL MOV DX,PORTB;向8255A 的B口写出数据,点亮对应LED OUT DX,AL MOV AL,20H;向8259发出中断结束命令OUT 20H,AL IRET INTPROC ENDP CODE ENDS END START(2)8255A的A口与 8个开关相连,工作于方式1下,要求:利用当前的开关状态通过 B口控 制L1L8 的亮或灭。A口的/STBA选通信号由按键 K发出,每按一次 K键,读入当前开关状态。分析:8255A的B口用来控制 LED 的亮灭,可工作在方式0下。根据题意,可以通过查询方式不断读取8255A的C口状态确定 K键是否按下,也可以利用中断方式,当 K键按下时,由 INTRA(PC3)向 CPU申请中断。当判断K键按下后,读取8255A的A口状态,并通过 B口显示到 LED 上。利用查询方式实现时,仅需要给定方式选择控制字;利用中断方式实现时,除控制字外还需设定INTEA 为1,允许 INTRA 申请中断。因此,8255A的方式控制字为:10110000B(0B0H);使 INTEA(PC4)置1,其控制字为00001001B(09H)。注意:利用中断方式实现时还需要置PC7为0,使INTRA 能到达 8259的IRQ3硬件连接与参考源程序:(1)利用查询方式实现 硬件连接:1)8255A的A口PA0PA7与K1K8 对应相连;2)8255A的B口PB0PB7与L1L8对应相连;3)按键 K接8255A的C口PC4。参考源程序:CODE SEGMENT ASSUME CS:CODE START:MOV AL,0B0H;8255A 初始化,方式控制字10110000B MOV DX,20BH OUT DX,AL MOV DX,209H;LED 初始化MOV AL,00H OUT DX,AL AGAIN:MOV AH,01H;判断计算机键盘上是否有键按下,若有结束程序INT 16H JNZ EXIT MOV DX,20AH;读入 8255A 的C口状态IN AL,DX TEST AL,00010000B;判断 PC4=1?(K键是否按下)JNZ AGAIN MOV DX,208H;读入 8255A 的A口状态IN AL,DX MOV DX,209H;将A口状态送 8255A 的B口OUT DX,AL JMP AGAIN EXIT:MOV AH,4CH INT 21H CODE ENDS END START(2)利用中断方式实现 硬件连接:1)8255A的A口PA0PA7与K1K8 对应相连;2)8255A的B口PB0PB7与L1L8对应相连;3)按键 K接8255A的C口PC4;4)8255A的C口PC3(INTRA)接IRQ。参考源程序:DATASEGMENTPORTA DW 208H;8255A的A口地址PORTB DW 209H;8255A的B口地址PORTC DW 20AH;8255A的C口地址DATAPORT_CTR DW 20BH ENDS;8255A的控制口地址STACK1 SEGMENT STACK DB 100 DUP(0)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV DX,PORT_CTR;写入 8255A 方式控制字 0B0H MOV AL,0B0H OUT DX,AL MOV AL,09H;写入 C口按位置位控制字,PC4置“1”OUT DX,AL MOV AL,0EH;写入 C口按位复位控制字,PC7置“0”,开IRQ OUT DX,AL MOV AX,350BH;保存系统原有中断号为0BH的中断向量到堆栈INT 21H PUSH ES PUSH BX MOV AX,SEG INTPROC;向0BH 号中断写入新的中断向量MOV DS,AX MOV DX,OFFSET INTPROC MOV AX,250BH INT 21H IN AL,21H;允许 8259的IRQ3中断AND AL,0F7H OUT 21H,AL STI;允许 CPU响应可屏蔽中断WAIT0:MOV AH,01H;判断是否有键按下,若有则结束程序,若无则等待INT 16H JZ WAIT0 POP DX;恢复系统中断向量表POP DS MOV AX,250BH INT 21H MOV AH,4CH INT 21H INTPROC PROC NEAR MOV DX,PORTA;读入 8255A 端口 A的状态(开关状态)IN AL,DX MOV DX,PORTB;从8255A 的B口输出开关状态,由对应的LED 显示OUT DX,AL MOV AL,20H;给8259发中断结束指令OUT 20H,AL IRET INTPROC ENDP CODE ENDS END START实验九:LED 显示器接口实验(1)编制一个从左到右循环显示字符“8”的程序,要求每个字位的停留时间约为 1s,当从标 准键盘上按下任意键时结束程序。分析:根据题意要求,实验板上的 6位8段数码管的段选信号均相同,为字符“8”的段码(80H)。为了实现从左到右循环显示且每个字位停留约1s的功能,只需要每隔一秒给位选信号赋值,选通/断开相应的位即可。当循环显示到最右端时,延时1s再从最左端开始显示。为此,在该题中我们利用 8255A的A口作为 6位LED 显示器的段选口(地址208H),8255A的B口作为 6 位LED 显示器的位选口(地址 209H)。8255A的控制字为:10000000B(80H)硬 件 连接:(1)8255A的A口PA0PA7分别对应连接 LED 显示器的段选输入 ah.(2)8255A的B口PB0PB5分别对应连接 LED1LED6 显示器的位选输入。程序流程图略。参 考 源 程序:.486 STACK1 SEGMENT STACK DB 100 DUP(0)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START:MOV AL,80H;8255A 工作方式初始化,A口方式 0输出,B口方式 0输出MOV DX,20BH OUT DX,AL MOV AL,80H;8255A 的A口输出字符“8”的段码 80H MOV DX,208H OUT DX,AL L1:MOV BL,20H;LED 显示器位选信号存放在BL 中,20H表示最左边一位L2:MOV AL,BL;将LED 位选信号输出到8255A 的B口MOV DX,209H OUT DX,AL CALL DELAY;调研软件延时程序MOV AH,01H;判断标准键盘上是否有键按下,若有则结束程序INT 16H JNZ EXIT SHR BL,1;LED 位选信号右移一位,选中下一位LED JNZ L2 JMP L1;当循环到最右边一位LED 时,重新填充BL 值,开始新一轮循环EXIT:MOV DX,208HMOV AL,0FFH OUT DX,AL MOV DX,209H MOV AL,00H OUT DX,AL;关闭所有 LED MOV AH,4CH INT 21H DELAY PROC NEAR MOV ECX,0FFFFFFFH LP:LOOPD LP RET DELAY ENDP CODE ENDS END START(2)完成多位 LED 显示器的显示,即设计一个显示字符串1234.56的程序,当标准键盘上有任意键按下时结束程序。基本思想:借助动态扫描、分时显示的办法,利用人眼视觉的滞留效应,实现人眼看上去的各位“同时”显示。分析:利用实验操作面板上引出的8255A的分别 A口和 B口作为 6位8段LED显示器的位选口和段选口,从段选口依次输出待显示字符的段码,并选通相应的位实现对多位 LED显示器的刷新。8255A的A口和B口均工作在方式 0的输出方式,方式控制字为:1000000B(80H)。硬件连接:(1)8255A的A口PA0PA5对应连接 LED1LED6 的位选;(2)8255A的B口PB0PB7对应连接段选ah;程序流程图略。参考源程序:DATA SEGMENT SEGTAB DB 0C0H,0F9H,0A4H,0B0H;定义 0F的段码存储区DB 99H,92H,82H,0F8H DB 80H,98H,88H,83H DB 0C6H,0A1H,86H,8EH DISPMEM DB 01H,02H,03H,04H,05H,06H;定义显示缓冲区DATA ENDS STACK1 SEGMENT STACK DB 100 DUP(0)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START:MOV AX,DATA MOV DS,AX MOV AL,80H;8255A 初始化,A口输出,B口输出MOV DX,20BH OUT DX,AL L1:MOV AH,20H;预置位选信号LEA SI,DISPMEM;SI指向显示缓冲区LEA BX,SEGTAB;BX 指向段码存储区L2:MOV AL,SI XLAT CMP AH,04H JNE NEXT AND AL,7FH;第4位LED 显示小数点NEXT:MOV DX,209H;输出段码OUT DX,AL MOV DX,208H;输出位选信号MOV AL,AH OUT DX,AL MOV CX,4000;延时LP2:LOOP LP2 PUSH AX MOV AH,01H;判断标准键盘上是否有键按下,若有键按下则结束程序INT 16H JNZ EXIT POP AX INC SI;修改显示缓冲区指针SHR AH,1;修改位选信号JNZ L2 JMP L1 EXIT:MOV DX,208H MOV AL,00H OUT DX,AL MOV DX,209H MOV AL,0FFH OUT DX,AL;关闭所有 LED MOV AH,4CH INT 21H CODE ENDS END START实验十:键盘接口实验编制 1个用键盘控制模拟电动机转动的程序,即用非编码键盘上的A和B两个键作转、停控制,并在数码显示器上显示F表示电机转动,计算机屏幕上显示笑脸符表示电机停,按回车键结束程序执行(笑脸符的ASCII 码为02H)。分析:根据题目的要求,需要不断扫描4 4非编码键盘,判断键盘上A或B键(控制停转,在屏幕上显示笑脸)是否按下。若按下A键则在 LED上显示 F,表示电机转动;若按下 B键则在计 算机屏幕(CRT显示器)上显示笑脸,表示电机停转。可以用 8255A的C口作为非编码键盘的行扫描信号,同时作为 LED 的位选信号,B口作为 非编码键盘的列扫描信号,A口作为 LED的段选信号。8255A的C口工作在输出方式,B口工 作在输入方式,A口工作在输出方式,8255A的方式控制字为:10000010B(82H)硬件连接:(1)8255A的A口的 PA0PA7接段选信号 af;(2)8255A的B口的 PB0PB3接非编码键盘的列扫描端(J9)(3)8255A的C口的 PC0PC5接LED 的位选信号(同时也是非编码键盘的行扫描线)程序流程图略。参考源程序:DATA SEGMENT DISPTAB DB 0C0H,0F9H,0A4H,0B0H;定义 LED 显示字形码DB 99H,92H,82H,0F8H DB 80H,98H,88H,83H DB 0C6H,0A1H,86H,8EH KEYTAB DB 0E7H,0D7H,0B7H,077H;定义键值特征表DB 0EBH,0DBH,0BBH,07BH DB 0EDH,0DDH,0BDH,07DH DB 0EEH,0DEH,0BEH,07EH MSG DB PRESS ENTER TO END.,0AH,0DH,$;提示消息DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA DX,MSG;显示提示信息MOV AH,09H INT 21HMOV DX,20BH MOV AL,82H OUT DX,AL;8255A 初始化,A口段选输出,B口键盘列输入,C口键盘行输出MOV DX,208H;从段选口输出0FFH 关闭所有 LEDMOV AL,0FFHOUT DX,ALT1:MOV DX,20AH;使键盘行线为“0”MOV AL,00HOUT DX,ALLOP1:MOV DX,209H MOV AH,0BH;判断标准键盘上是否有键按下INT 21HCMP AL,0FFHJNZ T2 MOV AH,00H;读取标准键盘上所按键的ASCII 码INT 16H CMP AL,0DH;若回车键按下,则结束程序JZ EXITT2:IN AL,DX;读列线状态AND AL,0FHCMP AL,0FH JE LOP1;非编码键盘上无键按下,等待MOV BH,AL CALL DELAY MOV AL,0FEH MOV BL,AL;非编码键盘上有键按下,将列信号存入BH;延时去抖动;逐行扫描;BL 中存行扫描信号LOP2:MOV DX,20AHOUT DX,ALMOV DX,209HIN AL,DXAND AL,0FHCMP AL,0FH JNE LOP3;该行有键按下,转LOP3ROL BL,1MOV AL,BL JMP LOP2;无键按下换 1行LOP3:MOV DX,20AHMOV AL,3FHOUT DX,ALSAL BH,4AND BL,0FH OR BL,BH CALL DELAY LEA SI,KEYTAB;形成键值(列+行);延时,等待按键释放;查键值表找键代号MOV BH,0LOP4:MOV AL,SICMP AL,BL JE LOP5;找到键值转 LOP5INC BHINC SILOP5:JMP LOP4 CMP BH,0AH;判断是否是 A 键按下(非编码键盘)JNZ LOP6 CALL LEDXS;若是 A 按下,则调用LED 显示LOP6:CMP BH,0BH;判断是否是 B 键按下(非编码键盘)JNZ LOP7 MOV AL,00H;若是 B键按下,则关闭LED 显示MOV DX,20AHOUT DX,AL MOV DL,02H;在计算机屏幕上显示笑脸符(ASCII 码为 02H)MOV AH,02HLOP7:INT 21H JMP T1;返回键识别EXIT:MOV DX,208H;退出程序前关闭LED 显示MOV AL,0FFHOUT DX,ALMOV DX,20AHMOV AL,00HOUT DX,ALRETMAINENDPLEDXS PROC NEAR MOV AL,0FH;待显示字符 F 的代号存入 AL LEA BX,DISPTAB;BX 指向字形码表首XLAT;查表交换,将字符 F的字形码送 AL MOV DX,208H OUT DX,AL;送字形码MOV AL,3FH MOV DX,20AH OUT DX,AL;送位选信号RET LEDXS ENDPDELAY PROC NEAR;延时子程序MOV CX,0F000H DLP:LOOP DLP RET DELAY ENDP CODE ENDS END START
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!