diaoxinfeixiang 发表于 2012-8-25 22:01:12

sbit引出的困惑


给位大侠,我估计我连个菜鸟都算不上,请问这两幅图中的程序运行结果为什么不同啊?
另外sbit的作用和typedefine 有什么区别,8051单片机读取引脚的值可以像a=P0^0的方法来获得吗?

yjk282 发表于 2012-8-25 22:11:04

好像51单片机必须要用sbit定义某一个IO口后才能操作该一个口,不能直接用,要么用整个8个口

Sullivan 发表于 2012-8-25 22:13:47

楼上正解

diaoxinfeixiang 发表于 2012-8-25 22:16:30

yjk282 发表于 2012-8-25 22:11 static/image/common/back.gif
好像51单片机必须要用sbit定义某一个IO口后才能操作该一个口,不能直接用,要么用整个8个口 ...

谢谢您的回答,应该是这个原因

diaoxinfeixiang 发表于 2012-8-25 22:17:27

yjk282 发表于 2012-8-25 22:11 static/image/common/back.gif
好像51单片机必须要用sbit定义某一个IO口后才能操作该一个口,不能直接用,要么用整个8个口 ...

我想再问一个问题,这方面的问题应该看那些书啊

yjk282 发表于 2012-8-25 22:20:03

基本上是本教材都会讲到吧。。。

y574924080 发表于 2012-8-25 22:21:42

我想问一下,第二个编译不会报错吗?

diaoxinfeixiang 发表于 2012-8-25 22:24:02

y574924080 发表于 2012-8-25 22:21 static/image/common/back.gif
我想问一下,第二个编译不会报错吗?

不报错啊!

y574924080 发表于 2012-8-25 22:27:39

diaoxinfeixiang 发表于 2012-8-25 22:24 static/image/common/back.gif
不报错啊!

我试了一下,直接报错

可以发你的C文件来看看吗?

想不通啊

stevenli 发表于 2012-8-25 22:38:44

文件不报错,,有这么神奇

gracialee 发表于 2012-8-25 23:00:21

gi 不报错才怪呢,while语句直接挂。。。。。。

diaoxinfeixiang 发表于 2012-8-25 23:37:58

y574924080 发表于 2012-8-25 22:27:39 static/image/common/back.gif

我试了一下,直接报错

可以发你的C文件来看看吗?

想不通啊

不好意思啊,明天给你,回宿舍了

diaoxinfeixiang 发表于 2012-8-25 23:39:08

stevenli 发表于 2012-8-25 22:38:44 static/image/common/back.gif
文件不报错,,有这么神奇

明天给你源文件看一下,我这没报错反正

laujc 发表于 2012-8-25 23:52:12

不明白右边代码
P0^7后面为什么加个;"分号"
然后再==号
不应该直接写while(P0^7==1);吗?

y574924080 发表于 2012-8-26 00:14:27

laujc 发表于 2012-8-25 23:52 static/image/common/back.gif
不明白右边代码
P0^7后面为什么加个;"分号"
然后再==号


这个的意思我才猜表示P0与0x07异或,然后判断是否为零~~~

laujc 发表于 2012-8-26 00:22:44

y574924080 发表于 2012-8-26 00:14 static/image/common/back.gif
这个的意思我才猜表示P0与0x07异或,然后判断是否为零~~~

不对,P0^7
是指P0的第7个IO口,是有定义好的.在头文件里.
不是你想当然的异或.
有的头文件里面写成P0.7的.

y574924080 发表于 2012-8-26 01:06:32

本帖最后由 y574924080 于 2012-8-26 01:16 编辑

laujc 发表于 2012-8-26 00:22 static/image/common/back.gif
不对,P0^7
是指P0的第7个IO口,是有定义好的.在头文件里.
不是你想当然的异或.


P0^7 不是只能在sbit定义的时候才可以用的吗?

而且头文件定义的是P0_7(或者是P0.7,这个我不大清楚),而不是P0^7

