8255A 端口控制与 LED 显示:基于 74LS138 译码器的开关状态检测程序
- 根据题目中所给芯片的引脚连接图,可以确定相应端口的地址如下:
- CPU地址总线:A0~A15
- 8255A地址:0x3000
- 8255A A口:0x3000
- 8255A B口:0x3001
- 74LS138译码器地址:0x4000
- 汇编源程序如下:
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
原文地址: https://www.cveoy.top/t/topic/oSOU 著作权归作者所有。请勿转载和采集!