标题: 求教单片机P1=P1|0x01的意思 [打印本页]

作者: kscheang    时间: 2021-2-19 22:31
标题: 求教单片机P1=P1|0x01的意思
求教一下各位
P1=P1|0x01 是什么意思?
我在百度只查到说是
(将P1与0x01按位或之后,再赋给P1)
可否请教详细解释

另外
P1=P1|0x01
这个 | 怎样输入
(我现在只用 Ctrl-C Ctrl-V 贴上)
我的程序如下:

#include<reg52.h>

unsigned int t;
unsigned char i;

void delay(int t)
{
    while(t--);
}

void main ()
{
    delay(30000);
    P1 = 0x01;
    while(1)
    {
        for(i=0;i<8;i++)
        {
            delay(30000);
            P1<<=1;
            P1=P1|0x01;
         }
        P1 = 0x01;
    }
}

谢谢

作者: aba_aba    时间: 2021-2-19 23:18
|:或操作,1|1=1、1|0=1、0|0=0
那个符号是shift+\,
‘\’在回车上方
0x01是32位16进制,但是内部仍然是2进制,
整体展开就是
0000 0000 0000 0000 0000 0000 0000 0001
所以P1<<=1就是
0000 0000 0000 0000 0000 0000 0000 0010
P1|0x01就是
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0001
这两个按位|,结果就是
0000 0000 0000 0000 0000 0000 0000 0011
所以P1=P1|0x01
就是把0000 0000 0000 0000 0000 0000 0000 0011
赋值给P1,
最后for循环结束,
P1 = 0x01
将P1内的值重置
作者: adject    时间: 2021-2-19 23:22
P1=P1|0x01 //P1 第0位置1 其他位不变

void main ()
{
    delay(30000);
    P1 = 0x01;  //P1第0位置1 其他置0
    while(1)
    {
        for(i=0;i<8;i++)
        {
            delay(30000);
            P1<<=1;    //P1等于P1左右一位
            P1=P1|0x01; //P1 第0位置1 其他位不变
         }
        P1 = 0x01;
    }
}

| shift+ \ 输入
作者: 杨雪飞    时间: 2021-2-19 23:31
aba_aba 发表于 2021-2-19 23:18
|:或操作,1|1=1、1|0=1、0|0=0
那个符号是shift+\,
‘\’在回车上方

0x01是8位 16进制,

   0  0  0  0    0  0  0  1           二进制的1
   8  4  2  1    8  4  2  1

0x           0                1          十六进制的1


作者: taotie    时间: 2021-2-19 23:55
咳咳咳~~~
有现成的程序员计算器不会用吗
作者: 杨雪飞    时间: 2021-2-19 23:57
将P1与0x01按位或之后,再赋给

P1.7    P1.6   P1.5   P1.4   P1.3   P1.2  P1.1    P1.0            单片机的的P1口的八个管脚,
   |         |        |        |         |        |        |        |   

   0        0        0       0         0        0       0        1            管脚低电平为0,高电平为1,

  8        4         2       1         8        4       2        1            转换成十六进制,管脚对应下边的8421,所有
                                                                                    的高电平相加就是16进制。比如最后一脚为高
                                                                                    电平 16进制就是01,0x是16进制数开头。

那么与运算就是两个数运算,有1就等1,三种情况1与1得1,1与0,还是得1,0与0,那就得0,所以叫有1得1,全0得0。

P1=0X01那也就是最上边的情况,P1.0是高电平,其余的都是低电平。

接下来看你的程序


P1 = 0x01;      这个就好理解了吧,P1.7---P1.1都是低电平0,只有P1.0是高电平。
    while(1)   整个红字这一段是把高电平这个引脚的电平向左移8次。
    {
        for(i=0;i<8;i++)      就是这句,跟while和下边P1<<=1;结合,运行8次
        {
            delay(30000);
            P1<<=1;            
            P1=P1|0x01;      然后再与上0X01;那就是每移一次最右边的脚都是高电平,这样一来,那就是一个接一个的高电平向左移到最高位P1.7了。
         }

        P1 = 0x01;     这最后一句是当P1口全都是高电平了之后,再让P1口只有P1.0为高电平。
    }
}

这个这一段的意思就是如果P1口接的发光二极管(LED)的话,那就是依次从P1.0开始向最高位熄灭,然后再回到P1.0口熄灭状态,或者相反的状态。

|这个符号在回车的上边,在51C语言里读作“或”,是一个运算符,上边讲过他的运算法则了。
即:  1|1=1  1|0=1 0|0=0
作者: kscheang    时间: 2021-2-20 01:11
谢谢各位
明白了, 是 新的赋值 和 旧的值 作 或 的相加 的意思

我的键盘 是两个小的直竖, 不知道原来是 | shift+ \ 输入
作者: rayin    时间: 2021-2-20 08:16
P1=P1|0x01就是把P0的第1位(P1^0)置高电平
作者: bsljling    时间: 2021-2-20 08:30
同为小白的初学者,谢谢各位的解答!
作者: cn_zhx    时间: 2021-2-21 15:30
采用或的方式好处在于不会影响其他位的值,尤其是在多处需要对同一寄存器赋值时特别有用。
作者: billaj    时间: 2021-2-21 16:33
我不是小白,也谢谢各大神的解答,每种答案都是一种思路,能分享真的是难能可贵,感谢
作者: dddggg412    时间: 2021-2-21 19:46
楼主要看看C语言位运算相关,位运算是修改一个数的某些位而保留其他位。
作者: zuiqf1978    时间: 2021-2-21 20:56
| 这个符号特别,在台式键盘右手shift上边 小台机把这符号截成两段
作者: TTQ001    时间: 2021-2-22 06:06
这是逻辑位或运算,如果所有在或操作中的位均为0,则结果为0,如果或操作的位中至少一位为1,则结果为1。使用Shift +“ \”获得| 标志。
作者: 红叶夜夜笙歌    时间: 2021-3-2 15:57
P1|=(0x01<<N), 将P1第N位置1,其余位不变。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1