久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23689|回復: 22
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:161933 發表于 2017-1-15 22:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在下面程序中,
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 ??為什么???

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:161939 發表于 2017-1-15 23:33 來自觸屏版 | 只看該作者
本帖最后由 zyldlzh 于 2017-1-15 23:34 編輯

只能告訴你,dat=(dat>>1)|(dat1<<7)
dat=(dat按位右移1位)相或同假為假一真即真|(dat1按位左移7位)
貌似是!!!還會補零
回復

使用道具 舉報

板凳
ID:149988 發表于 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,運算結果是相等的。

評分

參與人數 1黑幣 +30 收起 理由
迫使湖南 + 30 很給力!

查看全部評分

回復

使用道具 舉報

地板
ID:161869 發表于 2017-1-16 08:45 | 只看該作者
我把這個句子拆分下,dat右移1位,左側空位補0;dat1左移7位,右側空位補0,將兩個結果按位或運算,賦值給dat
回復

使用道具 舉報

5#
ID:161869 發表于 2017-1-16 08:49 | 只看該作者
你的程序最后一句話寫的是return dat;如果想返回dat1,就寫return dat1;
回復

使用道具 舉報

6#
ID:161641 發表于 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。
回復

使用道具 舉報

7#
ID:161203 發表于 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是有關的。
回復

使用道具 舉報

8#
ID:161979 發表于 2017-1-16 10:42 | 只看該作者
dat = (dat>>1) | (dat1<<7)  就是dat右移一位, dat1左移7位,當兩個條件任何一個為真時,結果為1.
回復

使用道具 舉報

9#
ID:161203 發表于 2017-1-16 15:22 | 只看該作者
我上午的回復顯示需要審核,怎么就不見了呢?
回復

使用道具 舉報

10#
ID:303875 發表于 2018-7-21 15:40 | 只看該作者
因為DS1302是從低位開始讀取的,首先把最低位讀取出來,dat = (dat>>1) | (dat1<<7);dat1向左移動7位,放在最高位。而dat是要讀取的數據嘛,不斷向右移動,8次就讀完。不斷的或運算就能把最終的dat讀出,可以認為dat1就是一個中間變量把。
回復

使用道具 舉報

11#
ID:439020 發表于 2018-12-4 10:19 | 只看該作者
dat = dat | (dat1<<n);                //這條語句不成功!!!  為啥?????
               
//dat = (dat>>1) | (dat1<<7);   //這條語句沒問題
回復

使用道具 舉報

12#
ID:439112 發表于 2018-12-4 12:24 | 只看該作者
dat = (dat>>1) | (dat1<<7); 把dat1最后一位放在最高位,原dat高7位接著放,構成一個新的dat
回復

使用道具 舉報

13#
ID:21069 發表于 2018-12-10 03:37 來自觸屏版 | 只看該作者
看這個代碼時,你要看看它的電路與你以前有什么不同?以前是8個口傳數據,現在一個口!!!以前傳的是一個字節,現在是一個位!!!其實這就是將8個位合并成一個字節或是一個字節拆分成8個位的常用手段,只能是位才便于一個端口傳輸。至于合并與拆分具體上面朋友有講的很清楚的!
回復

使用道具 舉報

14#
ID:472242 發表于 2019-2-6 23:42 | 只看該作者
jinsheng7533967 發表于 2018-12-10 03:37
看這個代碼時,你要看看它的電路與你以前有什么不同?以前是8個口傳數據,現在一個口!!!以前傳的是一個 ...

講的很透徹,學習了

評分

參與人數 1黑幣 +35 收起 理由
shuisheng + 35

查看全部評分

回復

使用道具 舉報

15#
ID:479528 發表于 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。
回復

使用道具 舉報

16#
ID:326868 發表于 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次賦值為什么不是一樣的?
回復

使用道具 舉報

17#
ID:491841 發表于 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,運算結果是相等的。
回復

使用道具 舉報

18#
ID:466164 發表于 2019-3-17 18:55 | 只看該作者
這個語句dat = (dat>>1) | (dat1<<7)要從后面看,
1.dat1<<7把dat1最低地位,放最高位。
2.  |  按位或是為了讀數據,數據情況不清楚。
3. dat>>1是為了下次循環,騰位置否則數據被覆蓋了,剛好把放高位的低位數據移到低位。
4.8次循環后dat1=dat
這個問題我曾經也想了幾天!
回復

使用道具 舉報

19#
ID:964308 發表于 2021-10-19 16:18 來自觸屏版 | 只看該作者
這些數據儲存都是0x兩位數,代表16進制,同時他也能進行和2進制一樣的運算。>><<是移位的意思,dat向右移1位,dat1向左移7位,補零后同假為假。最簡單的說法就是把最新接收的那一位(可能是1可能是0)塞進dat里面,從左邊塞
回復

使用道具 舉報

20#
ID:945922 發表于 2021-10-27 15:17 | 只看該作者
不倒翁.WZT 發表于 2017-1-16 06:28
假如dat=00001010B,dat1=00000001B,其中B是二進制的意思,dat>>1意思是右移一位,dat=00001010B右移一 ...

謝了,懂了!
回復

使用道具 舉報

21#
ID:974277 發表于 2021-10-28 11:47 | 只看該作者
表示位移,<<向左位移(高位丟棄,低位補0),>>向右位移(低位丟棄,高位補0)
回復

使用道具 舉報

22#
ID:975682 發表于 2021-10-28 14:27 | 只看該作者
dat右移1位,左側空位補0;dat1左移7位,右側空位補0,將兩個結果按位或運算,賦值給dat
回復

使用道具 舉報

23#
ID:750420 發表于 2021-10-28 16:27 | 只看該作者
重組了這個數據
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久小仙女图片 | 日韩欧美网| 国产精品美女一区二区三区 | 日本a级大片 | 日日骚网| 亚洲一区国产 | 亚洲视频在线观看 | 亚洲精品视频免费观看 | 国产欧美在线播放 | 日韩欧美一二三区 | 亚洲国产精品久久 | 久色网| 中文字幕av在线 | 一级毛片视频在线 | 午夜私人影院 | 欧美精品在欧美一区二区 | 亚洲精品不卡 | 中文字幕成人av | 亚洲日本欧美日韩高观看 | 日韩欧美在线一区 | 久久精品国产一区二区电影 | 91视频在线观看 | 国产第一页在线播放 | 一级黄色片免费 | 成人深夜福利网站 | 国产极品粉嫩美女呻吟在线看人 | 国产精品国产三级国产播12软件 | 中文字幕一区二区三区四区 | 欧美久久视频 | 成人亚洲精品 | 中文字幕不卡在线88 | 免费在线视频精品 | 欧美激情在线精品一区二区三区 | 韩日在线视频 | 国产一区影院 | 天天拍天天插 | 成人网址在线观看 | 夏同学福利网 | 欧美精品一区二区三区在线播放 | 蜜桃在线一区二区三区 | 曰韩三级|