欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: dat = (dat>>1) | (dat1<<7);是什么意思,什么功能? [打印本頁]

作者: csz9981    時間: 2017-1-15 22:13
標題: dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?
在下面程序中,
uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1;//然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }

        RST = 0;
        _nop_();        //以下為DS1302復位的穩定時間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;        
}

問題1:        dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?


問題2:dat1 = DSIO;//從最低位開始接收,數據明明是給了dat1,但是最后return 的數據 卻是  dat ??為什么???


作者: zyldlzh    時間: 2017-1-15 23:33
本帖最后由 zyldlzh 于 2017-1-15 23:34 編輯

只能告訴你,dat=(dat>>1)|(dat1<<7)
dat=(dat按位右移1位)相或同假為假一真即真|(dat1按位左移7位)
貌似是!!!還會補零
作者: 不倒翁.WZT    時間: 2017-1-16 06:28
標題: RE: dat = (dat>>1) | (dat1<<7);是什么意思
zyldlzh 發表于 2017-1-15 23:33
只能告訴你,dat=(dat>>1)|(dat1

假如dat=00001010B,dat1=00000001B,其中B是二進制的意思,dat>>1意思是右移一位,dat=00001010B右移一位=00000101B。dat1<<7意思是左移七位,dat1=00000001B左移七位=10000000B。(dat>>1) | (dat1<<7)意思是括號中的兩個數進行“或”運算。在不能理解的情況下可以把它簡單理解為相加,(dat>>1) | (dat1<<7)=(00000101B) | (10000000B)=(00000101B) + (10000000B)= 10000101B=133。可以用十進制運算來驗證一下,00000101B=5,10000000B=128,00000101B+10000000B=5+128=133,運算結果是相等的。
作者: 余立強    時間: 2017-1-16 08:45
我把這個句子拆分下,dat右移1位,左側空位補0;dat1左移7位,右側空位補0,將兩個結果按位或運算,賦值給dat
作者: 余立強    時間: 2017-1-16 08:49
你的程序最后一句話寫的是return dat;如果想返回dat1,就寫return dat1;
作者: song19881218    時間: 2017-1-16 08:53
       for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }
溫度是單總線的,一個溫度值需要讀8次,顯然dat1只有最低位有效,通過(dat1<<7)將有效位移至最高位,然后在(dat)的最高位。通過8次移位,正好將8次讀到的值賦值到dat。
作者: lzxdy    時間: 2017-1-16 09:03

dat>>1,右移一位,高1位補零,變成0XXXXXXX。
dat1<<7左移七位,低7位補零,變成X0000000,
(dat>>1)|(dat1<<7),逐位或,即相當于取前者后7位,取后者前1位,構成8位。
dat=(dat>>1)|(dat1<<7),新構成的8位給dat‘
最終結果就是:取dat前7位作其后7位,而取dat1后1位代替dat的高1位。

從上可知,dat結果與dat1是有關的。
作者: jin8882008    時間: 2017-1-16 10:42
dat = (dat>>1) | (dat1<<7)  就是dat右移一位, dat1左移7位,當兩個條件任何一個為真時,結果為1.
作者: lzxdy    時間: 2017-1-16 15:22
我上午的回復顯示需要審核,怎么就不見了呢?
作者: 魔武仙君    時間: 2018-7-21 15:40
因為DS1302是從低位開始讀取的,首先把最低位讀取出來,dat = (dat>>1) | (dat1<<7);dat1向左移動7位,放在最高位。而dat是要讀取的數據嘛,不斷向右移動,8次就讀完。不斷的或運算就能把最終的dat讀出,可以認為dat1就是一個中間變量把。
作者: 月落烏啼霜滿天0    時間: 2018-12-4 10:19
dat = dat | (dat1<<n);                //這條語句不成功!!!  為啥?????
               
//dat = (dat>>1) | (dat1<<7);   //這條語句沒問題
作者: sanghz    時間: 2018-12-4 12:24
dat = (dat>>1) | (dat1<<7); 把dat1最后一位放在最高位,原dat高7位接著放,構成一個新的dat
作者: jinsheng7533967    時間: 2018-12-10 03:37
看這個代碼時,你要看看它的電路與你以前有什么不同?以前是8個口傳數據,現在一個口!!!以前傳的是一個字節,現在是一個位!!!其實這就是將8個位合并成一個字節或是一個字節拆分成8個位的常用手段,只能是位才便于一個端口傳輸。至于合并與拆分具體上面朋友有講的很清楚的!
作者: shuisheng60    時間: 2019-2-6 23:42
jinsheng7533967 發表于 2018-12-10 03:37
看這個代碼時,你要看看它的電路與你以前有什么不同?以前是8個口傳數據,現在一個口!!!以前傳的是一個 ...

