打印

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

[复制链接]
3425|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)是一样的么???不会吧!!!!我觉得第一种读的是引脚,第二种读的是锁存器!

使用特权

评论回复
5
xlsbz|  楼主 | 2009-11-6 16:33 | 只看该作者
有没有人具体解释一下啊:(

使用特权

评论回复
6
BitFu| | 2009-11-6 17:06 | 只看该作者
一样

使用特权

评论回复
7
BitFu| | 2009-11-6 17:08 | 只看该作者
sbit就是个特殊的定义符号,不是标准C的内容

使用特权

评论回复
8
xlsbz|  楼主 | 2009-11-6 17:14 | 只看该作者
有人建议当用C语言编程时候,建议不要直接对端口判断,要先将其值赋值到片内位变量上,再对位变量进行判断!

难道书上说的是错误的么???

使用特权

评论回复
9
xlsbz|  楼主 | 2009-11-6 17:18 | 只看该作者
这个问题 搞了一天 看样子有些不值得啊 !!!

还是迷糊中...............

使用特权

评论回复
10
xwj| | 2009-11-6 17:26 | 只看该作者
不一样,完全是两码事!

使用特权

评论回复
11
踢球老越位| | 2009-11-6 19:38 | 只看该作者
不一样,完全是两码事!
xwj 发表于 2009-11-6 17:26

虽然不用51了,但是想知道为什么不一样呵

使用特权

评论回复
12
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();

使用特权

评论回复
13
xwj| | 2009-11-6 20:05 | 只看该作者
要明白sbit 是Keil中编译器的一个关键字,是个特定语法命令,
它可不等于宏定义哦~

使用特权

评论回复
14
328500920| | 2009-11-6 20:10 | 只看该作者
学习咯

使用特权

评论回复
15
l275961900| | 2009-11-7 09:21 | 只看该作者
一样!
在Keil中 P0^0就是P0的最低位P0.0

使用特权

评论回复
16
mrbbsp| | 2009-11-7 11:55 | 只看该作者
写入keil看了下汇编,狂汗
^ 是操作符 异或
if(P0^0)  为 P0 XRL 0

使用特权

评论回复
17
xwj| | 2009-11-7 12:04 | 只看该作者
是的,P0 XRL 0还是等于P0,C下的话很可能会被优化掉

所以if(P0^0)  判断的死整个8位的 P0 ,而不是P0.0

使用特权

评论回复
18
voidx| | 2009-11-7 12:12 | 只看该作者
本帖最后由 voidx 于 2009-11-7 12:16 编辑


显然不一样。


使用特权

评论回复
19
zhiyonghe| | 2009-11-7 13:37 | 只看该作者
学习了!!

使用特权

评论回复
20
xlsbz|  楼主 | 2009-11-7 18:04 | 只看该作者
有人建议当用C语言编程时候,建议不要直接对端口判断,要先将其值赋值到片内位变量上,再对位变量进行判断。“将其值赋值到片内位变量上”指的是上面例子中的sbit GPIO0_Pin_0 = P0^0;么?

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