MOV DPTR, #0FF2BH 假设命令口地址FF2BH
MOV A, #10011001B 命令字.
MOVX @DPTR, A
……
忘了棚缺问了物弯,你的8255的地址,是不是FF2BH?
.MODEL TINYCOM_ADD EQU 0F003H
PA_ADD EQU 0F000H
PB_ADD EQU 0F001H
PC_ADD EQU 0F002H
.STACK 100
.DATA
LED_Data DB 01111101B
DB 11111101B
DB 10111101B
DB 11010111B
DB 11011111B
DB 11011011B
.CODE
START: MOV AX,@DATA
MOV DS,AX
NOP
MOV DX,COM_ADD
MOV AL,80H
OUT DX,AL
MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
LEA BX,LED_Data
START1: MOV AL,0
XLAT
OUT DX,AL
CALL DL5S
MOV CX,6
START2: MOV AL,1
XLAT
OUT DX,AL
CALL DL500ms
MOV AL,0
XLAT
OUT DX,AL
CALL DL500ms
LOOP START2
MOV AL,2
XLAT
OUT DX,AL
CALL DL3S
MOV AL,3
XLAT
OUT DX,AL
CALL DL5S
MOV CX,6
START3: MOV AL,4
XLAT
OUT DX,AL
CALL DL500ms
MOV AL,3
XLAT
OUT DX,AL
CALL DL500ms
LOOP START3
MOV AL,5
XLAT
OUT DX,AL
CALL DL3S
JMP START1
DL500ms PROC NEAR
PUSH CX
MOV CX,60000
DL500ms1: LOOP DL500ms1
POP CX
RET
DL500ms ENDP
DL3S PROC NEAR
PUSH CX
MOV CX,6
DL3S1: CALL DL500ms
LOOP DL3S1
POP CX
RET
ENDP
DL5S PROC NEAR
PUSH CX
MOV CX,10
DL5S1: CALL DL500ms
LOOP DL5S1
POP CX
RET
ENDP
END START
这个败汪就是流水灯的程序,不过是在开发箱上历衡做察烂仔的。
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 AXB口状态进栈暂存或野
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 AXB口状态出栈
RET返回主程序
PRC1 ENDP 子程序定义完毕或斗
PRC2 PROC NEAR "暂停" *** 作 子程序定义
PUSH AXB口状态进栈暂存
TEST AL,00000010B 检测PB1输入状态
JZ RT2若PB1低电平,表示K2断,不暂停
PAUS:OUT 60H,AL 若PB1高电平,表示K2通,PA1输出高电平,暂停
RT2: POP AXB口状态出栈
RET返回主程序
PRC2 ENDP 子程序定义完毕
PRC3 PROC NEAR "换向" *** 作 子程序定义
PUSH AXB口状态进栈暂存
TEST AL,00000100B 检测PB2输入状态
JZ RT3若PB2低电平,表示K3断,不换向
CHG: MOV AL,00000101B 若PB2高电平,表示K3通
OUT 60H,AL PA2、PA0输出高电平、换向,灯保持亮
RT3: POP AXB口状态出栈
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 子程序定义完毕
CSEGENDS代码段定义完毕
END START 主程序结束
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)