1. 根据题目中所给芯片的引脚连接图,可以确定相应端口的地址如下:
  • CPU地址总线:A0~A15
  • 8255A地址:0x3000
  • 8255A A口:0x3000
  • 8255A B口:0x3001
  • 74LS138译码器地址:0x4000
  1. 汇编源程序如下:
ORG 0x0000 ; 程序从0地址开始执行

; 定义端口地址
PORT_A equ 0x3000 ; 8255A A口
PORT_B equ 0x3001 ; 8255A B口
DECODER equ 0x4000 ; 74LS138译码器

; 定义常量
DELAY_TIME equ 10000 ; 延迟时间,单位为毫秒

; 初始化程序
START:
    MOV AX, 0 ; AX寄存器清零
    MOV DS, AX ; DS寄存器设置为0,方便访问数据段

    ; 初始化8255A A口
    MOV DX, PORT_A ; DX寄存器存储8255A A口地址
    MOV AL, 0xFF ; AL寄存器存储初始值,全部端口设置为输入模式
    OUT DX, AL ; 将初始值写入8255A A口

    ; 初始化8255A B口
    MOV DX, PORT_B ; DX寄存器存储8255A B口地址
    MOV AL, 0xFF ; AL寄存器存储初始值,全部端口设置为输出模式
    OUT DX, AL ; 将初始值写入8255A B口

    ; 初始化74LS138译码器
    MOV DX, DECODER ; DX寄存器存储74LS138译码器地址
    MOV AL, 0x07 ; AL寄存器存储初始值,设置使能端口为低电平
    OUT DX, AL ; 将初始值写入74LS138译码器

    ; 循环检测开关状态并显示到LED上
LOOP:
    ; 读取开关状态
    MOV DX, PORT_A ; DX寄存器存储8255A A口地址
    IN AL, DX ; 将8255A A口的值读入AL寄存器

    ; 将开关状态转换为LED状态
    NOT AL ; 取反操作,开关断开为1,开关闭合为0
    AND AL, 0x0F ; 只保留低四位,其他位清零

    ; 显示到LED上
    MOV DX, DECODER ; DX寄存器存储74LS138译码器地址
    OUT DX, AL ; 将LED状态写入74LS138译码器

    ; 延迟一段时间
    MOV CX, DELAY_TIME ; CX寄存器存储延迟时间
    MOV DX, 0x40 ; DX寄存器存储计数器8253地址
    MOV AL, 0x36 ; AL寄存器存储计数器工作模式
    OUT DX, AL ; 将工作模式写入计数器
    MOV AX, CX ; AX寄存器存储延迟时间
    DIV WORD PTR [DELAY_FACTOR] ; 除以延迟系数,得到计数器需要计数的次数
WAIT_LOOP:
    IN AL, DX ; 读取计数器计数值
    CMP AX, 0 ; 判断是否计数完成
    JNE WAIT_LOOP ; 如果没有计数完成,则继续等待

    ; 回到循环开始
    JMP LOOP

; 延迟系数,用于计算8253计数器需要计数的次数
DELAY_FACTOR DW 1193 ; 在1.193MHz的时钟频率下,1ms需要计数1193次

END START
8255A 端口控制与 LED 显示:基于 74LS138 译码器的开关状态检测程序

原文地址: https://www.cveoy.top/t/topic/oSOU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录