[問題] io輸出問題

看板ASM (組合語言)作者 (新竹的仔)時間15年前 (2010/06/30 22:18), 編輯推噓3(306)
留言9則, 3人參與, 最新討論串1/1
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)

06/30 22:45, , 1F
試試看加個括號(test & 0x8000) 或 ((test & 0x8000)!=0)
06/30 22:45, 1F

06/30 22:45, , 2F
強迫他轉成BOOL
06/30 22:45, 2F

06/30 22:46, , 3F
因為不同的編譯器對於PORT.BIT的定義可能不一樣
06/30 22:46, 3F

06/30 22:55, , 4F
我有看模擬加誇號還是只有BYTE移位,不會WORD移位
06/30 22:55, 4F

06/30 22:57, , 5F
((test & 0x8000)!=0) 可以
06/30 22:57, 5F

06/30 22:58, , 6F
MCU的<<移是HIGH先移完再移LOW BYTE喔? 以為是16BIT一起
06/30 22:58, 6F

06/30 23:13, , 7F
Complier各家定義會有所不同 有時是裡面.h並無此定義
06/30 23:13, 7F

06/30 23:14, , 8F
complier會看不懂的,且還要看是幾位元的mcu
06/30 23:14, 8F

06/30 23:16, , 9F
狼大的寫法才適用再不同mcu上
06/30 23:16, 9F
文章代碼(AID): #1CAr8en3 (ASM)
文章代碼(AID): #1CAr8en3 (ASM)