为什么我的RB0口不能进入中断?
本帖最后由 pzsh 于 2021-11-29 14:15 编辑写了一个RB0口的外部输入中断程序,但是怎么都进入不了中断。哪位前辈帮忙看看。
#include<pic.h>
#include<pic16f877a.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3731);
volatile bit n;
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init() //初始化
{
OPTION_REG=0x00; //RBPU=0使能B口上拉电阻,INTEDG=0下降沿触发中断
INTCON=0xD0; //GIE为1允许总中断,INTE=1使能RB0/INT外部中断,INTF=0清RB0外部中断标志位
TRISB=0x03; //B口低2位设为键盘的输入
TRISD=0; //D口低4位设为LED的输出
PORTD=0; //D口清零
}
void interrupt INT()
{
if(INTF==1) //查询中断标志位是否被置1
{
INTF=0; //清中断标志位
delay(30); //延时去抖30mS
if(RB0==0) //再次检测RB0口是否被按下
{
n=1;
PORTD=0x00; //马达停止
delay(10); //延时10mS。以消除马达的反电动势
PORTD=0x02; //马达反转
delay(1000); //反转1S钟
PORTD=0x00; //马达停止
}
}
}
void scan()
{
uint a1,b1;
n=0;
if(RB1==0) //RB1为进笔开关
{
delay(30);
if(RB1==0)
{
// didi(1);
// while(!RB0); //while语句,判断括弧里的条件是否为真,为真执行下一条语句,为假执行本条语句,此句为判断按键是否松开
PORTD=0x01; //按键已松开。RD0口点亮LED
if(n==1)
{
PORTD=0x02; //马达反转
}
else
{
for(a1=2000;a1>0;a1--) //30S延时
for(b1=1665;b1>0;b1--); //
PORTD=0x02; //按键已弹起,马达反转
}
}
}
}
void main()
{
init();
while(1)
{
scan();
}
}
但凡IO口 操作问题,先检查一下端口是模拟状态还是数字状态。
然后还搞不定,用mcc生成初始化代码后看看差异
RB0口没有模拟功能,MCC还不会用
TRISB=0; //B口低2位设为键盘的输入
^
||
实在无法理解上面这个语句和注释的关系啊 没留意到,复制程序的时候掉了x03。本来是0x03的
软件模拟又可以进入中断,但是用ICD2仿真时,进入不了。 先量一量电平,看一看INTF标志位再说
也许你该查查硬件。。。到底高低电平有没有
标志位是确定置1了,等会我量一下平常有没高电平
标志位置起来了,只要使能位也都置位好,就应该进中断
按下RB0口的按键,中断位是可以置1,但就是进不了中断。是不是我中断函数不对?
查看INTCON当时的状态,中断是否还是使能的? 使用高级断点,在INTCON改变的时候中断 在ISR函数设置断点看是不是进入 如果上面打了不管用,去program mem view,直接在物理地址上打断点 程序中断功能没有问题,检查一下你的实际电路,看看你的芯片是否已经工作?
可以工作,但我在前面放了一个TMR0IF清零的语句,还清不了0
void main()
{
init();
while(1)
{
TMR0IF=0;
PORTD=0x00; //马达反转
}
void interrupt INT()
{
if(INTF==1) //查询中断标志位是否被置1
{
INTF=0; //清中断标志位
delay(30); //延时去抖30mS
if(RB0==0) //再次检测RB0口是否被按下
{
n=1;
PORTD=0x00; //马达停止
delay(10); //延时10mS。以消除马达的反电动势
PORTD=0x02; //马达反转
delay(1000); //反转1S钟
PORTD=0x00; //马达停止
}
}
}
以上中断程序内不要放太多的代码,包括延时动作,可以放置一个标志位,再主程序中检测标志位来处理。你可以将你的要求提出,简单给你搞个范例程序。 就简单一点,按下RB0的按键,RD0口的灯亮,用INT中断
页:
[1]
2