电子产业一站式赋能平台

PCB联盟网

搜索
查看: 4912|回复: 6
收起左侧

谁能告诉我P0^1是什么意思,为什么?

[复制链接]

591

主题

1772

帖子

5770

积分

四级会员

Rank: 4

积分
5770
发表于 2023-1-29 11:00:39 | 显示全部楼层 |阅读模式
回复

使用道具 举报

0

主题

829

帖子

622

积分

二级会员

Rank: 2

积分
622
发表于 2023-1-29 11:01:33 | 显示全部楼层
P0的第二个引脚
回复 支持 反对

使用道具 举报

0

主题

875

帖子

675

积分

二级会员

Rank: 2

积分
675
发表于 2023-1-29 11:01:53 | 显示全部楼层
一天问哦 [host]:P0定义的是地址0x80 ,一个地址对应一个字节的物理空间内存对吧,那么p0^1结果为0x81,岂不是又是一个新的地址,我混乱了,,
回复 支持 反对

使用道具 举报

2

主题

849

帖子

722

积分

二级会员

Rank: 2

积分
722
发表于 2023-1-29 11:02:23 | 显示全部楼层
sbit定义的是SFR(特殊功能寄存器)的bit,sbit的用法有三种:
第一种方法:sbit 位变量名=地址值
第二种方法:sbit 位变量名=SFR名称^变量位地址值
第三种方法:sbit 位变量名=SFR地址值^变量位地址值

然后再看reg52.h
#ifndef __REG52_H__
#define __REG52_H__
/*  BYTE Registers  */
sfr P0    = 0x80;     寄存器P0的地址定义为 0x80地址,
sfr P1    = 0x90;
sfr P2    = 0xA0;

使用的时候用 sbit SH_CP=P0^1; 将0x81 定义为SH_CP  ,也就是将这个地址赋值给SH_CP
回复 支持 反对

使用道具 举报

35

主题

892

帖子

1091

积分

三级会员

Rank: 3Rank: 3

积分
1091
发表于 2023-1-29 11:03:09 | 显示全部楼层
Tell me why
回复 支持 反对

使用道具 举报

10

主题

904

帖子

812

积分

二级会员

Rank: 2

积分
812
发表于 2023-1-29 11:04:00 | 显示全部楼层
就是p0.1的意思
回复 支持 反对

使用道具 举报

0

主题

875

帖子

675

积分

二级会员

Rank: 2

积分
675
发表于 2023-1-29 11:04:49 | 显示全部楼层
正常呢,c语言可以定义的最低单位是1个字节,一个字节就是8位,你想直接操作1个字节的八位只能通过位运算,>> << ! & 等位运算符号去操作这8位的每一位,而单片机程序中你可以看到很多位操作符号。但是单片机厂家为了方便我们操作1个字节中的这8位,封装了sbit这样类似一位的单位(只是外部封装好了,看着像一位,实际上c语言无法定义位单位的变量)。

厂家提供的 51.h头文件上可以看出就是P0 一个地址 0x80。
P0^1 就是0x81, P0^7就是 0x87,你可以看出地址的一位一位增加的(如果你定义一个char类型,地址相当于八位八位增加的)
假如P0这个一个字节中初始化都为0,你想让第7位和第1位变成 1的话(10000010),用c语言赋值 十进制你就得赋值130,麻烦不?
现在厂家为了方便我们操作 你只要 获取这8位对应的位地址 led1 = P0^1 , led7= P0^7,并直接赋值led1=1,led7=1, 就可以而不用换算十进制130进行字节整体赋值了,直接使用厂商提供的位操作不是更方便么?
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表