gpk77娱乐城电子游戏: 为什么我的RB0口不能进入中断?

禁止游客赌场登入
668|16
 楼主 | 2020-6-27 09:52 | 显示全部楼层 |阅读模式
本帖最后由 西门闩 于 2020-6-27 19:22 编辑

最近闲来无事,gpk77娱乐城电子游戏:拿出几年前的学习板来玩,写了一个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();
        }
}

| 2020-6-27 10:54 | 显示全部楼层
但凡IO口 操作问题,先检查一下端口是模拟状态还是数字状态。
然后还搞不定,用mcc生成初始化代码后看看差异
 楼主 | 2020-6-27 11:51 | 显示全部楼层
wooda 发表于 2020-6-27 10:54
但凡IO口 操作问题,先检查一下端口是模拟状态还是数字状态。
然后还搞不定,用mcc生成初始化代码后看看差 ...

RB0口没有模拟功能,MCC还不会用
| 2020-6-27 11:51 | 显示全部楼层
TRISB=0;                                        //B口低2位设为键盘的输入
    ^
    ||
实在无法理解上面这个语句和注释的关系啊
 楼主 | 2020-6-27 17:29 | 显示全部楼层
bellstudio 发表于 2020-6-27 11:51
TRISB=0;                                        //B口低2位设为键盘的输入
    ^
    ||

没留意到,复制程序的时候掉了x03。本来是0x03的
 楼主 | 2020-6-27 17:45 | 显示全部楼层
bellstudio 发表于 2020-6-27 11:51
TRISB=0;                                        //B口低2位设为键盘的输入
    ^
    ||

没留意到,复制程序的时候掉了x03。本来是0x03的.软件模拟又可以进入中断,但是用ICD2仿真时,进入不了。
| 2020-6-28 10:13 | 显示全部楼层
先量一量电平,看一看INTF标志位再说
| 2020-6-28 20:32 | 显示全部楼层
西门闩 发表于 2020-6-27 17:45
没留意到,复制程序的时候掉了x03。本来是0x03的.软件模拟又可以进入中断,但是用ICD2仿真时,进入不了。 ...

也许你该查查硬件。。。到底高低电平有没有
 楼主 | 2020-6-29 19:43 | 显示全部楼层
ynwa 发表于 2020-6-28 10:13
先量一量电平,看一看INTF标志位再说

标志位是确定置1了,等会我量一下平常有没高电平
| 2020-6-30 14:36 | 显示全部楼层
西门闩 发表于 2020-6-29 19:43
标志位是确定置1了,等会我量一下平常有没高电平

标志位置起来了,只要使能位也都置位好,就应该进中断
 楼主 | 2020-6-30 20:17 | 显示全部楼层
ynwa 发表于 2020-6-30 14:36
标志位置起来了,只要使能位也都置位好,就应该进中断

按下RB0口的按键,中断位是可以置1,但就是进不了中断。是不是我中断函数不对?
| 2020-6-30 20:31 | 显示全部楼层
1、查看INTCON当时的状态,中断是否还是使能的?
2、使用高级断点,在INTCON改变的时候中断
3、在ISR函数设置断点看是不是进入
4、如果上面打了不管用,去program mem view,直接在物理地址上打断点
| 2020-7-1 10:42 | 显示全部楼层
程序中断功能没有问题,检查一下你的实际电路,看看你的芯片是否已经工作?
 楼主 | 2020-7-1 18:53 | 显示全部楼层
bellstudio 发表于 2020-6-30 20:31
1、查看INTCON当时的状态,中断是否还是使能的?
2、使用高级断点,在INTCON改变的时候中断
3、在ISR函数设 ...

多谢
 楼主 | 2020-7-1 19:16 | 显示全部楼层
zjjhtony 发表于 2020-7-1 10:42
程序中断功能没有问题,检查一下你的实际电路,看看你的芯片是否已经工作? ...

可以工作,但我在前面放了一个TMR0IF清零的语句,还清不了0
void main()
{
        init();
        while(1)
        {
                TMR0IF=0;
                PORTD=0x00;                        //马达反转
        }
| 2020-7-2 10:40 | 显示全部楼层
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;                        //马达停止
                }
        }
}
以上中断程序内不要放太多的代码,包括延时动作,可以放置一个标志位,再主程序中检测标志位来处理。你可以将你的要求提出,简单给你搞个范例程序。
 楼主 | 2020-7-2 18:37 | 显示全部楼层
zjjhtony 发表于 2020-7-2 10:40
void interrupt INT()
{
        if(INTF==1)                                        //查询中断标志位是 ...

就简单一点,按下RB0的按键,RD0口的灯亮,用INT中断
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

禁止游客赌场登入 永利游戏开户直营 返回顶部 返回列表
ds太阳城电子娱乐手机app 网络博彩推广团队登入 金三角娱乐中心手机app 禁止游客赌场登入 禁止游客赌场登入
澳门葡京电脑注册 银河娱乐场 天天彩票 澳门银河登入 DS太阳城环亚娱乐国际平台
马来西亚云顶赌场网站登入 牡丹国际人娱乐城电子游戏 澳门第一娛乐城官网官方网 在线新葡京赌场 皇冠现金娱乐网登入
永利娱乐场备用网址 威尼斯人娱乐备用网址 申博亚洲官网登入 皇家一博平台 加拿大28网站