Proteus仿真实现8255A芯片走马灯的实验
·
一、8255实验题目要求
8255的A口接8个LED发光二极管。利用按钮开关K控制指示灯LED0~LED7。初始状态为LED0~LED7全暗,第一次按K使LEDO亮,其它暗,第二次按K,使LED1亮,其它暗……,第八次按K,使LED7亮,其它暗,第九次按K,全暗,如此循环不断亮灯,编写程序段。
二、 Proteus电路的搭建
主要包括两个部分, 一个是 74LS138的地址译码, 这里用到的是 280H, 因此 A7,A9这两个地址要过非门。

第二部分就是 8255的设计与初始化
PC0 作为按键input, PA接 LED 输出

三 程序代码
程序代码 直接问 deepseek, chatgpt 以及 gemini。 相对 chatgpt和gemini回答比较好, 并且引导你一步一步做实验, 真的跟辅导老师一样。
最后, 融合三家的代码, 对键盘去抖做了优化, 程序如下。 按键我采用的是查询方式, 小伙伴们可以尝试用中断。
; 8255A 端口定义
PORT_OUT EQU 280H;0219H
PORT_INPUT EQU 284H;021AH
CTRL_REG EQU 286H;021BH
DATA SEGMENT
COUNT DB 0 ; 计数变量:0~8
DATA ENDS
;--- 定义堆栈段 ---
STACK SEGMENT STACK ; 使用 STACK 参数,汇编器会自动处理部分初始化
DB 100 DUP(?) ; 开辟 100 字节空间
TOP LABEL BYTE ; 定义一个标号指向栈顶
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
; 初始化 SS 和 SP
MOV AX, STACK
MOV SS, AX ; 设置堆栈段基址
; 设置栈指针 SP
; 栈是向下生长(从高地址向低地址),所以 SP 要指向最高地址的下一位
MOV SP, OFFSET TOP
MOV AX, DATA
MOV DS, AX
; 1. 初始化 8255A
; 方式控制字: 10001001B (89H)
; 标志位1, 方式0, A输出, C高位输出, B输出, C低位输入
MOV AL, 89H;10001001B ;89H
MOV DX, CTRL_REG
OUT DX, AL
; 2. 初始状态:全灭 , 低电平灭
MOV AL, 00H
MOV DX, PORT_OUT
OUT DX, AL
;-------------------------------
; 主循环
;-------------------------------
MAIN_LOOP:
CALL KEY_SCAN ; 等待一次按键
INC COUNT
CMP COUNT, 9
JB OUTPUT_LED
MOV COUNT, 0
OUTPUT_LED:
MOV CL, COUNT
CALL LED_DISPLAY
JMP MAIN_LOOP
;===============================
; 按键扫描(PC0) 查询方式
;===============================
KEY_SCAN PROC
WAIT_PRESS:
MOV DX, PORT_INPUT; C口
IN AL, DX
TEST AL, 01H ; 逻辑与运算 bit0
JNZ WAIT_PRESS ; 等待按下(低电平)
DELAY1:
MOV CX, 3000 ; 消抖延时
D1:
LOOP D1
IN AL, DX ; 去抖继续检查是否按下
TEST AL, 01H ; 逻辑与运算 bit0
JNZ WAIT_PRESS ; 等待按下(低电平)
WAIT_RELEASE:
IN AL, DX
TEST AL, 01H
JZ WAIT_RELEASE ; 等待松开
RET
KEY_SCAN ENDP
;===============================
; LED 显示子程序
; CL = COUNT
;===============================
LED_DISPLAY PROC
MOV AL, 00H ; 初始化全灭状态
CMP CL, 0
JZ OUT_LED
DEC CL
MOV AL, 01H
SHL AL, CL
; NOT AL ; 低电平点亮
OUT_LED:
MOV DX, PORT_OUT; B口
OUT DX, AL
RET
LED_DISPLAY ENDP
PRODELAY PROC
; PUSH CX
MOV CX, 6000 ; 消抖延时
D2:
LOOP D2
; POP CX
PRODELAY ENDP
CODE ENDS
END START
四、 调试过程中的问题
在仿真过程中, 开始灯怎么也不对, 中间又做了很多实验调试代码,尝试PA, PB口的输出变化,也无效。 最后发现 8255的 A0 A1脚, 接 CPU的 A0 A1不行, 接 A1, A2 就可以。 如果又知道问题点的小伙伴可以留言解析下,谢谢。


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)