用61号端口来延时

博客介绍了实现延时功能的方法,因程序生成可执行文件,为方便选择用61号端口实现。还给出了测试代码,通过循环15次,每次显示字符并调用延时函数,同时展示了延时函数的具体汇编代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编修改时钟中断的话都是些com文件的例子 ,但因为程序生成可执行文件 ,所以为了方便起见 , 我还是准备用61号端口来实现延时功能 , 最多一开始像c写的吃豆游戏一样可以选择速度

TITLE A DEMO OF DELAY FUNCTION          
         .model small
         .stack 64
         .data
         .code
 main proc
         mov ax , @data
         mov ds , ax
         mov cx , 15  ;用循环15次来测试
L:
         mov ah , 02h  ;每循环一次显示一个字符
         mov dl , 'D'
         int 21h
         push cx
         mov cx , 4  ;延时的等级控制
         call Delay
         pop cx
         loop L
         mov ah , 4ch
         int 21h
main endp
Delay proc
         push ax
         push cx    
M_1: push cx   ;外层循环来控制延时速度
         mov cx , 33144
M_2: in al , 61h
         and al , 10h
         cmp al , ah
         je M_1
         mov ah , al
         loop M_2
         pop cx
         loop M_1 
         pop cx
         pop ax
         ret
Delay endp
 
end main
基于 NMI 的中断处理过程电路和程序。开关按键后,在七段数码管等显示器件上显示是第几次按键,假设按键次数< 9。; ================================================================ ; 修正版 - 基于NMI中断的按键计数显示系统 ; 修复了堆栈和中断向量设置问题 ; ================================================================ ; 定义8255端口地址 PORTA EQU 8000H CTRL_REG EQU 8006H ; 数据段 DATA SEGMENT COUNT DB 0 ; 共阳极数码管段码表 (0-8) SEG_CODE DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H DATA ENDS ; 堆栈段 STACK SEGMENT STACK DW 256 DUP(?) TOS LABEL WORD ; 栈顶标记 STACK ENDS ; 代码段 CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: ; 初始化段寄存器 MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOS ; 关键修复:设置堆栈指针 ; 初始化8255A MOV AL, 80H ; PA/PB/PC输出 MOV DX, CTRL_REG OUT DX, AL ; 初始显示0 MOV AL, SEG_CODE ; 0的段码 MOV DX, PORTA OUT DX, AL ; 设置NMI中断向量 (中断类型2) CLI ; 关中断 XOR AX, AX MOV ES, AX ; ES=0000H MOV DI, 8 ; 2中断向量偏移: 2×4=8 ; 设置中断向量 LEA AX, NMI_ISR ; 中断处理程序偏移地址 MOV ES:[DI], AX ; [0000:0008] = 偏移地址 MOV AX, CS ; 段地址 MOV ES:[DI+2], AX ; [0000:000A] = 段地址 STI ; 开中断 ; 主循环 MAIN_LOOP: JMP MAIN_LOOP ; NMI中断服务程序 NMI_ISR PROC FAR PUSH AX PUSH BX PUSH DX PUSH DS MOV AX, DATA MOV DS, AX ; 消抖延时 CALL DELAY_10MS ; 增加计数 INC COUNT CMP COUNT, 9 JB DISPLAY_NUM MOV COUNT, 1 DISPLAY_NUM: ; 显示数字 LEA BX, SEG_CODE MOV AL, COUNT DEC AL ; 调整索引(0起) XLAT ; 获取段码 MOV DX, PORTA OUT DX, AL POP DS POP DX POP BX POP AX IRET NMI_ISR ENDP ; 延时子程序(10ms) DELAY_10MS PROC PUSH CX MOV CX, 3000 DELAY_LOOP: LOOP DELAY_LOOP POP CX RET DELAY_10MS ENDP CODE ENDS END START 代码改错,七段数码显示器不显示
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值