口说无凭,上一段代码看看,很明显,数据先从P1读到A,然后与0x01异或,然后判断结果是否为零   3: void main()
   4: {
   5:   
   6:   do{
   7:
   8:   }while(P1^1 == 1);
   9:
C:0x000F    E590   MOV      A,P1(0x90)
C:0x0011    6401   XRL      A,#0x01
C:0x0013    70FA   JNZ      main(C:000F)
    10:   while(1);
C:0x0015    80FE   SJMP   C:0015/**************************/

修改了红字

**************

另外楼主的代码多了一个;应该会报错的~~~~~

millwood0 发表于 2012-8-26 02:52:29

P0^7 不是只能在sbit定义的时候才可以用的吗?

why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressable objects".

always read the f!@#%$king manual or you will forever be a retard.

aheadlead 发表于 2012-8-26 06:30:29

millwood0 发表于 2012-8-26 02:52 static/image/common/back.gif
why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressabl ...

又见大师 跪烂

y574924080 发表于 2012-8-26 08:49:57

millwood0 发表于 2012-8-26 02:52 static/image/common/back.gif
why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressabl ...

谢谢大师指出,我去看了用户手册,我更正我的说法:

       在声明中,用sbit 声明新的变量可以访问 可位寻址目标 的位,即(可位寻址目标)^常数 表示指定位的位置

{:lol:}

diaoxinfeixiang 发表于 2012-8-26 08:52:44

millwood0 发表于 2012-8-26 02:52 static/image/common/back.gif
why don't you read the f@#$king compiler manual?

specifically, the section titled "bit-addressabl ...

thank you so much

linucos 发表于 2012-8-26 10:44:13

帮你顶顶!

seazhui 发表于 2012-8-26 10:45:16

yjk282 发表于 2012-8-25 22:20 static/image/common/back.gif
基本上是本教材都会讲到吧。。。

没有在教材上看到过。。。。。

laujc 发表于 2012-8-26 11:56:28

本帖最后由 laujc 于 2012-8-26 12:49 编辑

y574924080 发表于 2012-8-26 01:06 static/image/common/back.gif
P0^7 不是只能在sbit定义的时候才可以用的吗?

而且头文件定义的是P0_7(或者是P0.7,这个我不大清楚), ...

我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。

程序中如果有P1^1 ,编译器应该是理解成异或的。
但可以预先定义,如sbit PORT = P3^1;这样程序中直接使用PORT,编译器会识别出是判断IO电平的。
如果程序中使用P1^1 编译器仍然把它当作异或运算。

看来理解是对的,如下图,左右是有声明sbit PORT = P3^1;
右边没有声明.
注意:== 的优先级大于^的优先级.程序先做的 3== 1 不为真,所以汇编时,直接当判断P1 ^ 0了.

y574924080 发表于 2012-8-26 12:34:40

laujc 发表于 2012-8-26 11:56 static/image/common/back.gif
我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。



嗯嗯,看了cx51手册,用在声明,^应该表示指定位

在程序中,只可能是异或

diaoxinfeixiang 发表于 2012-8-26 13:34:42

laujc 发表于 2012-8-26 11:56 static/image/common/back.gif
我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。



恩,谢谢,学习了

y574924080 发表于 2012-8-26 16:18:39

laujc 发表于 2012-8-26 11:56 static/image/common/back.gif
我重新测试了一下代码,可能原来我理解的也有问题。
下午上代码。



我还真的忽略了优先级的问题

现在才看懂你表达的意思

学习了~~

laujc 发表于 2012-8-27 17:02:52

y574924080 发表于 2012-8-26 16:18 static/image/common/back.gif
我还真的忽略了优先级的问题

现在才看懂你表达的意思


呵呵,共同进步!

raxb 发表于 2012-8-27 17:26:57

怎么没看到main()函数,While括号里面的";"是什么意思
页: [1]
查看完整版本: sbit引出的困惑