講的很透徹,學習了
作者: 826618227    時間: 2019-2-22 23:55
  for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }

dat = (dat>>1) | (dat1<<7);這個語句是將dat右移一位高位補零,將dat1左移7位低位補零,然后兩者按位或運算。實現功能是將DSIO數據依此讀取到dat。

比如說要將一個8位數hgfedcba(每一位都是未知的)讀到dat,DSIO在8個循環從低位到高位依此發送a b c d e f g h,由于之前的循環中最后一步SCLK=0已經出現下降沿,指定寄存器中的第一位數據a已發送到DSIO,第一個循環
dat1 = DSIO;                      運行結果dat1=0000000a;

dat = (dat>>1) | (dat1<<7);        運行結果dat=aXXXXXXX;
運行過程:      
先dat>>1; dat由未知8位數XXXXXXXX變為dat=0XXXXXXX;即將最高為清空;
dat1<<7; dat1=0000000a變成dat1=a0000000;將DSIO上讀取的值移動最高位,清空低位。然后進行或運輸dat=0XXXXXXX+ a0000000,dat=aXXXXXXX即將DSIO值讀取到dat最高位。

SCLK = 1;
_nop_();                           運行結果 拉高SCLK準備下一個下降沿
SCLK = 0;                          運行結果 產生下降沿,放置下一個b數據到DSIO
_nop_();

依此類推
第二個循環 dat變為dat=baXXXXXX;
第三個循環 dat變為dat=cbaXXXXX;
第四個循環 dat變為dat=dcbaXXXX;
第五個循環 dat變為dat=edcbaXXX;
第六個循環 dat變為dat=fedcbaXX;
第七個循環 dat變為dat=gfedcbaX;
第八個循環 dat變為dat=hgfedcba;
循環完成后,完成將指定寄存器addr中的數據讀取到dat。

作者: 陳9803    時間: 2019-3-16 22:06
for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }
dat1 = DSIO;//從最低位開始接收
dat1每次循環開始都重新賦值,8次賦值為什么不是一樣的?
作者: wang1002811677    時間: 2019-3-17 15:07
假如dat=00001010B,dat1=00000001B,其中B是二進制的意思,dat>>1意思是右移一位,dat=00001010B右移一位=00000101B。dat1<<7意思是左移七位,dat1=00000001B左移七位=10000000B。(dat>>1) | (dat1<<7)意思是括號中的兩個數進行“或”運算。在不能理解的情況下可以把它簡單理解為相加,(dat>>1) | (dat1<<7)=(00000101B) | (10000000B)=(00000101B) + (10000000B)= 10000101B=133。可以用十進制運算來驗證一下,00000101B=5,10000000B=128,00000101B+10000000B=5+128=133,運算結果是相等的。
作者: 7358655    時間: 2019-3-17 18:55
這個語句dat = (dat>>1) | (dat1<<7)要從后面看,
1.dat1<<7把dat1最低地位,放最高位。
2.  |  按位或是為了讀數據,數據情況不清楚。
3. dat>>1是為了下次循環,騰位置否則數據被覆蓋了,剛好把放高位的低位數據移到低位。
4.8次循環后dat1=dat
這個問題我曾經也想了幾天!
作者: dzc3458    時間: 2021-10-19 16:18
這些數據儲存都是0x兩位數,代表16進制,同時他也能進行和2進制一樣的運算。>><<是移位的意思,dat向右移1位,dat1向左移7位,補零后同假為假。最簡單的說法就是把最新接收的那一位(可能是1可能是0)塞進dat里面,從左邊塞
作者: 855155    時間: 2021-10-27 15:17
不倒翁.WZT 發表于 2017-1-16 06:28
假如dat=00001010B,dat1=00000001B,其中B是二進制的意思,dat>>1意思是右移一位,dat=00001010B右移一 ...

謝了,懂了!
作者: 15903835881    時間: 2021-10-28 11:47
表示位移,<<向左位移(高位丟棄,低位補0),>>向右位移(低位丟棄,高位補0)
作者: 傅家偉    時間: 2021-10-28 14:27
dat右移1位,左側空位補0;dat1左移7位,右側空位補0,將兩個結果按位或運算,賦值給dat
作者: wyqf    時間: 2021-10-28 16:27
重組了這個數據




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