繼續樹莓派GPIO:兩片74HC595控制一個8x8LED點陣顯示愛心
先上效果圖:
8x8LED點陣其實就是64只LDE按8行,每行8列排列。我用的點陣是共陽的,共有16個引腳,8個做行選擇,8個做列選擇。具體引腳排列規則請參考http://www.docin.com/p-42115784.html。我這裡整理如下:
C8 C7 R2 C1 R4 C6 C4 R1
R5 R7 C2 C3 R8 C5 R6 R3
其中,C表示列,R表示行。例如,點亮第一行第二列,只要R1腳上(即上邊最右腳)加上高電平,其它R腳設為低電平,C2腳(下邊左數第三個)設為低電平,其它C腳均設為高電平,即可點亮。又如要同時點亮第一行的第二列和第八列,可以在剛才的基礎上讓C8也設為低電平即可。
如果有多行多列,我的做法是逐行掃描。從第一行到 第八行,每次只將當前行設為高電平,然後再看每一列,將需要點亮的列號引腳電平拉低,否則設為高電平。可見一會兒行選擇的電平可以按習慣上的高低來寫程式碼,但列程式碼就要反一下了。這很好理解,只有存在電位差LED才能亮。而且,由於發光二極體也是二極體,有單向導通的特性,因此要亮陽極只能是高電平。
思路很明確了,用兩塊74HC595,一塊用來選擇行,另一塊用來設定列。電路圖不復雜,這跟驅動單個數碼管沒本質區別,就是再加一組而已。
然後就是接線要小心,那個點陣的管腳有點亂。我是先用兩組公轉母的彩虹杜邦線理了一下行列的排列,一組讓行排成1-8,另一組讓列。其實彩虹線的排列方式與電阻色環的規律完全相同,因此熟悉電阻色環標註的話很容易看色識數的。
這次實驗用了樹莓派的GPIO11,13,15和36,38,40兩組。前者用於列選擇,後者用於行選擇。
顯示如圖愛心程式碼的如下。由於樹莓派本身的限制,可能偶爾有閃爍。
#coding=gbk
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import sys
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(13,GPIO.OUT) # Serail Data
GPIO.setup(11,GPIO.OUT) # Serail Data Input
GPIO.setup(15,GPIO.OUT) # Output Data
GPIO.setup(36,GPIO.OUT) # Serail Data
GPIO.setup(40,GPIO.OUT) # Serail Data Input
GPIO.setup(38,GPIO.OUT) # Output Data
def InputColBit():
GPIO.output(11,False)
GPIO.output(11,True)
def InputRowBit():
GPIO.output(40,False)
GPIO.output(40,True)
def ConfirmCol():
GPIO.output(15,False)
GPIO.output(15,True)
def ConfirmRow():
GPIO.output(38,False)
GPIO.output(38,True)
def SetColData(s):
'''
s: abcdefg.
1 for on
0 for off
'''
for i in range(8):
if s[i] == '1':
GPIO.output(13,False)
else:
GPIO.output(13,True)
InputColBit()
def SetRowData(s):
'''
s: abcdefg.
1 for on
0 for off
'''
for i in range(8):
if s[i] == '1':
GPIO.output(36,True)
else:
GPIO.output(36,False)
InputRowBit()
def ShowOff():
SetRowData('00000000')
ConfirmRow()
SetColData('00000000')
ConfirmCol()
def ShowHeart():
#Row 1
ShowOff()
SetRowData('10000000')
ConfirmRow()
SetColData('01101100')
ConfirmCol()
#Row 2
ShowOff()
SetRowData('01000000')
ConfirmRow()
SetColData('10010010')
ConfirmCol()
#Row 3
ShowOff()
SetRowData('00100000')
ConfirmRow()
SetColData('10000010')
ConfirmCol()
#Row 4
ShowOff()
SetRowData('00010000')
ConfirmRow()
SetColData('01000100')
ConfirmCol()
#Row 5
ShowOff()
SetRowData('00001000')
ConfirmRow()
SetColData('00101000')
ConfirmCol()
#Row 6
ShowOff()
SetRowData('00000100')
ConfirmRow()
SetColData('00010000')
ConfirmCol()
def main():
while 1:
ShowHeart()
if __name__ == "__main__":
main()