搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入98汤圆

发表于 2012-11-15 17:03:58 | 显示全部楼层
人为规定

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

在追溯习惯 还要看历史

出0入0汤圆

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

出0入54汤圆

发表于 2012-11-15 17:22:19 | 显示全部楼层
P1^0=0;
51里这样写不会报错吗?
我记得是要用sbit P1_1 = P1^0;
然后用P1_1 = 0

出0入0汤圆

 楼主| 发表于 2012-11-15 17:26:33 | 显示全部楼层
lusson 发表于 2012-11-15 17:22
P1^0=0;
51里这样写不会报错吗?
我记得是要用sbit P1_1 = P1^0;

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

出0入54汤圆

发表于 2012-11-15 17:33:54 | 显示全部楼层
这个。。。真不知道该怎么解释
楼下解释下吧。

出0入0汤圆

发表于 2012-11-15 18:09:30 | 显示全部楼层
这是编译器的规定。   不同编译器有不同的表示方法。   不必深究。     认真你就输了=、=  

出0入0汤圆

发表于 2012-11-15 18:13:56 | 显示全部楼层
jiaohaitao 发表于 2012-11-15 17:26
呵呵,会报错的,我发帖的时候大意了,还有个基础的问题。在主函数main()前面不能使用 类似P0=0x00;之 ...

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

出0入0汤圆

发表于 2012-11-15 18:23:10 来自手机 | 显示全部楼层
本帖最后由 zgxcom123 于 2012-11-15 18:24 编辑

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

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

出0入0汤圆

 楼主| 发表于 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
上面是根据各位大侠的回复和自己的理解写的,对错?我也不敢确定,仅供参考。如果您有更好的见解,请在下面写出来,可以帮助更多的疑惑者

出0入4汤圆

发表于 2012-11-15 20:02:21 | 显示全部楼层
声明、定义、初始化和赋值
这四个理解就明白了

出0入0汤圆

发表于 2012-11-15 20:05:40 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-15 20:35:06 | 显示全部楼层
LS亮了~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表