一、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 就可以。   如果又知道问题点的小伙伴可以留言解析下,谢谢。

  

Logo

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

更多推荐