標(biāo)題: 關(guān)于單片機(jī)中的一點(diǎn)C語言的問題 [打印本頁]

作者: 134849694164151    時間: 2018-5-16 21:17
標(biāo)題: 關(guān)于單片機(jī)中的一點(diǎn)C語言的問題
這是ds1302中寫字節(jié)的一部分,我想問問這部分里邊的這個for循環(huán),里邊的那個dat一次不是只能傳輸一個位嗎?最終是怎么傳出來一個字節(jié)的呢?每次循環(huán)不應(yīng)該都重新來了嗎?所以就不懂了,麻煩看見的幫我解答解答,萬分感激

Screenshot_2018-05-16-21-07-21-52.png (139.08 KB, 下載次數(shù): 64)

Screenshot_2018-05-16-21-07-21-52.png

作者: 134849694164151    時間: 2018-5-17 00:33
        圖片里的東西在這里
for (i=0; i<8; i++)
        {
                dat = addr & 0x01;                 // SPI是從低位開始傳輸?shù)?br />                 DSIO = dat;                                 // 把要發(fā)送的bit數(shù)據(jù)丟到IO引腳上去準(zhǔn)備好
                SCLK = 1;                                 // 制造上升沿,讓DS1302把IO上的值讀走
                delay();                                // 讀走之后,一個小周期就完了
                SCLK = 0;                                // 把SCLK拉低,是為了給下一個小周期做準(zhǔn)備
                delay();
                addr >>= 1;                                   // 把a(bǔ)ddr右移一位
        }
        // 第3部分: 寫入第2字節(jié),value
        for (i=0; i<8; i++)
        {
                dat = value & 0x01;                 // SPI是從低位開始傳輸?shù)?br />                 DSIO = dat;                                 // 把要發(fā)送的bit數(shù)據(jù)丟到IO引腳上去準(zhǔn)備好
                SCLK = 1;                                 // 制造上升沿,讓DS1302把IO上的值讀走
                delay();                                // 讀走之后,一個小周期就完了
                SCLK = 0;                                // 把SCLK拉低,是為了給下一個小周期做準(zhǔn)備
                delay();
                value = value >> 1;                   // 把a(bǔ)ddr右移一位
        }
作者: HC6800-ES-V2.0    時間: 2018-5-17 07:23
134849694164151 發(fā)表于 2018-5-17 00:33
圖片里的東西在這里
for (i=0; i>= 1;                                   // 把a(bǔ)ddr右移一位
        }

從你給的程序上看,dat是8位,不是一位。
主要是你想不通:為什么一個8位數(shù)據(jù)去給一個一位賦值?!
其實很簡單:DSIO是一位,當(dāng)DSIO=dat時,自動取低位。
你自己可以做實驗的:對一個unsigned char 型變量,賦值0x1234,你會發(fā)現(xiàn),最后得到的自動就是0x34,高位自動去掉了。
作者: wulin    時間: 2018-5-17 07:44
134849694164151 發(fā)表于 2018-5-17 00:33
圖片里的東西在這里
for (i=0; i>= 1;                                   // 把a(bǔ)ddr右移一位
        }

就像8個人排隊跳水,一次只跳下一個,后面的人依次向前移動一位,直至跳完。addr >>= 1; // 把a(bǔ)ddr右移一位
作者: 林曦    時間: 2018-5-17 08:50
一個字節(jié)是8位。for循環(huán)里面循環(huán)8次,每一次循環(huán)把dat里面的數(shù)據(jù)給DSIO寄存器,然后dat獲得value右移一位后的數(shù)據(jù),8次共傳輸一個字節(jié)。for循環(huán)8次后,進(jìn)入下一個函數(shù)。
作者: nnqtdf    時間: 2018-5-17 08:54
每次傳輸一個位,循環(huán)8次不正好一個字節(jié)嗎

作者: nnqtdf    時間: 2018-5-17 08:58

仔細(xì)理解下這兩句

作者: 程序新手    時間: 2018-5-23 10:13
從你給的程序上第一句看,dat是8位,不是一位。
從最低位開始傳
DSIO是一位,當(dāng)DSIO=dat時,自動取低位。
所以你就可以看到八位數(shù)啦
希望對你能有幫助
作者: Robertzhang    時間: 2018-5-23 19:10
是每次傳送一bit,傳8次就是一個Byte了。如果要傳輸很多Byte,就連續(xù)調(diào)用這個循環(huán)。
作者: yanwang    時間: 2018-5-23 20:55
取最低位,傳一位移一位,八次




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