注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
alex1120的个人空间 https://home.eeworld.com.cn/space-uid-54504.html [收藏] [复制] [分享] [RSS]
日志

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

已有 2099 次阅读2010-5-31 18:36

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

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

list p=16f73,r=dec

#include

__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 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章