请问这两种条件判断有什么不同?

[复制链接]
4817|21
 楼主| xlsbz 发表于 2009-11-6 14:04 | 显示全部楼层 |阅读模式
pi, gp, IO, GPIO, os
本帖最后由 xlsbz 于 2009-11-6 16:32 编辑

//以下所有环境都是C语言环境


sbit GPIO0_Pin_0 = P0^0;


一种是 if (P0^0) {
               dosomething();
          }


另一种是

         if (GPIO0_Pin_0) {
               dosomething();
          }

----------------------------
请问(1)这两种判断有什么不同么?第一种读的是引脚?第二种读的是锁存器?
  (2)只要是 “写”也就是 “输出”,就不用注意引脚与锁存器的不同了么?
(3)我知道,当“读”的时候,要先置1,后读取。
有人建议当用C语言编程时候,建议不要直接对端口判断,要先将其值赋值到片内位变量上,再对位变量进行判断。“将其值赋值到片内位变量上”指的是上面例子中的sbit GPIO0_Pin_0 = P0^0;么?


==============
多谢各位回复!!
nino_1 发表于 2009-11-6 15:28 | 显示全部楼层
(1)一样
(2)(3)关键是配置好引脚的功能,是输入还是输出,或是外围功能
不存在端口和锁存器的状态不同,因为不管是输出或是输入,编程都是对寄存器的控制,输入只是在一定条件下有可能外围的状态没有进入到单片机内部而导致你读到的值是错误的
bhsdlmj 发表于 2009-11-6 15:54 | 显示全部楼层
我是打酱油的:victory:
 楼主| xlsbz 发表于 2009-11-6 16:25 | 显示全部楼层
(1)一样
(2)(3)关键是配置好引脚的功能,是输入还是输出,或是外围功能
不存在端口和锁存器的状态不同,因为不管是输出或是输入,编程都是对寄存器的控制,输入只是在一定条件下有可能外围的状态没有进入到单片机内 ...
nino_1 发表于 2009-11-6 15:28

(1)是一样的么???不会吧!!!!我觉得第一种读的是引脚,第二种读的是锁存器!
 楼主| xlsbz 发表于 2009-11-6 16:33 | 显示全部楼层
有没有人具体解释一下啊:(
BitFu 发表于 2009-11-6 17:06 | 显示全部楼层
BitFu 发表于 2009-11-6 17:08 | 显示全部楼层
sbit就是个特殊的定义符号,不是标准C的内容
 楼主| xlsbz 发表于 2009-11-6 17:14 | 显示全部楼层
有人建议当用C语言编程时候,建议不要直接对端口判断,要先将其值赋值到片内位变量上,再对位变量进行判断!

难道书上说的是错误的么???
 楼主| xlsbz 发表于 2009-11-6 17:18 | 显示全部楼层
这个问题 搞了一天 看样子有些不值得啊 !!!

还是迷糊中...............
xwj 发表于 2009-11-6 17:26 | 显示全部楼层
不一样,完全是两码事!
踢球老越位 发表于 2009-11-6 19:38 | 显示全部楼层
不一样,完全是两码事!
xwj 发表于 2009-11-6 17:26

虽然不用51了,但是想知道为什么不一样呵
xwj 发表于 2009-11-6 20:04 | 显示全部楼层
前者是读一个端口的8个引脚(8位),然后与0 异或(不变);
后者是读端口的一个引脚。

前者会编译成:
MOV A,80H    ;P0 是8位的寄存器
JNZ  A,NEXT
LCALL dosomething
NEXT:

后者会编译成
JNB  80H,NEXT  ;这里判断的是P0的最低位P0.0
LCALL dosomething
NEXT:

前者当P0的任意位为1时都会执行dosomething();
后者只有P0的最低位P0.0为1时才会执行dosomething();
xwj 发表于 2009-11-6 20:05 | 显示全部楼层
要明白sbit 是Keil中编译器的一个关键字,是个特定语法命令,
它可不等于宏定义哦~
328500920 发表于 2009-11-6 20:10 | 显示全部楼层
学习咯
l275961900 发表于 2009-11-7 09:21 | 显示全部楼层
一样!
在Keil中 P0^0就是P0的最低位P0.0
mrbbsp 发表于 2009-11-7 11:55 | 显示全部楼层
写入keil看了下汇编,狂汗
^ 是操作符 异或
if(P0^0)  为 P0 XRL 0
xwj 发表于 2009-11-7 12:04 | 显示全部楼层
是的,P0 XRL 0还是等于P0,C下的话很可能会被优化掉

所以if(P0^0)  判断的死整个8位的 P0 ,而不是P0.0
voidx 发表于 2009-11-7 12:12 | 显示全部楼层
本帖最后由 voidx 于 2009-11-7 12:16 编辑


显然不一样。


zhiyonghe 发表于 2009-11-7 13:37 | 显示全部楼层
学习了!!
 楼主| xlsbz 发表于 2009-11-7 18:04 | 显示全部楼层
有人建议当用C语言编程时候,建议不要直接对端口判断,要先将其值赋值到片内位变量上,再对位变量进行判断。“将其值赋值到片内位变量上”指的是上面例子中的sbit GPIO0_Pin_0 = P0^0;么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部