0x00 背景
最近有智慧網控的培訓,該培訓中有一門課--嵌入式系統教到8051。該課程老師出功課,要求我們使用<<(C語言的位元移位運算子)來控制LED燈,藉此鍛鍊電腦程式演算法的思維。
 
0x01 遇到的問題
我在網路上查到>>的功能是將bit向右移動(跟<<恰好相反)。但我在使用的時候,發現一些問題。比方說,下圖中左邊第18行,我將P0指派為1000,0000並且>>3,原本預計應該得到0001,0000(1向右移動3格),但卻得到1101,0000。
(如下圖中右邊)
image
 
0x02 解決方法
發現自己輸入錯誤,我誤以為我輸入的是2進制(1000, 0000(2)),實際上電腦判斷該數值為10進制(1000, 0000(10)),解決方法為輸入16進制的數值(0x80) 或10進制的數值(128(10))。
(如下圖左邊程式碼第19行(0x80:即為1000,0000(2)))
image
 
0x03 原由 
原因我們可以透過程式用計算機來一窺堂奧。
首先我們先輸入1000, 0000,會發現模擬器會把它辨識為10進制的模式(而不是我以為的2進制,所以它的2進制值很大1001, 1000, 1001, 0110, 1000, 0000 (2)。
(其驗證結果如下圖)
image
 
接著執行P0>>3之後會發現得到0001, 0011, 0001, 0010, 1101, 0000(2)。由於P0是1byte的暫存器,所以只會取後面8個位元,得到1101, 0000(2),也就是前面百思不得其解的地方
(其驗證結果如下圖)
image
 
正確的思路應該是P0指派為0x80,並且>>3,才會得到我預期的結果0001, 0000(2)。因為0x80轉為2進制才是1000, 0000(2)
(其驗證結果如下圖)
image
 
再將P0>>3,得到0001, 0000(2)
(其驗證結果如下圖)
image
 
0x04 結論
在模擬器指派數值的時候,千萬要記得輸入的值模擬器會把它當成10進制看待(而非2進制),而導致輸出預期外的結果。因此,要先將2進制數值轉成對應的16進制或10進制數值。
(e.g. 1000, 0000(2) = 0x80 = 128(10))
arrow
arrow
    文章標籤
    8051c語言
    全站熱搜

    洪裕權 發表在 痞客邦 留言(0) 人氣()