原创 PIC单片机RB0/INT引脚中断功能详述

2009-3-11 18:58 8722 19 19 分类: MCU/ 嵌入式

基本上所有中档以上的PIC单片机,其PORTB的RB0引脚都可以作为一个外部中断信号输入,可以对输入信号的上升沿或者下降沿产生一个中断响应,该功能同时可以实现唤醒睡眠状态的单片机。


一个小小的例子来说明一下PORTB的RB0口的外部中断功能。



list  p=16f73,r=dec


#include <p16f73.inc> 


__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC


;**********************************************************
;用户寄存器定义
;********************************************************** 
w_temp   equ  0x20
status_temp  equ  0x21
pch_temp  equ     0x22
fsr_temp  equ  0x23  
count   equ     0x24


    org  0000h
    nop
    goto    main
    org  0004h
    goto Int_Ask
;**********************************************************
;主程序
;**********************************************************    
main   clrf PORTA
          clrf PORTB
         bcf  STATUS,RP1
         bsf  STATUS,RP0   ;bank1
         movlw 0x00
         movwf TRISA
         movwf TRISB
         call RB0_Int_Init
loop   goto loop
;**********************************************************
;RB0/INT引脚中断初始化
;**********************************************************
RB0_Int_Init bsf  TRISB,0    ;RB0为输入状态
    bcf  OPTION_REG,INTEDG ;OPTION_REG寄存器也位于bank0,选择下降沿中断有效
    bcf  OPTION_REG,NOT_RBPU ;选择使用PORTB内部弱上拉
    clrf INTCON    ;INTCON寄存器全部数据位清0
    bsf  INTCON,INTE   ;允许RB0/INT中断
    bsf  INTCON,GIE   ;打开全局中断使能位
    return


;**********************************************************
;中断源查询程序
;**********************************************************  
Int_Ask
Tmr0_Int_Ask btfss INTCON,T0IE   ;TMR0中断使能标志T0IE是否为1
    goto RB0_Int_Ask   ;T0IE=0,说明不是TMR0中断,转而执行判断是否为RB0/INT中断
    btfsc INTCON,T0IF   ;判断是否为TMR0产生的中断
    goto  Tmr0_Int_Start  ;是,跳转到TMR0的中断服务
RB0_Int_Ask  btfsc INTCON,INTF   ;判断是否为RB0/INT中断
    goto RB0_Int_Start  ;是,跳转到RB0/INT中断服务


   ......................;加其他中断源的查询
;**********************************************************
;RB0/INT中断服务程序    
;**********************************************************
;中断现场保护程序
RB0_Int_Start movwf w_temp    ;W寄存器的内容复制到备份寄存器中
    movf STATUS,w   ;交换前后4位后存入W寄存器中
    clrf STATUS    ;清除STATUS状态寄存器
    movwf status_temp   ;将W寄存器中的数据复制到status_temp中
    movf PCLATH,w   ;将PCLATH中的数据传送给W寄存器中
    movwf pch_temp   ;将PCLATH中的数据经W寄存器保存到其备份单元
    movf FSR,w    ;将FSR寄存器中的内容传送至W寄存器
    movwf fsr_temp   ;通过W,将FSR当中的数据存入FSR_TEMP当中


;**********************************************************
;RB0/INT中断处理程序 
RB0_Int_Del  bcf  INTCON,INTF      ;清INTF标志位
                       ..........................加自己的代码


;**********************************************************
;中断现场恢复程序
RB0_Int_Exit movf fsr_temp,w   ;取出FSR保护的内容
    movwf FSR     ;恢复FSR的内容
    movf pch_temp,w   ;取出PCLATH保护的内容
    movwf PCLATH    ;恢复PCLATH
    movf status_temp,w  ;取出STATUS保护的内容
    movwf STATUS    ;恢复STATUS
    swapf w_temp,f   ;先把w_temp内容高低半字节交换一次
    swapf w_temp,w   ;再把w_temp内容高低半字节交换一次,结果存入W
    
    retfie


Tmr0_Int_Start


...............................加自己代码


    end

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
19
关闭 站长推荐上一条 /3 下一条