从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);
}
}