继续树莓派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()






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ki1381

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值