对8259A的编程:统计中断申请的次数到十灯全灭
CODE SEGMENT ASSUME CS:CODE
ORG 11B0H ; 设置程序存储的起始位置
START:
CLI ;关中断,需要先关中
;初始化8255命令字
IOCONPT EQU 0FF2BH ;控制口
IOBPT EQU 0FF29H ;PB口
IOAPT EQU 0FF28H ;PA口
MOV AL,90H ;控制字存入AL
MOV DX,IOCONPT ;取8255控制字寄存器的端口地址存入DX
OUT DX,AL ; 控制字存入控制寄存器
;初始化8255 over
;初始化8259命令字
MOV DX,0FF80H ; 取8259的偶端口地址存入DX
MOV AL,13H ; ICW1控制字存入AL
OUT DX,AL ; 控制字存入ICW1
MOV DX,0FF81H ; 取8259的奇端口地址存入DX
MOV AL,0BH ; ICW2控制字存入AL 装入的是中断类型号
OUT DX,AL ; 控制字存入ICW2,设置中断类型号
MOV AL,03H ; ICW4控制字存入AL
OUT DX,AL ; 控制字存入ICW4,设置中断结束方式
;控制字写完了。
;修改中断向量表
SUB AX,AX
MOV ES,AX.
MOV AX,2CH
MOV DI,AX ;设置偏移地址
MOV AX,OFFSET INTWQ ;取偏移地址
CLD
STOSW ;存储偏移地址
MOV AX,SEG INTWQ ;取段基址
STOSW ;存储段基址
STI ;开中断
MOV BL,0 ;初始化中断次数计数器
main:
mov al,00h ;主程序
mov dx,iobpt
out dx,al ;点亮所有的灯
jmp main
MOV AH,4CH ;程序的结束
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTWQ PROC NEAR ;中断子程序
CLI ;关中断
PUSH AX
PUSH DX
PUSHF
INC BL ;中断次数计数器加一
mov al,bl
mov dx,iobpt ;把中断次数送到led灯
OUT DX,AL
CALL DELAY ;延时
cmp bl,0ah ;判断是否达到10次
jz shuchu
jmp jiedian
shuchu:
MOV AL,0FFH ;灯全灭
mov dx,iobpt
OUT DX,AL
CALL DELAY
jiedian:
MOV AL,20H
OUT 0FF80H,AL
POPF
POP DX
POP AX
STI
IRET ;中断返回
INT28 ENDP ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY PROC NEAR ;延时子程序的开始
MOV CX,0FFFFH ;初始化计数次数
CC:NOP ;空操作
LOOP CC ;循环
RET ;子程序返回
DELAY ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE ENDS ;代码段结束
END START ;源程序结束
8259A编程中断申 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)