熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2018-5-16 21:17
正文摘要:這是ds1302中寫字節(jié)的一部分,我想問問這部分里邊的這個(gè)for循環(huán),里邊的那個(gè)dat一次不是只能傳輸一個(gè)位嗎?最終是怎么傳出來一個(gè)字節(jié)的呢?每次循環(huán)不應(yīng)該都重新來了嗎?所以就不懂了,麻煩看見的幫我解答解答,萬分 ... |
取最低位,傳一位移一位,八次 |
是每次傳送一bit,傳8次就是一個(gè)Byte了。如果要傳輸很多Byte,就連續(xù)調(diào)用這個(gè)循環(huán)。 |
從你給的程序上第一句看,dat是8位,不是一位。 從最低位開始傳 DSIO是一位,當(dāng)DSIO=dat時(shí),自動取低位。 所以你就可以看到八位數(shù)啦 希望對你能有幫助 |
![]() 仔細(xì)理解下這兩句 |
每次傳輸一個(gè)位,循環(huán)8次不正好一個(gè)字節(jié)嗎 |
一個(gè)字節(jié)是8位。for循環(huán)里面循環(huán)8次,每一次循環(huán)把dat里面的數(shù)據(jù)給DSIO寄存器,然后dat獲得value右移一位后的數(shù)據(jù),8次共傳輸一個(gè)字節(jié)。for循環(huán)8次后,進(jìn)入下一個(gè)函數(shù)。 |
134849694164151 發(fā)表于 2018-5-17 00:33 就像8個(gè)人排隊(duì)跳水,一次只跳下一個(gè),后面的人依次向前移動一位,直至跳完。addr >>= 1; // 把a(bǔ)ddr右移一位 |
134849694164151 發(fā)表于 2018-5-17 00:33 從你給的程序上看,dat是8位,不是一位。 主要是你想不通:為什么一個(gè)8位數(shù)據(jù)去給一個(gè)一位賦值?! 其實(shí)很簡單:DSIO是一位,當(dāng)DSIO=dat時(shí),自動取低位。 你自己可以做實(shí)驗(yàn)的:對一個(gè)unsigned char 型變量,賦值0x1234,你會發(fā)現(xiàn),最后得到的自動就是0x34,高位自動去掉了。 |
圖片里的東西在這里 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(); // 讀走之后,一個(gè)小周期就完了 SCLK = 0; // 把SCLK拉低,是為了給下一個(gè)小周期做準(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(); // 讀走之后,一個(gè)小周期就完了 SCLK = 0; // 把SCLK拉低,是為了給下一個(gè)小周期做準(zhǔn)備 delay(); value = value >> 1; // 把a(bǔ)ddr右移一位 } |
Powered by 單片機(jī)教程網(wǎng)