📄 eint0_def.s
字号:
;******************************************************************************
; 文件名:EINT0_DEF.S
; 功能:使用外部中断0进行LED1的控制,每当有一次中断时,即取反LED1控制口,以便指示中断输入。
; 使用非向量中断方式。
; 说明:将跳线器JP4_LED1短接,然后按下/放开KEY1,使EINT0为低/高电平。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
VIC_BASE EQU 0xFFFFF000
LED1CON EQU (1<<22) ; P0.22引脚控制LED1,低电平点亮
AREA EINT0_DEFC,CODE,READONLY
MAIN MSR CPSR_c, #0x5F ; 切换处理器工作模式,并允许IRQ中断
LDR R0,=PINSEL0
MOV R1,#0x00000000
STR R1,[R0]
MOV R1,#0x00000001
STR R1,[R0,#0x04] ; 设置管脚连接,P0.16设置为EINT0
LDR R0,=IO0DIR
LDR R1,=LED1CON
STR R1,[R0] ; 设置LED1控制口为输出
LDR R0,=MEMMAP
MOV R1,#0x02
STR R1,[R0] ; REMAP操作(若写到片内FLASH,则不需要REMAP)
EINT0_INI LDR R0,=EXTMODE
MOV R1,#0x00
STR R1,[R0] ; 设置EINT0中断为电平触发模式
LDR R0,=EXTINT
MOV R1,#0x0F
STR R1,[R0] ; EXTINT=0x0F
LDR R0,=VIC_BASE
MOV R1,#0x00000000
STR R1,[R0,#0x0C] ; VICIntSelect=0x00000000
LDR R1,=IRQ_EINT0
STR R1,[R0,#0x34] ; VICDefVectAddr=(int)IRQ_EINT0
MOV R1,#0x00004000
STR R1,[R0,#0x10] ; VICIntEnable=0x00004000
WAIT_IRQ B WAIT_IRQ
;******************************************************************************
; 名称:IRQ_EINT0
; 功能:EINT0中断服务程序
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1
;******************************************************************************
IRQ_EINT0
LDR R0,=IO0SET
LDR R1,[R0] ; 读取IO0SET的值
ANDS R1,R1,#LED1CON
LDREQ R0,=IO0SET ; 设置R0=IO0SET
LDRNE R0,=IO0CLR ; 或设置R0=IO0CLR
MOV R1,#LED1CON
STR R1,[R0]
LDR R0,=EXTINT
WAIT_UP MOV R1,#0x01
STR R1,[R0] ; EXTINT=0x01,清除EINT0中断标志
LDR R1,[R0]
CMP R1,#0
BNE WAIT_UP ; 若外部中断信号仍为低电平,则循环等待
LDR R0,=VICVectAddr
MOV R1,#0
STR R1,[R0]
SUBS PC,LR,#4 ; IRQ中断返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -