6、设8255A的A口、B口、C口和控制字寄存器的端口地址分别为80H,82H,84H和86H。要求A口工作在方式0输出,B口工作在方式0输入,C口高四位输入,低四位输出,试编写8255A的初始化程序。
答: MOV DX,86H ;控制字端口地址 MOV AL,10001010B
OUT DX,AL ;写控制字
7、 8255A的方式选择控制字和C口按位控制字的端口地址是否一样,8255A怎样区分这两
种控制字?写出A端口作为基本输入,B端口作为基本输出的初始化程序。 解:
(1) 8255A的方式选择控制字和C口按位控制字的端口地址一样,它们之间的区别在控制字的D7位(特征位)的值不同,8255A的方式选择控制字D7=1,而C口按位置位/复位控制字D7=0。
(2) 初始化程序:(设端口地址为,A口:200H,B口:201H,控制口:203H) MOV AL,90H MOV DX,203H OUT DX,AL
8、 用8255A的A端口接8位二进制输入,B端口和C端口各接8只发光二极管显示二进制
数。编写一段程序,把A端口读入的数据送B端口显示,而C端口的各位则采用置0/置1的方式显示A端口的值。 解:
(设端口地址为,A口:200H,B口:201H,C口:202H,控制口:203H) MOV AL, 90H ;8255A初始化: MOV DX, 203H ;8255A各组方式0,A口输入 OUT DX, AL ; B、C口输出 MOV DX, 200H IN AL, DX ;读A口输入值 MOV DX, 201H OUT DX, AL ;送B口输出 MOV AH, AL ;A口输入值转存在AH中 MOV DX, 203H MOV CX, 08 ;CX置循环次数初值 MOV AL, 00H ;C端口置0/置1控制字初值 LPA: AND AL, 0FEH ;清除最低位
8255练习题及答案 第 6 页 共 10 页
SHR AH, 1 ;A端口一位转入CF ADC AL, 0 ;A端口一位从CF转入命令字 OUT DX, AL ;A端口一位从送往C端口对应位 ADD AL, 02H ;形成下一个命令字 LOOP LPA ;处理C端口下一位
9、 将8255A用作两台计算机并行通信的接口电路,请画出采用查询式输入/输出方式工作的接口电路,并写出采用查询式输入/输出方式的程序。 解:
用两片8255作两台计算机8088_A与8088_B之间并行通信的接口电路,两片8255之间的连接如下图所示。两片8255均在方式1、查询方式下工作。
D7~D08255AA口A口8088-A地址译码A0A1CSA0A18255APC0B口PC6(ACK)8255BA口PC4(STB)PC08088-BCSA0A1地址译码A0A1D7~D0 (1) 8088_A输出程序:
(8255_A的A口作为数据输出口,C口的PC0作为“数据输出选通”信号,负脉冲输出。C口的PC6作为“应答”信号输入。端口地址: A口:200H,C口:202H,控制口:203H)
DATA SEGMENT Buffer DB “This is a example. ”, 0DH, 0AH, -1 DATA ENDS CODE SEGMENT START: MOV AX, DATA MOV DS, AX LEA BX, Buffer ;输出缓冲区指针送BX MOV DX,203H MOV AL,0A0H ;10100000B
;8255_A的方式选择字,A口工作在方式1、输出,C口低四位输出 OUT DX,AL MOV AL, 1 OUT DX, AL ;将PC0置1 CALL DELAY ;延时等待对方完成初始化 ;A口查询方式输出 NEXT: MOV DX, 202H IN AL, DL
TEST JZ MOV
AL, 80H NEXT DX,200H
;判别OBF是否有效,PC7→OBFA ;数据尚未取走,等待
8255练习题及答案 第 7 页 共 10 页
MOV AL, [BX] OUT DX, AL ;输出一项数据 INC BX MOV DX, 203H MOV AL, 0 OUT DX, AL ; NOP NOP INC AL OUT DX, AL ;通过PC0 向对方发选通信号 CMP BYTE PTR[BX-1], -1 ;判断输出是否完成 JNE NEXT ;未完成,继续 MOV AX, 4C00H INT 21H CODE ENDS END START (2)8088_B输入程序:
(8255_B的A口作为输入,方式1,PC4作为“数据输入选通”信号,输入,负脉冲有效。PC0为“应答”信号输出。端口地址: A口:210H,C口:212H,控制口:213H) DATA SEGMENT Buffer DB 80 DUP(?) DATA ENDS ; CODE SEGMENT START: MOV AX, DATA MOV DS, AX LEA BX, Buffer ;输入缓冲区指针送BX MOV DX, 213H MOV AL, 0B0H ;10110000B
;8255_B的方式选择字,A口工作在方式1,输入,C口低四位输出。 OUT DX, AL MOV AL, 01H OUT DX, AL ;PC0置1,表示没有“应答”信号 CALL DELAY ;延时等待对方状态就绪 ;A口查询方式输入 AGA: MOV DX, 212H IN AL, DX TEST AL, 20H JZ AGA
;PC5 ( IBF )是否为1,不是,无数据输入,继续查询 MOV DX, 210H IN AL, DX MOV [BX], AL
8255练习题及答案 第 8 页 共 10 页
MOV DX, 212H MOV AL, 0 OUT DX, AL INC BX NOP NOP INC AL OUT DX, AL ;通过PC0向发送方发“应答”负脉冲 CMP BYTE PTR[BX-1], -1 ;数据接收完了吗? JNE AGA ;未完,继续 MOV AX, 4C00H INT 21H CODE ENDS END START 10、 设计一个用8255A作为8个七段显示器的接口电路,并设计一个把内存地址为ADDRA的8个数字在这8个七段显示器上显示的程序。
解:设8个七段显示器采用共阳接法,A口控制段的显示,B口控制位的显示。 端口地址 A口:200H,B口:201H,控制口:203H DATA SEGMENT ADDRA DB ×,×,×,×,×,×,×,× TABLE DB 40H, 4FH, 24H, 30H, 19H DB 12H, 02H, 78H, 00H, 10H DISPBIT DB ? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AL, 80H ;对8255A初始化,A,B端口方式0,输出 MOV DX, 203H OUT DX, AL LEA BX, TABLE ;BX置为七段码表首地址 MOV DISPBIT, 7FH ;置位码初值为7FH:011111111H,第一个亮 LEA SI, ADDRA ;SI置为显示缓冲区首地址 MOV CX, 8 ;CX置为循环次数初值8 AGA: MOV AL, 0FFH MOV DX, 201H OUT DX, AL ;熄灭所有数码管 MOV AL, [SI] ;取出一个待显示数 XLAT ;转换成七段码 MOV DX, 200H OUT DX, AL ;送入段码端口
8255练习题及答案 第 9 页 共 10 页
MOV MOV OUT ROR INC CALL LOOP MOV INT CODE ENDS END
START
AL, DISPBIT DX, 201H DX, AL DISPBIT, SI DELAY AGA AX, 4C00H 21H
8255练习题及答案 ;
;送当前位码,点亮一个数码管 1 ;产生下一个位码
;修改指针,指向下一个待显示数据 ;延时
;处理下一个数码管的显示
第 10 页 共 10 页