分享

P1_0与P1^0有什么不同

 ycsdf 2013-05-27
#define的作用是定义一个宏,宏是在编译的时候展开的,而不是在实际程序运行时。在实际编译时,会将源代码中出现的宏(即#define后面的第一个参数)用#define后面的参数部分去代替。因此实际上楼上的是说反了,宏展开时是用后面的代替前面的部分。宏的定义参数是以空格分割,此外还有带参数的宏,字符串连接宏等,详细的可以去找C语言中关于宏的相关说明。

例如,我们有宏SCL的定义: #define SCL P1_0

如果我们的程序中有写SCL=1; 那么在编译器进行编译时,就会将该宏展开,变成P1_0=1;  即用后面的直接替代前面的。如果我们在定义宏时,习惯性的加了个分号,那可能就出错了,例如#define SCL P1_0; 那么上面的SCL=1;展开后就变成了P1_0;=1; 很明显,这样就错了。宏只是简单的字符串替换而已,所以通常宏是不用分号结束的。

关于sbit,它是keil中的关键字,而非标准的C关键字。它的用法之一就是sbit X="A"^n. 其中A是一个可位寻址的变量,而n表示该变量的第几位,而X就是一个位变量,它就是A中的第n位。这里的符号^已经不再是标准C语言中的异或操作符了,这里有它自己独特的意思,只能是这样的写法。

而楼上所说,P1^0在标准C里面非法,是不对的。^在标准的C里面是按位异或操作,跟常用的|,&等用法一样。所以我们在程序中不能直接使用P1^0来当作P1口的第0位来用,因为这样编译器会编译成P1口和0做异或操作。我们应该使用sbit来定义,例如sbit P1_0=P1^0;或者sbit SCL="P1"^0; 这样我的程序就可以使用P1_0或者SCL了。而define,则可以定义一些其它让你更容易记忆,并且更容易移植代码名字,就像#define SCL P1_0,当而P1_0必须是事先已经定义过的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多