打印
[PIC®/AVR®/dsPIC®产品]

引脚的选择

[复制链接]
1649|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Emily_1105|  楼主 | 2014-9-3 21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在PIC的振荡器控制寄存器中有一位是外设引脚选择锁定位。看到相关的例程中有关于这个寄存器的用法的,比如__builtin_write_OSCCONL(OSCCON & ~(1<<6));
    RPINR19bits.U2RXR=13;
    RPOR6bits.RP12R=5;
    __builtin_write_OSCCONL(OSCCON | (1<<6));
如果大家有用过PIC单片机,能否解释一下__builtin_write_OSCCONL(OSCCON & ~(1<<6)); __builtin_write_OSCCONL(OSCCON | (1<<6));这两条C语言语句是什么意思呢。
根据数据手册当OSCCON寄存器中的IOLOCK为1的时候表示外设选择被锁定,为0的时候表示外设选择没有被锁定。但是这两条语句怎么体现出来的呢。请大神支招,谢谢了。
沙发
lanmp| | 2014-9-3 22:37 | 只看该作者
第一条清零,第二条赋1

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
pizizhu1234 + 1 很给力!
板凳
Emily_1105|  楼主 | 2014-9-4 08:46 | 只看该作者
lanmp 发表于 2014-9-3 22:37
第一条清零,第二条赋1

嗯,谢谢您。请问如果这样写行不行呢:
OSCCONbits.IOLOCK=0;
OSCCONbits.IOLOCK=1;
这两条语句也是实现了一个清零,一个置1,这样写行不行呢。请您多指教,谢谢了。

使用特权

评论回复
地板
yewuyi| | 2014-9-4 10:43 | 只看该作者
Emily_1105 发表于 2014-9-4 08:46
嗯,谢谢您。请问如果这样写行不行呢:
OSCCONbits.IOLOCK=0;
OSCCONbits.IOLOCK=1;

这不是闲的难受了么,第一条会被C编译器直接优化掉,属于无效代码。

使用特权

评论回复
5
Emily_1105|  楼主 | 2014-9-4 13:42 | 只看该作者
yewuyi 发表于 2014-9-4 10:43
这不是闲的难受了么,第一条会被C编译器直接优化掉,属于无效代码。

我查的资料说,关于IOCOLK的那两条C语句是mplab编译器的内建函数。既然是内建函数就是应该按编译器的要求编写,那我这样写编译器不认可,是不是这样理解。请大神指教,谢谢了。

使用特权

评论回复
6
yewuyi| | 2014-9-4 15:55 | 只看该作者
Emily_1105 发表于 2014-9-4 13:42
我查的资料说,关于IOCOLK的那两条C语句是mplab编译器的内建函数。既然是内建函数就是应该按编译器的要求 ...

先赋值0,再赋值1,那么第一个赋值0的语句就没意义了,C编译器就会把第一句优化掉,只保留第二个赋值1的语句。

使用特权

评论回复
7
lanmp| | 2014-9-4 18:28 | 只看该作者
yewuyi 发表于 2014-9-4 15:55
先赋值0,再赋值1,那么第一个赋值0的语句就没意义了,C编译器就会把第一句优化掉,只保留第二个赋值1的 ...

用volatile声明的变量不会。所有SFR在头文件里面都声明了volatile的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

51

帖子

0

粉丝