技术热线: 4007-888-234
设计开发

专注差异化嵌入式产品解决方案 给智能产品定制注入灵魂给予生命

开发工具

提供开发工具、应用测试 完善的开发代码案例库分享

技术支持

从全面的产品导入到强大技术支援服务 全程贴心伴随服务,创造无限潜能!

新品推广

提供新的芯片及解决方案,提升客户产品竞争力

新闻中心

提供最新的单片机资讯,行业消息以及公司新闻动态

一个非常简单但你很难搞懂的C程序

更新时间: 2019-03-26
阅读量:3145

以下是问题的所在。首先说明的是硬件和寄存器的设定完全正确。我把有问题的程序规纳出来,并且以我先前用51单片机模拟 i2c 能够运行的程序做了对比。SPII2C都是串行的接口。其原理自己的看书了。问题就出现在小小的移位上。下面把其中最容易忽略的地方列出来给大家一起讨论。

大家找出下面两个程序的本质区别在什么地方。

main() { char data; char i; data = 0x55;//01010101; for(i = 0; i < 8; i++) { RB4 = (bit)(data & 0x80);//目的是让RB4口移位输出01010101data <<= 1;//输出下一位。 } }

和下面的程序。

main() { char data; char i; data = 0x55; for(i = 0; i < 8; i++) { if(data & 0x80)//完成让RB4口移位输出01010101{ RB4 = 1; } else { RB4 = 0; } data <<= 1; //输出下一位。 } }

以上两个程序其中上面那个是用在51单片机模拟I2C已经可以运行的程序了,一样是移位的程序却放到PIC里面就不能运行了。但改成下面那个程序在PIC就可以用。有人会说那下面那个程序放到51里会怎样?我试过一样没问题。也就是51两个程序都可以用,而PIC却只能用下面的那个,这是我用做SPI的情况,至于其他的编程我就没试过了。

但是按C语言的逻辑是完全看不出来他们的区别,至于硬件,51口和PIC的功能也一样,不过51的是NPNOTP输出,PIC的是MOS推挽输出。然后PIC需要定义该口的输入和输出寄存器,其他的就没多大差别了。输出时后51PIC一样,但输入时51可以直接输出高电平,但PIC需要外部上拉电阻拉高。