基本上所有中档以上的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
文章评论(0条评论)
登录后参与讨论