作者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)
1F:推 WolfLord:试试看加个括号(test & 0x8000) 或 ((test & 0x8000)!=0) 06/30 22:45
2F:→ WolfLord:强迫他转成BOOL 06/30 22:45
3F:→ WolfLord:因为不同的编译器对於PORT.BIT的定义可能不一样 06/30 22:46
4F:→ CuckooBoy:我有看模拟加夸号还是只有BYTE移位,不会WORD移位 06/30 22:55
5F:→ CuckooBoy:((test & 0x8000)!=0) 可以 06/30 22:57
6F:→ CuckooBoy:MCU的<<移是HIGH先移完再移LOW BYTE喔? 以为是16BIT一起 06/30 22:58
7F:推 easypro:Complier各家定义会有所不同 有时是里面.h并无此定义 06/30 23:13
8F:→ easypro:complier会看不懂的,且还要看是几位元的mcu 06/30 23:14
9F:推 easypro:狼大的写法才适用再不同mcu上 06/30 23:16