微机原理8255编程
发布网友
发布时间:2022-04-24 11:05
我来回答
共1个回答
热心网友
时间:2023-10-10 18:30
;;8255硬件连接及软件设置:
;;B口方式0输入,PB0~PB3分别连接K1~K4;
;;A口方式0输出,PA0~PA3外接驱动电路控制灯的4种动作;
;;驱动电路,可由74LS06、ULN2003作反相电流放大驱动继电器或固体继电器组成;
;;C口闲置;
;;按以上设置,8255方式控制字是82H ;
;;在PC机作主机的系统中,8255的4个寄存器地址是:
;;A口60H,B口61H,方式控制寄存器63H。
;;汇编程序如下:
SSEG SEGMENT PARA STACK ;堆栈段定义
DW 30H DUP(?)
SSEG ENDS
CSEG SEGMENT ;代码段定义
ASSUME CS:CSEG,DS:CSEG
ORG 200h ;主程序首址
START: MOV AL, 82H ;方式控制字
MOV DX, 63H
OUT DX, AL ;方式控制字送入方式控制寄存器
Scan: IN AL,61H ;扫描从B口读入的K1~K4状态
CALL PRC1 ;开灯、关灯
CALL PRC2 ;是否暂停
CALL PRC3 ;是否换向
CALL PRC3 ;是否移动
JMP Scan ;主程序循环
PRC1 PROC NEAR ;"开/关灯"操作 子程序定义
PUSH AX ;B口状态进栈暂存
TEST AL,00000001B ;检测PB0输入状态
JZ CloseL ;若PB0低电平,表示K1断,转CloseL处执行
OpenL: OUT 60H,AL ;若PB0高电平,表示K1通,PA0输出高电平,开灯
JMP RT1 ;转RT1处指令返回
CloseL: MOV AL,00000000B ;PA0输出低电平
OUT 60H,AL ;关灯
RT1: POP AX ;B口状态出栈
RET ;返回主程序
PRC1 ENDP ;子程序定义完毕
PRC2 PROC NEAR ;"暂停"操作 子程序定义
PUSH AX ;B口状态进栈暂存
TEST AL,00000010B ;检测PB1输入状态
JZ RT2 ;若PB1低电平,表示K2断,不暂停
PAUS: OUT 60H,AL ;若PB1高电平,表示K2通,PA1输出高电平,暂停
RT2: POP AX ;B口状态出栈
RET ;返回主程序
PRC2 ENDP ;子程序定义完毕
PRC3 PROC NEAR ;"换向"操作 子程序定义
PUSH AX ;B口状态进栈暂存
TEST AL,00000100B ;检测PB2输入状态
JZ RT3 ;若PB2低电平,表示K3断,不换向
CHG: MOV AL,00000101B ;若PB2高电平,表示K3通
OUT 60H,AL ;PA2、PA0输出高电平、换向,灯保持亮
RT3: POP AX ;B口状态出栈
RET ;返回主程序
PRC3 ENDP ;子程序定义完毕
PRC4 PROC NEAR ;"移动"操作 子程序定义
TEST AL,00001000B ;检测PB3输入状态
JZ RT4 ;若PB3低电平,表示K4断,不移动
MOVE: MOV AL,00001001B ;若PB3高电平,表示K4通
OUT 60H,AL ;PA3、PA0输出高电平、移动,灯保持亮
RT4: RET ;返回主程序
PRC4 ENDP ;子程序定义完毕
CSEG ENDS ;代码段定义完毕
END START ;主程序结束