问题描述
- 急最好这两天有答案D7~D0 由左向右,每次仅亮一个灯,循环显 示,D15~D8 与 D7~D0 正相反
-
要求 D7~D0 由左向右,D15~D8 由右向左,每次仅点亮一个灯,循环显示
拜托大家了,不会的默默看着就好了勿水,会的帮忙指点一下,给个思路也是好的啊,先谢谢了
解决方案
我也来试试:
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX, 0646H
MOV AL, 80H
OUT DX, AL
MOV BX, 8001H
AA1: MOV DX, 0640H
MOV AL, BH
OUT DX, AL
ROR BH, 1
MOV DX, 0642H
MOV AL, BL
OUT DX, AL
ROL BL, 1
CALL DELAY
CALL DELAY
JMP AA1
DELAY: PUSH CX
MOV CX, 0F000H
AA2: PUSH AX
POP AX
LOOP AA2
POP CX
RET
CODE ENDS
END START
解决方案二:
MY8255_A EQU IOY0+00H*2 ;8255的A口地址
MY8255_B EQU IOY0+01H*2 ;8255的B口地址
MY8255_C EQU IOY0+02H*2 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址
DATA SEGMENT
LA DB 1 DUP
LB DB 1 DUP
AXX DW 1 BUP
CXX DW 1 BUP
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE ;定义8255工作方式
MOV AL,80H ;工作方式0,A口和B口为输出 OUT DX,AL
BEGIN:
MOV DX,MY8255_A ;写A口发出的起始数据
MOV AL,01H
OUT DX,AL
MOV LA,AL
MOV DX,MY8255_B ;写B口发出的起始数据
MOV AL,80H
OUT DX,AL
MOV LB,AL
MOV CX,7
LOOP1:
CALL DALLY
MOV AL,LA ;将A口起始数据左移再写入A口
ROL AL,1
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL
MOV AL,LB ;将B口起始数据右移再写入B口
ROR AL,1
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL
LOOP LOOP1
MOV CX,7
LOOP2: CALL DALLY
MOV AL,LA ;将A口起始数据右移再写入A口
ROR AL,1
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL
MOV AL,LB ;将B口起始数据左移再写入B口
ROL AL,1
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL
LOOP LOOP2
JMP BEGIN ;流水灯重新开始
DALLY PROC ;软件延时子程序
MOV CXX,CX
MOV AXX,AX ;这里本应该用堆栈,我用CXX,AXX变量代替了
MOV CX,0FH
D1:MOV AX,0FFFH
D2:DEC AX
JNZ D2
LOOP D1
MOV AX,AXX
MOV CX,CXX
RET
DALLY ENDP
CODE ENDS
END START
解决方案三:
- 先对功能需求做一个确认:主机通过8位并口输出信号来控制外设16个LED灯的开关,16个LED灯流水显示且每一次只显示一盏灯。
- 你得查阅8255控制芯片编程指令,通过A0A1编码来控制PA和PB端口开关,然后就是分别控制PA和PB来实现:PA0-PA7,PB0-PB7有效信号的输出即可。
解决方案四:
我这边好像有代码,你可以先参照下楼上给的代码跑一下,不行的话到时候我给找找代码
解决方案五:
本屌同意楼上 +1 先帮忙顶一下
时间: 2024-11-02 04:36:56