《计算机硬件技术基础》实验答案程序..
更新时间:2024-05-18 12:33:01 阅读量: 综合文库 文档下载
实验一:简单程序设计实验
(1)编写一个 32 位无符号数除法的程序,要求将存放在 NUM1 中的 32 位无符号数与存放 在 NUM2 中的 16 位无符号数相除,结果存放在 NUM3 和 NUM4 中。
程序流程图略。 参考源程序:
DATA
SEGMENT
NUM1 DD 2A8B7654H NUM2 DW 5ABCH NUM3 DW ? NUM4 DW ?
DATA
ENDS SEGMENT
ASSUME DS:DATA, CS:CODE
;数据段寄存器初始化
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 INT 21H
CODE
;正常返回DOS系统
ENDS END START
(2)编写一个拆字程序。要求将存放在 ARY 单元的 2 位十六进制数 X1X2 拆为 X1 和 X2 两 部分,并以 0X1 和 0X2 的形式分别存入 ARY+1 和 ARY+2 单元中。 程序流程图略。 参考源程序:
DATA SEGMENT
ARY DB 2AH,?,?
DATA CODE
ENDS SEGMENT
ASSUME DS:DATA, CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET ARY MOV AL,[SI]
;取ARY的偏移地址 ;取16进制数至AL
第 1 页 共 31 页
MOV BL,AL AND AL,0F0H SHR AL,4 MOV [SI+1],AL MOV AL,BL AND AL,0FH MOV [SI+2],AL ;取16进制数的低四位,即X2 ;存0X2 ;存0X1
;取16进制数的高四位,即X1
MOV AH,4CH INT 21H
CODE
ENDS END START
第 2 页 共 31 页
实验二:分支程序设计实验
(1)编写一个字符比较程序,比较 3 个无符号字节数 A,B,C 的大小,并根据比较结果 对变量 K 赋值:
如果 3 个数不相等,则 K=0;
如果 3 个数中有两个相等,则 K=1; 如果 3 个数都相等,则 K=2。
程序流程图略。 参考源程序:
DATA
SEGMENT A DB 20H B DB 20H C DB 20H K DB ?
;定义待比较数A、B、C,比较结果K
DATA CODE
ENDS SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX MOV AL,A CMP AL,B JNE COMP2
;对A、B进行比较,不相等则转到COMP2 ;相等则比较A、C
CMP AL,C JNE K1 JMP K2
;A、C不相等则K=1 ;A、C相等则K=2
COMP2: MOV BL,B
CMP BL,C JE K1
;对B、C进行比较,相等则K=1
CMP AL,C JE K1
;对A、C进行比较,相等则K=1
K0: K1: K2:
MOV K,0 JMP EXIT MOV K,1 JMP EXIT MOV K,2 MOV AH,4CH
第 3 页 共 31 页
EXIT:
INT 21H
CODE
ENDS END START
(2)编写一个能实现下列表达式的程序:
A + B A ≤ B ?
设 A,B,C 为小于 128 的正整数。 N = ?
A ? B + C A > B ?
程序流程图略。
参考源程序:
DATA
SEGMENT A DB 22H B DB 10H C DB 01H N DB ?
;定义 A、B、C、N
DATA CODE
ENDS SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX MOV AL, A CMP AL, B JG CALCUL ADD AL,B JMP EXIT
;A 小于或等于 B 则 N=A+B
CALCUL: SUB AL, B
ADC AL, C
EXIT:
MOV N, AL MOV AH,4CH INT 21H
CODE
ENDS END START
第 4 页 共 31 页
实验三 循环程序设计实验
(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] ;逐个取字符进行判断 ;自己和自己做与运算
;根据 PF 标志位的变化进行跳转
AND BL, BL JP NEXT
INC AL
OR BL, 80H
NEXT: MOV [DI], BL
INC SI INC DI LOOP LP1
MOV N, AL MOV AH, 4CH INT 21H ENDS
END START
CODE
(2)在 FIRST 开始的一片连续的数据区中存放着 100 个数据,编写一个程序,统计第 1
第 5 页 共 31 页
个数据‘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
MOV CX,COUNT
MOV BX, OFFSET FIRST
LP1:
MOV AL, [BX] CMP AL, 00H JNE NEXT
;每次取一个数,与 0 比较 ;计数值初始为 0
JMP EXIT
NEXT: INC DL
INC BX LOOP LP1
;找到 0 则退出
;没找到 0 则计数值加 1
EXIT:
CODE
MOV NUM, DL MOV AH, 4CH INT 21H ENDS
END START
第 6 页 共 31 页
实验四:子程序设计实验
将BUF开始的10个单元中两位十六进制数转换成ASCII码,并在屏幕上显示出来。要求码型 转换通过子程序HEXASC实现,参数传送采用寄存器传送方式。 程序流程图略。 参考源程序: (1)实现方法一:远过程调用 DATA SEGMENT
BUF DB 10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H COUNT EQU $-BUF DATA ENDS
;定义任意长度的一段 BUF
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 FAR PTR HEXASC MOV DL,AL MOV AH,02H INT 21H
MOV AL,BL AND AL,0FH
CALL FAR PTR HEXASC MOV DL,AL MOV AH,02H INT 21H MOV DL,20H MOV AH,02H INT 21H
;先对高字节部分转换(寄存器 AL 传参) ;调用子程序
;显示高字节部分对应的字符 ;逐个取数
;再对低字节部分转换(寄存器 AL 传参) ;调用子程序
;显示低字节部分对应的字符
;显示空格
第 7 页 共 31 页
INC SI
LOOP AGAIN MOV AH,4CH INT 21H ENDS
CODE
CODEB SEGMENT
ASSUME CS:CODEB
HEXASC PROC FAR
CMP AL,09H JA HEXATOF ADD AL,30H JMP ENDHEX
HEXATOF:ADD AL,37H ENDHEX: RET HEXASC ENDP CODEB ENDS
END START
;判断是不是数字
;是字母则转到 HEXATOF ;是数字则对应到数字的 ASCII 码 ;是字母则对应到字母的 ASCII 码
(2)实现方法二:近过程调用
DATA SEGMENT
BUF DB 10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2H COUNT EQU $-BUF DATA ENDS
;定义任意长度的一段 BUF
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 HEXASC
;逐个取数
;先对高字节部分做转换
第 8 页 共 31 页
MOV 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
;显示高字节部分对应的字符
;再对低字节部分做转换 ;显示低字节部分对应的字符
;显示空格
;继续循环或退出
第 9 页 共 31 页
实验五: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
INT 21H CMP AL,39H JA EMSG CMP AL,30H
;等待用户输入 1 个字符并显示
JB EMSG MOV AH,01H INT 21H CMP AL,'A' JB EMSG CMP AL,'Z' JB EXIT CMP AL,'a' JB EMSG CMP AL,'z'
;判断输入是否是数字,不是则报错 ;等待用户输入 1 个字符并显示
;判断输入是否是大写字母,不是则继续 ;判断是不是小写字母
JB EXIT
EMSG: LEA DX,WRN
MOV AH,09H INT 21H JMP AGAIN EXIT:
MOV DX,OFFSET MSG MOV AH,09H INT 21H
MOV AH,4CH
;不是字母则报错,是字母则转到 EXIT
;显示“RIGHT”并退出
第 10 页 共 31 页
INT 21H ENDS
END START
CODE
(2)编写一程序分类统计字符个数:即接收键入的一串字符(字符个数不超过50个,该字 符串用回车作为结束),并按数字、字母和其它字符分类计数,然后将结果存入digit、letter 和other 3个存储单元中,并显示结果。 程序流程图略。 参考源程序: DATA SEGMENT
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 ?
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 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
CMP BL,3AH
;ASCII 码小于 30H 则归类为“其它”
第 11 页 共 31 页
JB DIG
CMP BL,41H JB OTH
CMP BL,5BH JB LET
CMP BL,61H JB OTH
CMP BL,7BH
JB LET
OTH:
INC AL
JMP ENDLP
DIG: INC AH
JMP ENDLP
LET:
INC BH
ENDLP: INC SI
LOOP AGAIN
MOV DIGIT, AH
MOV LETTER, BH MOV OTHER, AL
MOV DX, OFFSET MSG1 MOV AH,09H INT 21H
MOV AL, DIGIT CALL DISP
MOV DX, OFFSET MSG2 MOV AH,09H INT 21H
MOV AL, LETTER CALL DISP
MOV DX, OFFSET MSG3 MOV AH,09H INT 21H
MOV AL, OTHER CALL DISP
MOV AH,4CH INT 21H
DISP
PROC NEAR
;ASCII 码大于等于 30H 小于 3AH 则归类为“数字” ;ASCII 码大于等于 3AH 小于 41H 则归类为“其它” ;ASCII 码大于等于 41H 小于 5BH 则归类为“字母” ;ASCII 码大于等于 5BH 小于 61H 则归类为“其它” ;ASCII 码大于等于 61H 小于 7BH 则归类为“字母”
;“其它”计数器加 1
;“数字”计数器加 1
;“字母”计数器加 1 ;继续循环 ;统计各类个数
;显示“数字”有多少个
;显示“字母”有多少个
;显示“其它”有多少个
;显示子程序
第 12 页 共 31 页
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 DISP
ENDP
CODE
ENDS
END START
第 13 页 共 31 页
实验六:扩展定时器/计数器接口实验
(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 MOV AL,00010110B OUT DX,AL
MOV DX,20CH MOV AL,05H OUT DX,AL
;写入计数器0的控制字
;写入计数器0的计数初值
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 CODE
ENDS SEGMENT
第 14 页 共 31 页
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX MOV DX,20FH
MOV AL,00010110B OUT DX,AL MOV DX,20CH MOV AL,05H OUT DX,AL
MOV DX,20FH MOV AL,01010110B OUT DX,AL MOV DX,20DH MOV AL,02H OUT DX,AL
MOV AH,4CH INT 21H
CODE
ENDS END START
;写入计数器0的控制字
;写入计数器0的计数初值 ;写入计数器1的控制字 ;写入计数器1的计数初值
第 15 页 共 31 页
实验七:并行输入/输出接口 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 口 PB0~PB7 分别连接 L1~L8。 程序流程图略。 参考源程序: .486
DATA
SEGMENT PORTA DW 208H PORTB DW 209H PORTC DW 20AH
DATA
ENDS
;8255A端口A地址 ;8255A端口B地址 ;8255A端口C地址
PORT_CTR DW 20BH ;8255A控制端口地址
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 OUT DX, AL
;8255A初始化 ;控制字
;8255A端口B清零,LED初始化(全灭)
MOV DX, PORTB MOV AL, 00H OUT DX, AL
MOV BL, 01010101B MOV AL, BL OUT DX, AL CALL DELAY
LP0:
第 16 页 共 31 页
NOT AL MOV BL, AL MOV AH, 01H INT 16H JNZ EXIT JMP LP0
;调用BIOS的16H功能判断键盘是否有输入
EXIT:
DELAY PROC NEAR
MOV ECX, 0FFFFFFFH
LP2:
NOP LOOPD LP2 RET
DELAY
MOV AH, 4CH INT 21H
;延时子程序(可通过修改NOP指令数量改变延时时间)
ENDP ENDS END START
CODE
(2)利用 8255A 的 A 口读入 8 个开关 K1~K8 的状态,当只有 K1 合上时,L1~L8 显示 00000001B;当只有 K1 和 K2 合上时,L1~L8 显示 00000010B;当只有 K1,K2 和 K3 合上 时,L1~L8 显示 00000011B;当只有 K1,K2,K3 和 K4 合上时,L1~L8 显示 00000100B;… 直到所有开关合上时,L1~L8 显示 00001000B,并结束程序的运行。发光二极管的状态通 过 8255A 的 B 口进行控制。 分析:
按照题目要求,可以通过查询的方式读取 8255A 的 B 口状态,并根据查询的结果给 A 口送出相应数据,A 口工作在方式 0 的输入状态,B 口工作在方式 0 输出状态,C 口不需要 考虑,所以 8255A 的方式控制字为:10010000B) 硬件连接方法:
(1)8255A 的 A 口 PA0~PA7 对应连接 K1~K8; (2)8255A 的 B 口 PB0~PB7 对应连接 L1~L8; 源代码:
DATA DATA
SEGMENT LIST ENDS
DB 01H, 03H, 07H, 0FH, 1FH, 3FH, 7FH, 0FFH
STACK1 SEGMENT STACK
DB 100 DUP(?)
STACK1 ENDS CODE
SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1
START: MOV AX, DATA
第 17 页 共 31 页
MOV DS, AX MOV DX, 20BH MOV AL, 10010000B OUT DX, AL
;8255A初始化
MOV DX, 209H MOV AL, 00H OUT DX, AL
L0:
;8255A的B口清零,LED初始化(全灭)
MOV DX, 208H IN AL, DX
;读8255A的A口,获得开关状态
MOV BL, 00H MOV CX, 8
MOV SI, OFFSET LIST
L1:
INC BL CMP AL, [SI] JZ FIND INC SI LOOP L1
JMP L0
FIND:
MOV AL, BL MOV DX, 209H OUT DX, AL CMP AL, 08H JNZ L0
;当前开关状态为表中所列状态之一 ;显示LED状态
CODE
MOV AH, 4CH INT 21H ENDS END START
第 18 页 共 31 页
实验八:并行输入/输出接口 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口PB0~PB7对应连接L1~L8。 程序流程图略。 参考源程序:
SEGMENT PORT0 DW 20CH PORT1 DW 20DH PORT2 DW 20EH PORT3 DW 20FH PORTA DW 208H PORTB DW 209H PORTC DW 20AH PORT_CTR DW 20BH ENDS
DATA
DATA
;8254计数器0端口地址 ;8254计数器1端口地址 ;8254计数器2端口地址 ;8254控制寄存器端口地址 ;8255A的A口端口地址 ;8255A的B口端口地址 ;8255A的C口端口地址 ;8255A的控制寄存器端口地址
STACK1 SEGMENT STACK
DB 100 DUP(0)
STACK1 ENDS CODE
SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK1
第 19 页 共 31 页
START: MOV AX, DATA
MOV DS, AX MOV ES, AX
MOV AL, 80H 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 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 AND AL, 0F7H OUT 21H, AL STI
MOV DX, PORT3 MOV AL, 14H OUT DX, AL MOV DX, PORT0 MOV AL, 50D OUT DX, AL MOV DX, PORT3 MOV AL, 74H OUT DX, AL MOV DX, PORT1 MOV AX, 5000D OUT DX, AL MOV AL, AH OUT DX, AL
;计数器1写入计数初值5000D ;8254计数器1初始化 ;计数器0写入计数初值50D
;开中断,CPU可以响应外部可屏蔽中断 ;8254计数器0初始化
;设置8259的IMR寄存器,允许IRQ3中断 ;保存系统原有0BH号中断的中断向量至堆栈 ;发光二极管初始化(全灭)
; 8255初始化, B口方式0输出,C口高4位输出
第 20 页 共 31 页
MOV BH, 80H MOV AL, BH MOV DX, PORTB
;8255A的B口输出
OUT DX, AL
WAIT0: NOP
NOP NOP
MOV AH, 01H INT 16H JNZ EXIT JMP WAIT0
;判断键盘上是否有键按下,若有则结束程序 ;BH存放当前8255A的B口输出
EXIT:
POP DX POP DS
MOV AX, 250BH INT 21H
;恢复中断向量表中的原有0BH号中断向量
MOV AH, 4CH INT 21H
INTPROC PROC NEAR
MOV AL, BH ROR AL,1 MOV BH, AL MOV DX, PORTB OUT DX, AL
;向8255A的B口写出数据,点亮对应LED
MOV AL, 20H OUT 20H, AL IRET
INTPROC ENDP CODE
;向8259发出中断结束命令
ENDS END START
(2)8255A的A口与8个开关相连,工作于方式1下,要求:利用当前的开关状态通过B口控 制L1~L8的亮或灭。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,其控制字为
第 21 页 共 31 页
00001001B(09H)。{注意:利用中断方式实现时还需要置PC7为0,使INTRA能到达8259 的IRQ3}
硬件连接与参考源程序: (1)利用查询方式实现
硬件连接:
1)8255A的A口PA0~PA7与K1~K8对应相连; 2)8255A的B口PB0~PB7与L1~L8对应相连;
3)按键K接8255A的C口PC4。 参考源程序:
CODE
SEGMENT ASSUME CS:CODE
START: MOV AL, 0B0H
MOV DX, 20BH OUT DX, AL
; 8255A初始化,方式控制字10110000B
MOV DX, 209H MOV AL, 00H OUT DX, AL
AGAIN: MOV AH, 01H
INT 16H JNZ EXIT MOV DX, 20AH IN AL, DX
TEST AL, 00010000B JNZ AGAIN MOV DX, 208H IN AL, DX MOV DX, 209H OUT DX, AL JMP AGAIN
;LED初始化
;判断计算机键盘上是否有键按下,若有结束程序
;读入8255A的C口状态 ;判断PC4=1?(K键是否按下) ;读入8255A的A口状态 ;将A口状态送8255A的B口
EXIT: CODE
MOV AH, 4CH INT 21H ENDS END START
(2)利用中断方式实现
硬件连接:
1)8255A的A口PA0~PA7与K1~K8对应相连; 2)8255A的B口PB0~PB7与L1~L8对应相连; 3)按键K接8255A的C口PC4;
4)8255A的C口PC3(INTRA)接IRQ。 参考源程序:
第 22 页 共 31 页
DATA
SEGMENT PORTA DW 208H PORTB DW 209H PORTC DW 20AH
; 8255A的A口地址 ; 8255A的B口地址 ; 8255A的C口地址 ; 8255A的控制口地址
PORT_CTR DW 20BH
DATA ENDS 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 MOV AL, 0B0H OUT DX, AL MOV AL, 09H
;写入C口按位置位控制字,PC4置“1”
OUT DX, AL MOV AL, 0EH OUT DX, AL
;写入C口按位复位控制字,PC7置“0”,开IRQ ;写入8255A方式控制字0B0H
MOV AX, 350BH 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 AND AL, 0F7H OUT 21H, AL STI
WAIT0: MOV AH, 01H
INT 16H JZ WAIT0
POP DX
;保存系统原有中断号为0BH的中断向量到堆栈
;向0BH号中断写入新的中断向量
;允许8259的IRQ3中断
;允许CPU响应可屏蔽中断
;判断是否有键按下,若有则结束程序,若无则等待
;恢复系统中断向量表
第 23 页 共 31 页
POP DS
MOV AX, 250BH INT 21H
MOV AH, 4CH INT 21H
INTPROC PROC NEAR
MOV DX, PORTA IN AL, DX MOV DX, PORTB
OUT DX, AL MOV AL, 20H OUT 20H, AL IRET
INTPROC ENDP
CODE
ENDS END START
;读入8255A端口A的状态(开关状态)
;从8255A的B口输出开关状态,由对应的LED显示;给8259发中断结束指令
第 24 页 共 31 页
实验九: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口PA0~PA7分别对应连接LED显示器的段选输入a~h. (2)8255A的B口PB0~PB5分别对应连接LED1~LED6显示器的位选输入。 程序流程图略。 参考源程序:
.486
STACK1 SEGMENT STACK
DB 100 DUP(0)
STACK1 ENDS CODE
SEGMENT
ASSUME CS:CODE, SS:STACK1
START: MOV AL, 80H
MOV DX, 20BH OUT DX, AL
; 8255A工作方式初始化,A口方式0输出,B口方式0输出
MOV AL, 80H MOV DX, 208H OUT DX, AL
L1: L2:
MOV BL, 20H MOV AL, BL MOV DX, 209H OUT DX, AL CALL DELAY MOV AH, 01H INT 16H JNZ EXIT SHR BL, 1 JNZ L2
;8255A的A口输出字符“8”的段码80H
;LED显示器位选信号存放在BL中,20H表示最左边一位 ;将LED位选信号输出到8255A的B口
;调研软件延时程序
;判断标准键盘上是否有键按下,若有则结束程序
;LED位选信号右移一位,选中下一位LED
;当循环到最右边一位LED时,重新填充BL值,开始新一轮循环
JMP L1
EXIT:
MOV DX, 208H
第 25 页 共 31 页
MOV AL, 0FFH OUT DX, AL MOV DX, 209H MOV AL, 00H OUT DX, AL
;关闭所有LED
MOV AH, 4CH INT 21H
DELAY LP: DELAY CODE
PROC NEAR MOV ECX, 0FFFFFFFH LOOPD LP RET ENDP ENDS END START
(2)完成多位LED显示器的显示,即设计一个显示字符串1234.56的程序,当标准键盘上有 任意键按下时结束程序。 基本思想: 借助动态扫描、分时显示的办法,利用人眼视觉的滞留效应,实现人眼看上去的
各位“同 时”显示。 分析:
利用实验操作面板上引出的8255A的分别A口和B口作为6位8段LED显示器的位选口和 段选口,从段选口依次输出待显示字符的段码,并选通相应的位实现对多位LED显示器的刷 新。8255A的A口和B口均工作在方式0的输出方式,方式控制字为:1000000B(80H)。 硬件连接:
(1)8255A的A口PA0~PA5对应连接LED1~LED6的位选; (2)8255A的B口PB0~PB7对应连接段选a~h; 程序流程图略。 参考源程序:
DATA
SEGMENT
SEGTAB DB 0C0H, 0F9H, 0A4H, 0B0H
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 DB 100 DUP(0)
STACK1 ENDS CODE
SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1
第 26 页 共 31 页
;定义0~F的段码存储区
;定义显示缓冲区
STACK1 SEGMENT STACK
START: MOV AX, DATA
MOV DS, AX MOV AL, 80H MOV DX, 20BH OUT DX, AL
L1:
MOV AH, 20H LEA SI, DISPMEM LEA BX, SEGTAB
L2:
MOV AL, [SI] XLAT CMP AH, 04H JNE NEXT AND AL, 7FH
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
MOV AH, 4CH INT 21H
CODE
ENDS END START
;8255A初始化,A口输出,B口输出
;预置位选信号 ;SI指向显示缓冲区 ;BX指向段码存储区
;第4位LED显示小数点 ;输出段码 ;输出位选信号 ;延时 ;判断标准键盘上是否有键按下,若有键按下则结束程序;修改显示缓冲区指针 ;修改位选信号
;关闭所有LED
第 27 页 共 31 页
实验十:键盘接口实验
编制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口的PA0~PA7接段选信号a~f;
(2)8255A的B口的PB0~PB3接非编码键盘的列扫描端(J9)
(3)8255A的C口的PC0~PC5接LED的位选信号(同时也是非编码键盘的行扫描线) 程序流程图略。 参考源程序:
DATA
SEGMENT
DISPTAB DB 0C0H, 0F9H, 0A4H, 0B0H
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
;定义LED显示字形码
;定义键值特征表
DB 'PRESS ENTER TO END.', 0AH, 0DH, '$' ;提示消息
DATA CODE MAIN
ENDS SEGMENT 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 21H
;显示提示信息
第 28 页 共 31 页
MOV DX, 20BH MOV AL, 82H OUT DX, AL
MOV DX, 208H MOV AL, 0FFH OUT DX, AL
T1:
MOV DX, 20AH MOV AL, 00H
OUT DX, AL
MOV DX, 209H
LOP1:
MOV AH, 0BH INT 21H CMP AL, 0FFH
JNZ T2
MOV AH, 00H INT 16H
CMP AL, 0DH
JZ EXIT
T2: IN AL, DX AND AL, 0FH
CMP AL, 0FH
JE LOP1
MOV BH, AL CALL DELAY MOV AL, 0FEH MOV BL, AL
LOP2: MOV DX, 20AH OUT DX, AL MOV DX, 209H IN AL, DX AND AL, 0FH
CMP AL, 0FH
JNE LOP3 ROL BL, 1
MOV AL, BL
JMP LOP2 LOP3:
MOV DX, 20AH MOV AL, 3FH OUT DX, AL
SAL BH, 4
;8255A初始化,A口段选输出,B口键盘列输入,C口键盘行输出
;从段选口输出0FFH关闭所有LED
;使键盘行线为“0”
;判断标准键盘上是否有键按下
;读取标准键盘上所按键的ASCII码
;若回车键按下,则结束程序
;读列线状态
;非编码键盘上无键按下,等待
;非编码键盘上有键按下, 将列信号存入BH ;延时去抖动 ;逐行扫描
;BL中存行扫描信号
;该行有键按下,转LOP3
;无键按下换1行
第 29 页 共 31 页
AND BL, 0FH
OR BL, BH CALL DELAY LEA SI, KEYTAB MOV BH, 0 LOP4:
MOV AL, [SI]
CMP AL, BL
JE LOP5 INC BH
INC SI
JMP LOP4
LOP5:
CMP BH, 0AH
JNZ LOP6
CALL LEDXS LOP6:
CMP BH, 0BH JNZ LOP7
MOV AL, 00H MOV DX, 20AH
OUT DX, AL
MOV DL, 02H
MOV AH, 02H
INT 21H
LOP7: JMP T1 EXIT:
MOV DX, 208H MOV AL, 0FFH OUT DX, AL MOV DX, 20AH MOV AL, 00H OUT DX, AL
RET MAIN ENDP
LEDXS
PROC
NEAR
MOV AL, 0FH LEA BX, DISPTAB XLAT
MOV DX, 208H OUT DX, AL MOV AL, 3FH MOV DX, 20AH OUT DX, AL RET
LEDXS
ENDP
;形成键值 (列+行) ;延时,等待按键释放 ;查键值表找键代号
;找到键值转LOP5
;判断是否是’A’键按下(非编码键盘)
;若是’A’按下,则调用LED显示 ;判断是否是’B’键按下(非编码键盘)
;若是’B’键按下,则关闭LED显示
;在计算机屏幕上显示笑脸符(ASCII码为02H);返回键识别
;退出程序前关闭LED显示
;待显示字符’F’的代号存入AL ;BX指向字形码表首
;查表交换, 将字符’F’的字形码送AL
;送字形码
;送位选信号 第 30 页 共 31 页
DELAY DLP: DELAY CODE
PROC LOOP RET ENDP ENDS END START
NEAR DLP
;延时子程序
MOV CX, 0F000H
第 31 页 共 31 页
正在阅读:
《计算机硬件技术基础》实验答案程序..05-18
光电技术与智能控制教育部重点实验室实验室简介 - 图文11-03
抖音里经典的表白套路02-21
16天记住700考研英语单词06-02
导数复习专题习题集10-14
第二节 常见的酸和碱06-22
网络营销就业方向有哪些06-01
锅炉汽包水位控制系统11-11
工程监理资料管理及归档目录CJJ1-9008-25
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 硬件技术
- 答案
- 实验
- 计算机
- 基础
- 程序
- 火火兔配套儿歌歌词
- 综合理科学科课堂教学素质化的研究课题阶段材料
- 技术经济学历年考试计算题及答案
- 人教版小学三年级上册第四单元教案
- 法律法规校规校纪知识竞赛题库
- 前三季度巢湖与省会经济圈各市经济发展比较
- 排名与认证-University of Wisconsin-Platteville 美国威斯康星
- 领导行为理论
- 人力资源管理制度及工作流程
- 石墨烯物性及SEM表征对样品表面损伤的研究
- 六年级上册科学全册教案
- 信道编码文献综述
- 人美版小学五年级下册美术《提袋的设计》教学设计
- 中国建筑设计标准图集华北地区通用图集目录
- 2018初级会计职称《经济法基础》知识点(54)
- 银行案件风险防控工作总结
- 北邮机械PLC实验报告
- 高空作业资质审批表
- 3422综采面作业规程
- 《工程力学》试卷附参考答案