1. 程式人生 > >繼續樹莓派GPIO:兩片74HC595控制一個8x8LED點陣顯示愛心

繼續樹莓派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()