PIC16F887 RB0外部中断(2)

2019-04-15 12:14发布

#include #include __CONFIG (CP_OFF&WDTE_OFF&BOREN_ON&PWRTE_OFF&FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF); /*配置位 CP_OFF,代码保护位,程序存储器代码保护关闭; WDTE_OFF,看门狗定时器使能位,看门狗定时器关闭,可以通过WDTCON寄存器的SWDTEN位使能; BOREN_OFF,掉电复位选择位,掉电复位关闭; PWRTE_OFF,上电定时器使能位,上电定时器关闭; FOSC_HS,振荡器选择位,高速晶振或谐振器在RA6/OSC2/CLKOUT和RA7/OSC1/CLKIN; WRT_OFF,闪存程序存储器自写使能位,写保护关闭; LVP_OFF,低电压编程使能位,RB3引脚有数字I/O,使用MCLK上的HV(高电压)来编程; CPD_OFF,数据代码保护位,数据存储器代码保护关闭; */ #define uchar unsigned char #define uint unsigned int #define LEDA RB3//定义灯1 #define RET RB0//定义灯1 void delay(unsigned int n); void interrupt ISR(void); uchar count; main() { TRISB=0X01; //RB0为输入,其余为输出 PORTB=0x09; //RB3置1 //ANSEL=0x00; ANSELH=0x00; //将RB0(AN12)引脚被分配给端口或特殊功能。 //必须初始化ANSELH 寄存器以将模拟通道配置为数字输入。配置为模拟输入的引脚将读为0。 /* GIE = 1; //GIE: 全局中断允许位 1 = 允许所有未被屏蔽的中断 PEIE = 1; //PEIE: 外设中断允许位 1 = 允许所有未被屏蔽的外设中断 INTE = 1; //INTE:INT 外部中断允许位 1 = 允许INT 外部中断 RBIE = 1; //RBIE:PORTB 电平变化中断允许位 1 = 允许PORTB 电平变化中断 INTF=0; //INTF:INT 外部中断标志位 0 = 未发生INT 外部中断 */ INTCON=0XD8; WPUB = 0X01;//使能上拉 /* INTEDG=0; //触发中断的边沿选择位 0 = INT 引脚下降沿触发中断 */ OPTION_REG=0x00; TRISD=0X00; //定义PORTD为输出 PORTD=0X00; //输出低电平 while(1) { } } //延时(n)ms void delay(unsigned int n) { unsigned int j; unsigned int k; for(j=0;j0;k--) NOP(); } void interrupt ISR(void) { if(INTF==1) //电平变化中断 { delay(20); if(RB0 == 0) { INTF=0; PORTD = ~PORTD; LEDA = ~LEDA; } } }
代码经过测试。