from machine import Pin
from time import sleep_ms
def init_led() :
global led
led7 = Pin(13,Pin.OUT)
led6 = Pin(12,Pin.OUT)
led5 = Pin(14,Pin.OUT)
led4 = Pin(27,Pin.OUT)
led3 = Pin(26,Pin.OUT)
led2 = Pin(25,Pin.OUT)
led1 = Pin(33,Pin.OUT)
led0 = Pin(32,Pin.OUT)
led = [led0,led1,led2,led3,led4,led5,led6,led7]
def show(dat) :
for i in range(0,len(led)) :
temp = dat >> i
if (temp & 0x01) == 0 :
led[i].value(0)
else :
led[i].value(1)
def main() :
init_led()
while True :
show(0x55) ; sleep_ms(300) #0X代表16進位55轉為10進位為85,2進位為01010101
show(0xaa) ; sleep_ms(300)
show(0x33) ; sleep_ms(300)
show(0xcc) ; sleep_ms(300)
if __name__ == "__main__" :
main()
"""
要看懂函式show的作用,需先了解2進位制及位元運算
第14行,呼叫show(0x55)中的參數0x55,在python中0x55其實可以寫成0b01010101
bin可以印出二進位表示式的運算,由下方單行示範程式可以了解
>>是每次會把每個位元向右移位(想成把8個位元向右推,結果是最右方的位元會消失,左方會補0)
>>1 移位1個位元, >>2 移位2個位元,以此類推。如下方單行程式示範:
>> bin(0x55)
'0b1010101'
>> bin(0x55 >> 1)
'0b101010'
>> bin(0x55 >> 2)
'0b10101'
>> bin(0x55 >> 3)
'0b1010'
再來要了解,&其實是逐位元AND運算, 0x1可以看做是0b00000001
每個位元比較,兩個都是1的時候,AND出來的位元也是1
如下方單行程式示範:
0b01010101
0b00010001
==========
0b00010001
&實際運行的測試如下
> 0b01010101 & 0x1
1
>> 0b0101010 & 0x1
0
>> 0b010101 & 0x1
1
綜合以上可以得知show的詳細作用是,把dat的數值,在迴圈內依每個位元向右移位
並利用&判斷該位元是0或1,並把0或1的值設給led。
簡要來說,show主要的功能是,當傳入一個整數參數時,會把參數的8個位元的值
一次設定給8個LED,以1個位元組,就可以控制8顆燈,相當精簡有效率
在低階硬體的程式中,也常會利用位元的運算。
"""