jiaohaitao 发表于 2012-11-15 17:01:17

不懂就要问:为什么P1^0就代表P1口的0引脚?

前几天一学弟问我,怎么点亮一个LED灯
答曰:P1^0=0;
又问:P1^0为什么代表第0引脚?
答曰:@@#¥%…………&,最后勉强的回答:(1)'^'是异或的符号,但是在这里,它是表示位偏移的意思,P1^0就是P10的意思
哎,自己的基础不好,不知道误导学弟没?当初学习51的时候没有深究。各位有没有更好的解释?{:lol:}

rclong 发表于 2012-11-15 17:03:58

人为规定

头文件里这么写
编译器这么译

在追溯习惯 还要看历史

jiaohaitao 发表于 2012-11-15 17:20:12

嗯,感觉也是,用"异或"解释不通,应该是编译器默认吧。不过这又出来个问题,编译器怎么分清真正的异或运算和这个默认的位偏移呢?
我认为,一般涉及到这个某端口位的操作都会用到'sbit'这个C51扩展的变量类型。如:sbit P1_0=P1^0;这样就不会把这个'^'当成正常的异或运算
不知道对不对?

lusson 发表于 2012-11-15 17:22:19

P1^0=0;
51里这样写不会报错吗?
我记得是要用sbit P1_1 = P1^0;
然后用P1_1 = 0

jiaohaitao 发表于 2012-11-15 17:26:33

lusson 发表于 2012-11-15 17:22 static/image/common/back.gif
P1^0=0;
51里这样写不会报错吗?
我记得是要用sbit P1_1 = P1^0;


呵呵,会报错的,我发帖的时候大意了,还有个基础的问题。在主函数main()前面不能使用 类似P0=0x00;之类的给某端口初始化,但在在主函数main之中就可以了,不懂?
这个也是基础问题,基础不好啊{:lol:}

lusson 发表于 2012-11-15 17:33:54

这个。。。真不知道该怎么解释
楼下解释下吧。

sco518 发表于 2012-11-15 18:09:30

这是编译器的规定。   不同编译器有不同的表示方法。   不必深究。   认真你就输了=、=

lcofjp 发表于 2012-11-15 18:13:56

jiaohaitao 发表于 2012-11-15 17:26 static/image/common/back.gif
呵呵,会报错的,我发帖的时候大意了,还有个基础的问题。在主函数main()前面不能使用 类似P0=0x00;之 ...

语句要写在函数里面才行。
变量的声明、初始化(和声明一起的赋值叫初始化,不和声明在一起的赋值是赋值语句)可以放在函数外面

zgxcom123 发表于 2012-11-15 18:23:10

本帖最后由 zgxcom123 于 2012-11-15 18:24 编辑

这个只是官方头文件给出的一种命名方法,实则只是对某个地址的寄存器进行赋值罢了,看着不顺眼,可以自己写头文件,自己命名。

不过就像高数中的dx/dy一样,只是一种约定俗成的记号,用着舒服,也能被大家认可,没有那么多为什么

jiaohaitao 发表于 2012-11-15 19:35:22

本帖最后由 jiaohaitao 于 2012-11-15 19:43 编辑

嗯,非常感谢以上大佬的精彩讲解,小辈收获不少。确实,如果一些基本的东西没有解决的话,到后面你会非常的痛苦。就像盖大楼,地基没打好,,,,,呵呵
下面我结合下各位的讲解和我的理解写出下面一些东东,给那些像我一样的疑惑者一些引导。
(1) lcofjp 和renpeng009说的对,在main之前操作寄存器是不合法的,我的理解是main函数之前是有一些堆栈什么指针类的硬件配置,为我们的用户函数main配置环境,不可以随便更改处理器中一些内部的寄存器,而renpeng009所说的赋值语句不能放在函数外面是欠妥的。你可以试验下,在main之前定义一个变量,然后再另写个语句赋值是可以的,如:itn i;i=0;。编译器并没有报错。所以说:在main函数之前我们是不能对单片机内部的一重要些寄存器随便操作的,而可以对一些无关紧要的内存区操作,不知这样说对不对?
(2)关于51单片机的位操作,确实你百度下‘sbit’这个c51扩展类型,你就会明白了。下面是百科上一句话:
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbit xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
也就是说:sbit是对可以位寻址的一些寄存器的操作。这个问题的本身P1^0为什么会代表P1.0这应该是编译器默认吧。我想编译器为了区分和异或的区别,所以,我们在位操作的时候就要用到sbit这个扩展类型了。可以说有位操作就会有sbit。不知这样理解行不行。。。
(3)问题扩展:sbit可不可以定义一些变量,从而使这些变量也具有位操作的能力?答案是肯定的,这里需要 bdata这个关键字
unsigned char bdata Data;
那么这个Data就会被映射到单片机内部20H-2FH,地址不会像其他的变量一样地址随机产生。这个Data就可以位寻址操作了,因为单片机内部20-2f这16个Bytes是可以位寻址的。所以我们只能最多定义16个可以操作的Bytes
上面是根据各位大侠的回复和自己的理解写的,对错?我也不敢确定,仅供参考。如果您有更好的见解,请在下面写出来,可以帮助更多的疑惑者{:lol:}{:lol:}

ztrx 发表于 2012-11-15 20:02:21

声明、定义、初始化和赋值
这四个理解就明白了

jade1988 发表于 2012-11-15 20:05:40

ShawnLinson 发表于 2012-11-15 20:35:06

LS亮了~~~~~~
页: [1]
查看完整版本: 不懂就要问:为什么P1^0就代表P1口的0引脚?