2022年10月8日 星期六

顯示器實作 – Charlieplexing(查理複用演算法)實現3個GPIO控制6個LED燈

顯示器實作 – Charlieplexing(查理複用演算法)實現3GPIO控制6LED

 

Charlieplexing(查理複用演算法)是一種使用少量I / O引腳控制許多LED的技術。Charlieplexing技術以其發明者Charlie Allen命名,他于1995年發明了該技術。查理複用演算法以N IO接腳驅動 N*(N-1) LED 燈。

Number of Pins

How many LEDs can you drive?

LEDs Charlieplexed

LEDs Traditional

n

n * (n 1)

(n / 2)2

 

電路圖

 



程式列表

Python – ePy-Lite_Charlieplexing.py 

"""

 ePy-Lite_Charlieplexing.py

 Reference: http://razzpisampler.oreilly.com/ch04.html

 

 ------------------------------------------

  ePy-Lite  LED

  Pin       Pin

  ----------------------------------------

  P6

  P8

  P7

"""

 

from machine import Switch  #Get button KEY library

from machine import Pin

from utime import sleep_ms

 

pin_led_states = [

    [-1, -1, -1], # 0

    [ 1,  0, -1], # 1

    [ 0,  1, -1], # 2

    [-1,  1,  0], # 3

    [-1,  0,  1], # 4

    [ 1, -1,  0], # 5

    [ 0, -1,  1]  # 6

  ]

 

class Charlieplexing:

  def __init__(self, LEDPin1,LEDPin2,LEDPin3):

    self.LEDPin1=LEDPin1

    self.LEDPin2=LEDPin2

    self.LEDPin3=LEDPin3

 

  def light_led(self, led_number):

    pin_state=pin_led_states[led_number][0]

    if pin_state == -1:

      self.LEDPin1.init(Pin.IN, Pin.PULL_NONE)

    else:

      self.LEDPin1.init(Pin.OUT, value=pin_state)

 

    pin_state=pin_led_states[led_number][1]

    if pin_state == -1:

      self.LEDPin2.init(Pin.IN, Pin.PULL_NONE)

    else:

      self.LEDPin2.init(Pin.OUT, value=pin_state)

 

    pin_state=pin_led_states[led_number][2]

    if pin_state == -1:

      self.LEDPin3.init(Pin.IN, Pin.PULL_NONE)

    else:

      self.LEDPin3.init(Pin.OUT, value=pin_state)

 

def key_int():

  global KeyDone

  KeyDone = True

 

# Start Function

if __name__ == '__main__':

  KeyA = Switch('keya')    #Create button A

  KeyA. (key_int)

  KeyDone = False

 

  LDP1=Pin.board.P6

  LDP2=Pin.board.P7

  LDP3=Pin.board.P8

  LEDx6 = Charlieplexing(LDP1,LDP2,LDP3)

 

  while True:

    for x in range(7):

      LEDx6.light_led(x)

      sleep_ms(100)

   

    if KeyDone == True:      #Press A Key

      break

 

  LEDx6.light_led(0)

  KeyA.callback(None)

 

考文獻

l   Wikipedia https://en.wikipedia.org/wiki/Charlieplexing