標(biāo)題: 求教單片機(jī)P1=P1|0x01的意思 [打印本頁]

作者: kscheang    時(shí)間: 2021-2-19 22:31
標(biāo)題: 求教單片機(jī)P1=P1|0x01的意思
求教一下各位
P1=P1|0x01 是什么意思?
我在百度只查到說是
(將P1與0x01按位或之后,再賦給P1)
可否請(qǐng)教詳細(xì)解釋

另外
P1=P1|0x01
這個(gè) | 怎樣輸入
(我現(xiàn)在只用 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    時(shí)間: 2021-2-19 23:18
|:或操作,1|1=1、1|0=1、0|0=0
那個(gè)符號(hào)是shift+\,
‘\’在回車上方
0x01是32位16進(jìn)制,但是內(nèi)部仍然是2進(jìn)制,
整體展開就是
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
這兩個(gè)按位|,結(jié)果就是
0000 0000 0000 0000 0000 0000 0000 0011
所以P1=P1|0x01
就是把0000 0000 0000 0000 0000 0000 0000 0011
賦值給P1,
最后for循環(huán)結(jié)束,
P1 = 0x01
將P1內(nèi)的值重置
作者: adject    時(shí)間: 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+ \ 輸入
作者: 楊雪飛    時(shí)間: 2021-2-19 23:31
aba_aba 發(fā)表于 2021-2-19 23:18
|:或操作,1|1=1、1|0=1、0|0=0
那個(gè)符號(hào)是shift+\,
‘\’在回車上方

0x01是8位 16進(jìn)制,

   0  0  0  0    0  0  0  1           二進(jìn)制的1
   8  4  2  1    8  4  2  1

0x           0                1          十六進(jìn)制的1


作者: taotie    時(shí)間: 2021-2-19 23:55
咳咳咳~~~
有現(xiàn)成的程序員計(jì)算器不會(huì)用嗎
作者: 楊雪飛    時(shí)間: 2021-2-19 23:57
將P1與0x01按位或之后,再賦給

P1.7    P1.6   P1.5   P1.4   P1.3   P1.2  P1.1    P1.0            單片機(jī)的的P1口的八個(gè)管腳,
   |         |        |        |         |        |        |        |   

   0        0        0       0         0        0       0        1            管腳低電平為0,高電平為1,

  8        4         2       1         8        4       2        1            轉(zhuǎn)換成十六進(jìn)制,管腳對(duì)應(yīng)下邊的8421,所有
                                                                                    的高電平相加就是16進(jìn)制。比如最后一腳為高
                                                                                    電平 16進(jìn)制就是01,0x是16進(jìn)制數(shù)開頭。

那么與運(yùn)算就是兩個(gè)數(shù)運(yùn)算,有1就等1,三種情況1與1得1,1與0,還是得1,0與0,那就得0,所以叫有1得1,全0得0。

P1=0X01那也就是最上邊的情況,P1.0是高電平,其余的都是低電平。

接下來看你的程序


P1 = 0x01;      這個(gè)就好理解了吧,P1.7---P1.1都是低電平0,只有P1.0是高電平。
    while(1)   整個(gè)紅字這一段是把高電平這個(gè)引腳的電平向左移8次。
    {
        for(i=0;i<8;i++)      就是這句,跟while和下邊P1<<=1;結(jié)合,運(yùn)行8次
        {
            delay(30000);
            P1<<=1;            
            P1=P1|0x01;      然后再與上0X01;那就是每移一次最右邊的腳都是高電平,這樣一來,那就是一個(gè)接一個(gè)的高電平向左移到最高位P1.7了。
         }

        P1 = 0x01;     這最后一句是當(dāng)P1口全都是高電平了之后,再讓P1口只有P1.0為高電平。
    }
}

這個(gè)這一段的意思就是如果P1口接的發(fā)光二極管(LED)的話,那就是依次從P1.0開始向最高位熄滅,然后再回到P1.0口熄滅狀態(tài),或者相反的狀態(tài)。

|這個(gè)符號(hào)在回車的上邊,在51C語言里讀作“或”,是一個(gè)運(yùn)算符,上邊講過他的運(yùn)算法則了。
即:  1|1=1  1|0=1 0|0=0
作者: kscheang    時(shí)間: 2021-2-20 01:11
謝謝各位
明白了, 是 新的賦值 和 舊的值 作 或 的相加 的意思

我的鍵盤 是兩個(gè)小的直豎, 不知道原來是 | shift+ \ 輸入
作者: rayin    時(shí)間: 2021-2-20 08:16
P1=P1|0x01就是把P0的第1位(P1^0)置高電平
作者: bsljling    時(shí)間: 2021-2-20 08:30
同為小白的初學(xué)者,謝謝各位的解答!
作者: cn_zhx    時(shí)間: 2021-2-21 15:30
采用或的方式好處在于不會(huì)影響其他位的值,尤其是在多處需要對(duì)同一寄存器賦值時(shí)特別有用。
作者: billaj    時(shí)間: 2021-2-21 16:33
我不是小白,也謝謝各大神的解答,每種答案都是一種思路,能分享真的是難能可貴,感謝
作者: dddggg412    時(shí)間: 2021-2-21 19:46
樓主要看看C語言位運(yùn)算相關(guān),位運(yùn)算是修改一個(gè)數(shù)的某些位而保留其他位。
作者: zuiqf1978    時(shí)間: 2021-2-21 20:56
| 這個(gè)符號(hào)特別,在臺(tái)式鍵盤右手shift上邊 小臺(tái)機(jī)把這符號(hào)截成兩段
作者: TTQ001    時(shí)間: 2021-2-22 06:06
這是邏輯位或運(yùn)算,如果所有在或操作中的位均為0,則結(jié)果為0,如果或操作的位中至少一位為1,則結(jié)果為1。使用Shift +“ \”獲得| 標(biāo)志。
作者: 紅葉夜夜笙歌    時(shí)間: 2021-3-2 15:57
P1|=(0x01<<N), 將P1第N位置1,其余位不變。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1