这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Microchip » 【再也不相信爱情了】--再也不相信Microchip C30自带头文件中的XXX

共24条 1/3 1 2 3 跳转至

【再也不相信爱情了】--再也不相信Microchip C30自带头文件中的XXXXbits.XXX了

高工
2013-07-26 15:38:06     打赏

    大家写程序的时候是不是在可以的情况下喜欢使用例如if(PORTBbits.RB12 == 0){}之类的句子啊,只说括号里面的内容哈!这里提个醒:在某些情况下是不能这样使用的,附上代码说明:

void __attribute__((interrupt, no_atuo_psv)) _CNInterrupt(void)
{
    IFS1bits.CNIF = 0; // 清除外部中断标志位
    Exit_Delay();
    if((LATB &0x1000) == 0x1000)  // RB12
    {
        KeyValue = 1;    // 只有这一句执行得到,因为上面是用的整个寄存器与或实现的
    }

    // 以下这些用XXXXbits.XXXX的都无法检测到的
    else if(LATBbits.LATB13 == 0)  // RB13
    {
        KeyValue = 2;
    }
    else if(LATBbits.LATB14 == 0)
    {
        KeyValue = 3;
    }
    else if(LATBbits.LATB15 == 0)
    {
        KeyValue = 4;
    }
    else if(LATFbits.LATF4 == 0)
    {
        KeyValue = 5;
    }
    else if(LATFbits.LATF5 == 0)
    {
        KeyValue = 6;
    }

    Exit_Delay();
    IFS1bits.CNIF = 0; // 清除外部中断标志位
}

不知道是不是我使用的错误,按理说官方文件里面的东西不应该出这样的错啊,再也不相信爱情了……


刚刚一个马虎,判断错误,在这里声明,至少在这个地方不是刚刚说的XXXXbits.XXXX引起的,而是LATX引起的,下面的程序试过是正确的,有没有大侠知道全面点的,麻烦总结一下:

void __attribute__((interrupt, no_atuo_psv)) _CNInterrupt(void)
{
    IFS1bits.CNIF = 0; // 清除外部中断标志位
    Exit_Delay();
    //if((PORTB & 0x1000) == 0x0000)  // RB12
    if(PORTBbits.RB12 == 0)
    {
        KeyValue = 1;   // ===>这样就可以,看来是用的有问题
    }
    else if((PORTB &0x2000) == 0x0000)  // RB13
    {
        KeyValue = 2;
    }
    else if((PORTB &0x4000) == 0x0000)
    {
        KeyValue = 3;
    }
    else if((PORTB &0x8000) == 0x0000)
    {
        KeyValue = 4;
    }
    else if((PORTF &0x0010) == 0x0000)
    {
        KeyValue = 5;
    }
    else if((PORTF &0x0020) == 0x0000)
    {
        KeyValue = 6;
    }

    Exit_Delay();
    IFS1bits.CNIF = 0; // 清除外部中断标志位
}

我又相信爱情了,但好像对爱情还不是很懂……

 




关键词: 再也     不相信     爱情     Microchip     XXXXb    

高工
2013-07-26 15:40:27     打赏
2楼
个人比较喜欢用switch语句

专家
2013-07-26 15:40:41     打赏
3楼

同情一下



院士
2013-07-26 15:41:05     打赏
4楼
这标题很抓人

高工
2013-07-26 15:42:25     打赏
5楼
这个好用switch语句么,一个寄存器某些引脚用作了中外部中断,其他引脚还有其他功能,随时可能发生值的变化,不能吧……

高工
2013-07-26 15:43:32     打赏
6楼
我以为我已经不是标题党了。

高工
2013-07-26 15:44:45     打赏
7楼

具体没研究

不过我看到好多else if,我下意识就想起switch。


高工
2013-07-26 15:45:15     打赏
8楼
亲,人无完人,更何况程序咧,要淡定= =

高工
2013-07-26 15:45:21     打赏
9楼
楼主在每个优化等级试一下,看会不会有变化。microchip的东西我没用过,是用maplab么?

院士
2013-07-26 15:57:56     打赏
10楼

这个应该不会啊~~

这些都是C语言的写法,机器也认识C语言,而是编译后的结果。

1、楼主看一下前面坛友提到的优化问题;

2、看看头文件里面对于位定义的声明是否是条件编译,从而造成未满足条件而未编译;


共24条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]