作者CuckooBoy (新竹的仔)
看板ASM
標題[問題] io輸出問題
時間Wed Jun 30 22:18:14 2010
test =0xFFFF;
while(1)
{
for (cnt_byte=0;cnt_byte<8;cnt_byte++)
{
PORTB.1 =test & 0x8000;
test = test<<1;
}
}
之前用這code跑8051,PORTB.1都會輸出1的訊號
後來將這code貼到別牌的mcu
PORTB.1會一直為0
我將程式改成
test =0xFFFF;
while(1)
{
for (cnt_byte=0;cnt_byte<8;cnt_byte++)
{
PORTB.1 =test & 0x0001;
test = test>>1;
}
}
PORTB.1 就會1...
很好奇,為什麼會有這個差別, 看之前的code沒有什麼問題.
想問一下是不是哪邊設定可以把他改回來...
因為我的資料是要從高位元1個個丟出去,改低位元很不方便...
另外, 我用模擬看到 移位是 以LOW BYTE 移完再移 HIGH BYTE
也就是 FFFF-> FF7F -> FF3F -> FF1F.......7F00->3F00
test不是word嗎?跟我想的不太一樣...
我以為是...ffff->7fff ->3fff.....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: CuckooBoy 來自: 114.32.236.8 (06/30 22:43)
推 WolfLord:試試看加個括號(test & 0x8000) 或 ((test & 0x8000)!=0) 06/30 22:45
→ WolfLord:強迫他轉成BOOL 06/30 22:45
→ WolfLord:因為不同的編譯器對於PORT.BIT的定義可能不一樣 06/30 22:46
→ CuckooBoy:我有看模擬加誇號還是只有BYTE移位,不會WORD移位 06/30 22:55
→ CuckooBoy:((test & 0x8000)!=0) 可以 06/30 22:57
→ CuckooBoy:MCU的<<移是HIGH先移完再移LOW BYTE喔? 以為是16BIT一起 06/30 22:58
推 easypro:Complier各家定義會有所不同 有時是裡面.h並無此定義 06/30 23:13
→ easypro:complier會看不懂的,且還要看是幾位元的mcu 06/30 23:14
推 easypro:狼大的寫法才適用再不同mcu上 06/30 23:16