用树莓派来操控一个四位数码管

从TB买了个四位数码管。驱动是两个74HC755。代码如下。

基本原理为:

动态扫描,也就是一次点亮一个数码管,熄灭其它的,然后点亮下一个,熄灭其它的,以此往复。由于人眼镜的视觉暂留效应,看起来就像一直在点亮一样。

四个数码管,数据输入ABCDEFGH连接到一个74HC755的八个输出输出口上。然后四个数码管的阳极通过三极管分别连接到另一个755的四个数据输出口上(另外四个没有使用)。

当要在某个数码管上显示数字的时候,首先输入这个数字的八个led的亮暗情况,最后再输入这四个数码管亮哪一个。比如

要在第一个数码管输出0,首先输出0的笔画表示

     +--亮---+
 亮 |            |  亮    
     +-- 灭--+
 亮 |            |  亮
     +-- 亮---+

也就是10010000  (1表示灭,0表示亮,最高位是小数点,不亮)

然后在输出一个 0x1  (00000001),

+---------------+
|                      |----------------      该脚为 0
|     755          |----------------      该脚为 0
|                      |----------------      该脚为 0
|                      |----------------      该脚为 1,所以与之相连的三极管,把数码管的输入端打开,该数码管点亮
+---------------+

 

最后RCLK输入一个上升沿,把这16位数据送入锁存器,这个数字就被显示出来了。 代码如下。


package org.lff.p2;

import com.pi4j.component.light.LED;
import com.pi4j.io.gpio.*;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by LFF on 2015/11/4.
 */
public class H755 {

    private static String LED_0 = "10010000";
    private static String LED_1 = "11111001";
    private static String LED_2 = "10100100";
    private static String LED_3 = "10110000";
    private static String LED_4 = "10011001";
    private static String LED_5 = "10010010";
    private static String LED_6 = "10000010";
    private static String LED_7 = "11111000";
    private static String LED_8 = "10000000";
    private static String LED_9 = "10010000";

    private static Map<Integer, String> map = new HashMap<Integer, String>();

    static {
        map.put(0, LED_0);
        map.put(1, LED_1);
        map.put(2, LED_2);
        map.put(3, LED_3);
        map.put(4, LED_4);
        map.put(5, LED_5);
        map.put(6, LED_6);
        map.put(7, LED_7);
        map.put(8, LED_8);
        map.put(9, LED_9);
    }



    private static GpioPinDigitalOutput DIO;
    private static GpioPinDigitalOutput RCLK;
    private static GpioPinDigitalOutput SCLK;

    public static void main(String[] argu) {
        init();
        long l = System.currentTimeMillis();
        byte d3 = fromString(map.get(1));
        byte d2 = fromString(map.get(2));
        byte d1 = fromString(map.get(3));
        byte d0 = fromString(map.get(4));

        int count = 0;
        while(true) {
            //;
            display(d3, d2, d1, d0);
            count++;
            if (count % 100 == 0) {
                System.out.println(count + " in " + (System.currentTimeMillis() - l) + " ms.");
                l = System.currentTimeMillis();
            }
        }
    }

    private static void display(byte d3, byte d2, byte d1, byte d0) {
        LED_OUT(d3);
        LED_OUT((byte) 1);
        RCLK.low();
        RCLK.high();
        sleep(2);
        LED_OUT(d2);
        LED_OUT((byte)2);
        RCLK.low();
        RCLK.high();
        sleep(2);
        LED_OUT(d1);
        LED_OUT((byte)4);
        RCLK.low();
        RCLK.high();
        sleep(2);
        LED_OUT(d0);
        LED_OUT((byte)8);
        RCLK.low();
        RCLK.high();
        sleep(2);
    }

    private static void sleep(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
        }
    }

    private static void LED_OUT(byte X)
    {
        byte i;
        for(i=8;i>=1;i--)
        {
            if ((X & 0x80) != 0)
            {
                DIO.high();
            }
            else
            {
                DIO.low();
            }
            X<<=1;
            SCLK.low();
            SCLK.high();
        }
    }

    private static byte fromString(String bin) {
        int x = (Integer.parseInt(bin, 2));
        byte X = (byte)(x & 0xFF);
        return X;
    }

    private static void init() {

        // create gpio controller
        final GpioController gpio = GpioFactory.getInstance();

        DIO = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_29, "dio", PinState.HIGH);
        RCLK = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, "rclk", PinState.HIGH);
        SCLK = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_27, "sclk", PinState.HIGH);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值