logo
 
首页-> 产品信息-> 8位单片机
 
入门指南
开发&工具
应用方案
客户支持
 
学习e条龙
一、单片机简介 二、指令系统 三、IO端口 四、中断系统
五、定时/计数器 六、串行接口 七、模拟外设 八、其它硬件
九、开发工具 十、应用实例 十一、附录  

中断系统

内容索引
4.1 SPMC65系列单片机中断系统
4.2 中断控制寄存器
4.3 中断应用

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

 

版权所有:北京凌阳爱普科技有限公司 京ICP备05061966号 未经许可网站内容严禁复制、转载,任何人不得擅自使用
友情链接:凌阳爱普 嵌入式培训 安卓培训 凌阳大学计划 北京嵌入式培训 深圳嵌入式培训 成都嵌入式培训