中断系统
4.1 SPMC65系列单片机中断系统
SPMC65 系列单片机共有 7 种中断源:定时 / 计数器溢出中断、捕获中断、外部中断、模拟中断( ADC 、电压比较器)、通讯中断、看门狗中断和时基中断。各中断简述见 表 4.1 。每个中断都有各自的标志位和控制寄存器,用于标志中断是否发生和设置中断的禁止 / 使能。具体参考相关章节。
中断源列表
中断源 |
中断状态寄存器 |
中断控制寄存器 |
中断源 |
中断状态寄存器 |
中断控制寄存器 |
定时 / 计数器溢出中断 |
Timer0 |
T0OIF ($0E.0) |
T0OIE ($0F.0) |
外部中断 |
IRQ0 |
IRQ0IF ($0C.0) |
IRQ0IE ($0D.0) |
Timer1 |
T1OIF ($0E.1) |
T1OIE ($0F.1) |
IRQ1 |
IRQ1IF ($0C.1) |
IRQ1IE ($0D.1) |
Timer2 |
T2OIF ($0E.2) |
T2OIE ($0F.2) |
IRQ2 |
IRQ2IF ($0C.2) |
IRQ2IE ($0D.2) |
Time3 |
T3OIF ($0E.3) |
T3OIE ($0F.3) |
IRQ3 |
IRQ3IF ($0C.3) |
IRQ3IE ($0D.3) |
Timer4 |
T4OIF ($0E.4) |
T4OIE ($0F.4) |
IRQ4 |
IRQ4IF ($0C.4) |
IRQ4IE ($0D.4) |
Timer5 |
T5OIF ($0E.5) |
T5OIE ($0F.5) |
IRQ5 |
IRQ5IF ($0C.5) |
IRQ5IE ($0D.5) |
捕获中断 |
Capture0 |
CAP0IF ($0E.6) |
CAP0IE ($0F.6) |
模拟中断 |
ADC |
ADIF ($0C.7) |
ADIE ($0D.7) |
Capture1 |
CAP1IF ($0E.7) |
CAP1IE ($0F.7) |
Comparator0 |
CMP0IF ($26.0) |
CMP0IE ($27.0) |
Capture2 |
CAP2IF ($0C.0) |
CAP2IE ($0D.0) |
Comparator1 |
CMP1IF ($26.1) |
CMP1IE ($27.1) |
Capture3 |
CAP3IF ($0C.1) |
CAP3IE ($0D.1) |
通讯中断 |
SPI |
SPIIF ($26.2)
SPIIF ($3A.7) |
SPIIE ($3A.6) |
Capture4 |
CAP4IF ($0C.4) |
CAP4IE ($0D.4) |
UART |
UARTIF ($26.3)
RXIF ($48.7)
TXIF ($48.6) |
RXIE ($46.7)
TXIE ($46.6) |
Capture5 |
CAP5IF ($0C.5) |
CAP5IE ($0D.5) |
IIC |
IICIF($26.4)
IICIF($4B.4) |
IICIE ($4A.4) |
看门狗中断 |
WDIF ($0C.6) |
WDIE ($0D.6) |
时基中断 |
ITVALIF ($26.5) |
ITVALIE ($27.5) |
外部中断 INT0~5 (即 IRQ0~5 )共有 6 个通道,输入引脚与通用 I/O 口引脚复用,详细见 表 4.2 。
表 4 . 2 外部中断与通用 I/O 复用表
管脚 |
特殊功能 |
PD5 |
外部中断 5 输入 / 捕获器 5 输入
定时 / 计数器 5 外部时钟输入 |
PD4 |
外部中断 4 输入 / 捕获器 4 输入
定时 / 计数器 4 外部时钟输入 |
PD1 |
外部中断 3 输入 |
PD0 |
外部中断 2 输入 |
PB5 |
外部中断 1/ 捕获器 3 输入
定时 / 计数器 3 外部时钟输入 |
PB4 |
外部中断 0/ 捕获器 2 输入
定时 / 计数器 2 外部时钟输入 |
在 SPMC65 系列单片机中,外部中断分为两种:非屏蔽中断( NMI )和可 屏蔽中断 ( IRQ )。每当 CPU 执行完一条指令,微处理器会自动检查当时的中断状态。首先检查非屏蔽中断 NMI ,若该中断发生,则立即做非屏蔽中断 NMI 的处理。若非屏蔽中断 NMI 中断没有发生,并且状态寄存器( P )中的中断标志( I )为 0 ,则微处理器接着检查可屏蔽中断请求 IRQ 。
非屏蔽中断 NMI 和可屏蔽中断 IRQ 有几点区别需要注意:
1. 非屏蔽中断 NMI 优先级高于可屏蔽中断 IRQ ,并且不论状态寄存器( P )的中断标志( I )的内容值如何, CPU 均会接受 NMI 中断;可屏蔽中断只有在状态寄存器( P )的中断标志( I )为 0 时才会被接受。
2. 非屏蔽中断 NMI 只有上升沿 / 下降沿触发,没有电平触发;可屏蔽中断 IRQ 可以设置为上升沿 / 下降沿触发,也可以设置为高 / 低电平触发。
3. 非屏蔽中断 NMI 只能选择其中的一个中断作为非屏蔽中断使用,不能同时使用两个或两个以上;可屏蔽中断 IRQ 无此限制,可以同时使用多个。
当外部中断被设置为沿触发模式时,一个有效的边沿输入便会触发中断。如果设置为电平触发,一个持续有效的电平会令中断产生,直到该电平被去掉。
非屏蔽中断的设置需要在芯片配置选项中设置,具体参考第十章中的介绍。
P_IRQ_Opt1 、 P_IRQ_Opt0 是中断的触发方式选择寄存器,可以将外部中断设置为上升沿触发,也可以设置为下降沿的触发。为了提高抗干扰性,设置这两个寄存器时需要连续写两次才能将内容写进去。
定时 / 计数器溢出中断、时基中断、看门狗中断、模拟中断( ADC )、捕获中断、比较中断和通讯中断在后续章节都有详细描述。
4.2 中断控制寄存器
4.2.1 P_INT_Ctrl0($0D ,R/W)
P_INT_Ctrl0 控制寄存器具有可读和可写的属性,其读写时的意义是不同的。其各位如 表 4.3 所列。
P_INT_Ctrl0 控制寄存器的默认初始值为 #00h 。
表 4 . 3 控制寄存器单元 P_INT_Ctrl0 ( $0D , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
ADIE |
WDIE |
IRQ5E/
CAP5E |
IRQ4E/
CAP4E |
IRQ3IE |
IRQ2IE |
IRQ1IE/
CAP3IE |
IRQ0IE/
CAP2IE |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
Bit 7 ADIE : AD 转换中断使能位
0 = 禁止
1 = 使能
Bit 6 WDIE:看门狗中断使能位
0 = 禁止
1 = 使能
Bit 5 IRQ5IE/CAP5IE:IRQ5/CAP5使能位
0 = 禁止
1 = 使能
Bit 4 IRQ4IE/CAP4IE:IRQ4/CAP4使能位
0 = 禁止
1 = 使能
Bit 3 IRQ3IE:IRQ3使能位
0 = 禁止
1 = 使能
Bit 2 IRQ2IE:IRQ2使能位
0 = 禁止
1 = 使能
Bit 1 IRQ1IE/ CAP3IE:IRQ1/CAP3使能位
0 = 禁止
1 = 使能
Bit 0 IRQ0IE/ CAP2IE:IRQ0/CAP2使能位
0 = 禁止
1 = 使能
注:
1. IRQ5、IRQ4分别和CAP5、CAP4共用中断控制位
2. IRQ1、IRQ0分别和CAP3、CAP2共用中断控制位
3. IRQx(x=0~5)为外部中断x,CAPx(x=0~5)为捕获器x
当写中断控制寄存器 P_INT_Ctrl0 的某位为 1 时,即允许该位所代表的中断被开放,此时当有中断申请时, CPU 会响应。如果该位被置 0 则禁止该位所代表的中断。即使有中断申请, CPU 也不会响应。
当读取中断控制寄存器单元时, P_INT_Ctrl0 寄存器的每一位均代表一个中断。可以通过读取该位确定中断是否使能。
例如下面的程序中使能外部中断 2 :
lda #00000100B
sta P_INT_Ctrl0 ; 使能 INT2 |
4.2.2 P_INT_Ctrl1($0F ,R/W)
该寄存器与 P_INT_Ctrl0 功能相似,差别在于该寄存器与寄存器 P_INT_Ctrl0 分别对不同的中断源操作。具体见 表 4.4 。该寄存器默认初始值为 #00h 。
表 4 . 4 中断控制寄存器 1 P_INT_Ctrl1 ( $0F , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
CAP1IE |
CAP0IE |
T5OIE |
T4OIE |
T3OIE |
T2OIE |
T1OIE |
T0OIE |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
Bit 7 CAP1IE: 捕获1中断使能位
0 = 禁止
1 = 使能
Bit 6 CAP0IE: 捕获0中断使能位
0 = 禁止
1 = 使能
Bit 5 T5OIE: 定时/计数器5溢出中断使能位
0 = 禁止
1 = 使能
Bit 4 T4OIE: 定时/计数器4溢出中断使能位
0 = 禁止
1 = 使能
Bit 3 T3OIE: 定时/计数器3溢出中断使能位
0 = 禁止
1 = 使能
Bit 2 T2OIE: 定时/计数器2溢出中断使能位
0 = 禁止
1 = 使能
Bit 1 T1OIE: 定时/计数器1溢出中断使能位
0 = 禁止
1 = 使能
Bit 0 T0OIE: 定时/计数器0溢出中断使能位
0 = 禁止
1 = 使能
4.2.3 P_INT_Ctrl2($27 ,R/W)
该寄存器与 P_INT_Ctrl0 、 P_INT_Ctrl1 功能相似,差别在于该寄存器与寄存器 P_INT_Ctrl0 、 P_INT_Ctrl1 分别对不同的中断源操作。具体见 表 4.4 。该寄存器默认初始值为 #00h 。
表 4 . 5 中断控制寄存器 2 P_INT_Ctrl2 ( $27 , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
- |
- |
ITVALIE |
- |
- |
- |
CMP1IE |
CMP0IE |
- |
- |
R/W |
- |
- |
- |
R/W |
R/W |
Bit[7:6] 保留
Bit 5 ITVALIE: 时基中断使能位
0 = 禁止
1 = 使能
Bit[4:0] 保留
Bit 1 CMP1IE: 比较器1使能位
0 = 禁止
1 = 使能
Bit 0 CMP0IE: 比较器0使能位
0 = 禁止
1 = 使能
4.2.4 P_INT_Flag0($0C,R/W)
P_INT_Flag0 是中断标志寄存器,当中断产生时,相应的标志位便会被置 1 。当 CPU 查询到该标志位被置 1 后便转到中断服务子程序中去执行。中断服务子程序退出前,需要将该标志位清零,清零的方法是将相应的标志位写 1 。 P_INT_Flag0 寄存器中各个位所对应的中断源与 P_INT_Ctrl0 寄存器是一样的,所以其各个位的功能可以参考 表 4.6 ,以及前面对 P_INT_Ctrl0 的描述。该寄存器默认初始值为 #00h 。
表 4 . 6 中断标志寄存器 0 P_INT_Flag0 ( $0C , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
ADIF |
WDIF |
IRQ5IF/
CAP5IF |
IRQ4IF/
CAP4IF |
IRQ3IF |
IRQ2IF |
IRQ1IF/
CAP3IF |
IRQ0IF/
CAP2IF |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
注:
写入“ 1 ”清除相应标志
1. IRQ5 、 IRQ4 分别和 CAP5 、 CAP4 共用中断标志位
2. IRQ1 、 IRQ0 分别和 CAP3 、 CAP2 共用中断标志位
4.2.5 P_INT_Flag1($0E ,R/W)
与 P_INT_Flag0 一样,中断标志寄存器 1 ( P_INT_Flag1 )对应着中断控制寄存器 1 ( P_INT_Ctrl1 )的各个中断源的中断标志, P_INT_Flag1 中各个位的具体功能可以参考 表 4.7 以及 P_INT_Ctrl1 中的描述。该寄存器默认初始值为 #00h 。
表 4 . 7 中断标志寄存器 1 P_INT_Flag1 ( $0E , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
CAP1IF |
CAP0IF |
T5OIF |
T4OIF |
T3OIF |
T2OIF |
T1OIF |
T0OIF |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
注:向相应位写“ 1 ”清除该标志。
4.2.6 P_INT_Flag2($26 ,R/W)
中断标志寄存器 2 ( P_INT_Ctrl2 )除了对应中断控制寄存器 2 ( P_INT_Ctrl2 )的中断源的中断标志外,还多出了 UART 中断标志、 SPI 中断标志位以及 IIC 中断标志位,具体请参考 表 4.8 。该寄存器默认初始值为 #00h 。
表 4 . 8 中断标志寄存器 2 P_INT_Flag2 ( $26 , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
- |
- |
ITVALIF |
IICIF |
UARTIF |
SPIIF |
CMP1IF |
CMP0IF |
- |
- |
R/W |
R |
R |
R |
R/W |
R/W |
Bit [7:6] 保留
Bit 5 ITVALIF:时基中断标志
0 =中断没有发生
1 =中断发生
Bit 4 IICIF:IIC中断标志
0 = 中断没有发生
1 = 中断发生
Bit 3 UARTIF:UART中断标志
0 =中断没有发生
1 =中断发生
Bit 2 SPIIF:SPI中断标志
0 =中断没有发生
1 =中断发生
Bit 1 CMP1IF:比较器1中断标志
0 =中断没有发生
1 =中断发生
Bit 0 CMP0IF:比较器0中断标志
0 =中断没有发生
1 =中断发生
注:向相应位写“ 1 ”清除该标志。但 SPIIF 、 UARTIF 、 IICIF 标志不能通过此寄存器清除,它们要通过对另外的寄存器操作进行清除,具体请参考后面介绍串行接口的章节。
4.2.7 P_IRQ_Opt0($33,R/W)
写 IRQ 和 Capture 设置寄存器 0 可以对外部中断 4 、 5 或捕获中断 4 、 5 的属性设置,该寄存器默认初始值为 #00h ;具体各位的设置请参考 表 4.9 :
表 4 . 9 IRQ 和 Capture 设置寄存器 0 P_IRQ_Opt0 ( $33 , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
- |
- |
- |
- |
IRQ5ES/
CAP5ES |
IRQM5 |
IRQ4ES/
CAP4ES |
IRQM4 |
- |
- |
- |
- |
R/W |
R/W |
R/W |
R/W |
Bit [7:4]保留
Bit 3 外部中断5极性控制位或捕获器5控制位
IRQ5ES:
IRQM5=1:(电平触发)
0= 低电平触发
1= 高电平触发
IRQM5=0:(边沿触发)
0= 下降沿触发
1= 上升沿触发
CAP5ES:捕获器5的触发沿极性选择位
0= 上升沿触发并清除计数器
1= 下降沿触发并清除计数器
Bit 2 IRQM5:INT5触发模式选择位
0= 边沿触发
1= 电平触发
Bit 1 外部中断4极性控制位或捕获器4控制位
IRQ4ES:
RQM4=1:(电平触发)
0= 低电平触发
1= 高电平触发
IRQM4=0: (边沿触发)
0= 下降沿触发
1= 上升沿触发
CAP4ES:捕获器4的触发沿极性选择位
0= 上升沿触发并清除计数器
1= 下降沿触发并清除计数器
Bit 0 IRQM4:INT4触发模式选择位
0= 边沿触发
1= 电平触发
4.2.8 P_IRQ_Opt1($34,R/W)
写 IRQ 和 Capture 设置寄存器 1 可以对外部中断 3 、 2 、 1 、 0 或捕获中断 3 、 2 的属性设置,该寄存器默认初始值为 #00h ;具体各位的设置请参考 表 4.10 :
表 4 . 10 IRQ 和 Capture 设置寄存器 1 P_IRQ_Opt1 ( $34 , R/W )
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
IRQ3ES |
IRQM3 |
IRQ2ES |
IRQM2 |
IRQ1ES/
CAP3ES |
IRQM1 |
IRQ0ES/
CAP2ES |
IRQM0 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
Bit 7 IRQ3ES:外部中断3极性控制位
IRQM3=1:(电平触发)
0= 低电平触发
1= 高电平触发
IRQM3=0:(边沿触发)
0 = 下降沿触发
1 = 上升沿触发
Bit 6 IRQM3:INT3触发模式选择位
0 = 边沿触发
1 = 电平触发
Bit 5 IRQ2ES:外部中断2极性控制位
IRQM2=1:(电平触发)
0 = 低电平触发
1 = 高电平触发
IRQM2=0:(边沿触发)
0 = 下降沿触发
1 = 上升沿触发
Bit 4 IRQM2:INT2触发模式选择位
0 = 边沿触发
1 = 电平触发
Bit 3 IRQ1ES/CAP3ES:外部中断1极性控制位或捕获器3控制位
IRQ1:
IRQM1=1: (电平触发)
1= 高电平触发
0= 低电平触发
IRQM1=0: (边沿触发)
1= 上升沿触发
0= 下降沿触发
CAP3ES:捕获器3的触发沿极性选择位
1= 下降沿触发并清除计数器
0= 上升沿触发并清除计数器
Bit 2 IRQM1:INT1触发模式选择位
0 = 边沿触发
1 = 电平触发
Bit 1 IRQ0ES/CAP2ES:外部中断0极性控制位或捕获器2控制位
IRQ0:
IRQM0=1:(电平触发)
1= 高电平触发
0= 低电平触发
IRQM0=0:(边沿触发)
1= 上升沿触发
0= 下降沿触发
CAP2ES:捕获器2的触发沿极性选择位
1= 下降沿触发并清除计数器
0= 上升沿触发并清除计数器
Bit 0 IRQM0:INT0触发模式选择位
0 = 边沿触发
1 = 电平触发
注:以上所有位都需要写两次才能设置成功
4.3 中断应用
4.3.1 中断设置步骤
SPMC65 系列单片机中,中断的设置步骤如下:
1. 用 “SEI ” 指令关闭总的中断开关
2. 向中断控制寄存器的相应位写入“ 1 ”使能中断
3. 用“ CLI ”指令打开总的中断开关
4. 等待中断产生
发生中断时,系统自动将程序返回地址和状态寄存器( P )压入堆栈。
进入中断服务程序,如果用户还希望保存关键的寄存器(例如:累加器 A 、 X 寄存器、 Y 寄存器),则需要软件完成。通过查询中断标志位便可以知道是哪个中断源发生了中断。在退出中断服务程序前必须由软件清除对应中断标志位,以避免中断程序的重复调用。执行中断返回指令 RTI 中断返回。
4.3.2 通常中断设置
【例 5-1 】: 使能 IRQ0 中断,上升沿触发
lda #00000000B
sta P_IOB_Data
sta P_IOB_Attrib
lda #11101111B ; 将 PB4 设置为下拉输入,作为 IRQ0 的中断输入
sta P_IOB_Dir
lda #00000010B ; 设置 IRQ0 为上升沿触发
sta P_IRQ_Opt1
sta P_IRQ_Opt1
lda #$FF
sta P_INT_Flag0 ; 清除中断标志位
lda #00000001B ; 使能 IRQ0
sta P_INT_Ctrl0
cli ; 打开总的中断开关
V_IRQ:
pha ; 将累加器 A 压栈
txa
pha ; 将 X 寄存器压栈
lda P_INI_Flag0
and #00000001B
beq L_IRQ0
jmp L_IRQL1
L_IRQ0:
…… ; 中断服务程序
lda #00000001B
sta P_INT_Flag0 ; 清除 IRQ0 中断标志
L_IRQL1:
pla
tax ; 将 X 寄存器出栈
pla ; 将累加器 A 出栈
rti |
4.3.3 非屏蔽中断的设置
非屏蔽中断的设置分为两步:
1. 设置芯片配置选项寄存器(在 FortisIDE 的 Mask Option 选项设置),选定非屏蔽中断所用的 IO 口;
2. 在程序中对寄存器进行设置。
在程序中对寄存器进行设置步骤 :
1. 将中断口设置为输入;
2. 在寄存器 P_INT_Ctrl0 中打开中断使能;
3. 在寄存器 P_IRQ_Opt1 或 P_IRQ_Opt0 中设置触发模式;
4. 在寄存器 P_INT_Flag0 清除中断标志位,等待外部中断地来临。
【例 5-2】: 下面以 32 管脚的 SPMC65P2408A 为例,设置 PD0 为非屏蔽中断。当 PD0 口接收到上升沿后,便会产生中断,进入中断服务子程序。
在 Fortis IDE 的 Mask Option 选项中选择“ NMI Source Selection ”选项,选中 PD0 。
在程序中进行设置,具体程序如下:
.CODE
.PUBLIC V_Reset
V_Reset:
sei ; 关闭中断
ldx #C_STACK_BOTTOM ; 初始化堆栈指针在 $00FF
txs
F_Main:
lda P_IOD_Buf
and #11111110 B
sta P_IOD_Data
lda P_IOD_Attrib
and #11111110B
sta P_IOD_Attrib
lda P_IOD_Dir
and #11111110B
sta P_IOD_Dir ; 端口 D0 设置为下拉输入
lda #00000100B
sta P_INT_Ctrl0 ; 使能 INT2
lda #00100000B
sta P_IRQ_Opt1 ; 设置为上升沿触发
sta P_IRQ_Opt1
lda #00000100B
sta P_INT_Flag0 ; 清除 INT2 标志位
L_Loop:
Nop ; 等 INT2 中断
jmp L_Loop
V_IRQ:
rti
V_NMI:
pha
txa
pha
lda P_INT_Flag0
and #00000100B ; 判断是否 INT2?
beq V_NMI_Exit ; 不是返回
lda #FFh ; 点亮数码管
sta P_IOA_Dir
lda #00h
sta P_IOA_Attrib
lda #FFh
sta P_IOA_Data
nop
nop ; 中断处理
lda #00000100B
sta P_INT_Flag0 ; 清除 INT2 标志位
V_NMI_Exit:
pla
tax
pla
rti
VECTOR .SECTION
DW V_NMI
DW V_Reset
DW V_IRQ
.END
|
4.3.4 可屏蔽中断的设置
使用可屏蔽中断时分为以下三步:
1. 在 Fortis IDE 的 Mask Option 选项中确认所使用的 I/O 口没有被设置为非屏蔽中断;
2. 在程序中对寄存器进行设置,该步骤与非屏蔽中断的设置方法相同。
3. 在程序中将状态寄存器( P )的中断标志( I )清零,即执行指令: cli
【例 5-3】: 下面以 32 管脚的 SPMC65P2408A 为例,设置 PD1 为可屏蔽中断。当 PD1 口接收到下降沿后,便会产生中断,进入中断服务子程序。
在 Fortis IDE 的 Mask Option 选项中确认 PD1 口没有被设置为非屏蔽中断。
在程序中进行设置,具体程序如下:
.CODE
.PUBLIC V_Reset
V_Reset:
sei ; 关闭中断
ldx #C_STACK_BOTTOM ; 设置堆栈指针在 $00FF
txs
F_Main:
lda P_IOD_Buf
and #11111101B
sta P_IOD_Data
lda P_IOD_Attrib
and #11111101B
sta P_IOD_Attrib
lda P_IOD_Dir
and #11111101B
sta P_IOD_Dir ; 端口 D1 为下拉输入
lda #00001000B
sta P_INT_Ctrl0 ; 使能中断 IRQ3
lda #00000000B
sta P_IRQ_Opt1 ; 设置为下降沿触发
sta P_IRQ_Opt1
lda #00001000B
sta P_INT_Flag0 ; 清除 IRQ3 中断标志位
cli
L_Loop:
nop
jmp L_Loop
V_IRQ:
pha
txa
pha
lda P_INT_Flag0
and #00001000B ; 是 IRQ3 中断吗 ?
beq V_IRQ_Exit ; 不是返回
lda #FFh
sta P_IOA_Dir
lda #00h
sta P_IOA_Attrib
lda #FFh
sta P_IOA_Data
nop
nop ; 点亮数码管
set P_INT_Flag0,4 ; 清除 IRQ0 中断标志
V_IRQ_Exit:
pla
tax
pla
rti
V_NMI:
rti
VECTOR .SECTION
DW V_NMI
DW V_Reset
DW V_IRQ
.END
|
|