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

2020-02-02 09:22发布

前几天一学弟问我,怎么点亮一个LED灯
答曰:P1^0=0;
又问:P1^0为什么代表第0引脚?
答曰:@@#¥%…………&,最后勉强的回答:(1)'^'是异或的符号,但是在这里,它是表示位偏移的意思,P1^0就是P10的意思
哎,自己的基础不好,不知道误导学弟没?当初学习51的时候没有深究。各位有没有更好的解释?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lcofjp
1楼-- · 2020-02-03 08:25
jiaohaitao 发表于 2012-11-15 17:26
呵呵,会报错的,我发帖的时候大意了,还有个基础的问题。在主函数main()前面不能使用 类似P0=0x00;之 ...

语句要写在函数里面才行。
变量的声明、初始化(和声明一起的赋值叫初始化,不和声明在一起的赋值是赋值语句)可以放在函数外面
zgxcom123
2楼-- · 2020-02-03 13:54
本帖最后由 zgxcom123 于 2012-11-15 18:24 编辑

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

不过就像高数中的dx/dy一样,只是一种约定俗成的记号,用着舒服,也能被大家认可,没有那么多为什么
jiaohaitao
3楼-- · 2020-02-03 14:39
本帖最后由 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
上面是根据各位大侠的回复和自己的理解写的,对错?我也不敢确定,仅供参考。如果您有更好的见解,请在下面写出来,可以帮助更多的疑惑者

ztrx
4楼-- · 2020-02-03 18:56
声明、定义、初始化和赋值
这四个理解就明白了
jade1988
5楼-- · 2020-02-03 21:23
 精彩回答 2  元偷偷看……
ShawnLinson
6楼-- · 2020-02-04 03:06
LS亮了~~~~~~

一周热门 更多>