继续树莓派GPIO:两片74HC595控制一个8x8LED点阵显示爱心
继续树莓派GPIO:两片74HC595控制一个8x8LED点阵显示爱心http://blog.****.net/ki1381/article/details/52134935
先上效果图:
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()