四位共阳数码管显示驱动 -- 来自网络

四位共阳数码管显示驱动,使用 python3 编写。

# tm1637 class
import time
import RPi.GPIO as GPIO

# 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9
#HexDigits = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71];
HexDigits = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f];

ADDR_AUTO = 0x40;
ADDR_FIXED = 0x44;
START_ADDR = 0xC0;
BRIGHT_DARKEST = 0;
BRIGHT_TYPICAL = 2;
BRIGHT_HIGHEST = 7;
OUTPUT = GPIO.OUT;
INPUT = GPIO.IN;
LOW = GPIO.LOW;
HIGH = GPIO.HIGH;

class TM1637:
    doublePoint = False;
    clkPin = 0;
    dataPin = 0;
    brightnes = BRIGHT_TYPICAL;
    curData = [0, 0, 0, 0];

    def __init__(self, clkPin, dataPin, brightnes = BRIGHT_TYPICAL):
        self.clkPin = clkPin;
        self.dataPin = dataPin;
        self.brightnes = brightnes;
        GPIO.setup(self.clkPin, OUTPUT);
        GPIO.setup(self.dataPin, OUTPUT);
    # end __init__

    def clear(self):
        point = self.doublePoint;
        self.doublePoint = False;
        data = [0, 0, 0, 0];
        self.showData(data);
        self.doublePoint = point;
    # end clear

    def showData(self, data):
        #print 'show data';
        for i in range(0, 4):
            self.curData[i] = data[i];
            #print 'data[', i, ']', data[i];
        #end for

        self.start();
        self.writeByte(ADDR_AUTO);
        self.stop();
        self.start();
        self.writeByte(START_ADDR);
        for i in range(0, 4):
            self.writeByte(self.encode(data[i]));
        self.stop()
        self.start();
        self.writeByte(0x88 + self.brightnes);
        self.stop();
    # end showData

    def showDoublePoint(self, on):
        if(self.doublePoint != on):
            self.doublePoint = on;
            self.showData(self.curData);
        # end if
    #end showDoublePoint

    def writeByte(self, data):
        for i in range(0, 8):
            GPIO.output(self.clkPin, LOW);
            if(data & 0x01):
                GPIO.output(self.dataPin, HIGH);
            else:
                GPIO.output(self.dataPin, LOW);

            data = data >> 1;
            GPIO.output(self.clkPin, HIGH);
        # end for

        # wait for ACK
        GPIO.output(self.clkPin, LOW);
        GPIO.output(self.dataPin, HIGH); # set data gpio high, util slave ack,set low
        GPIO.output(self.clkPin, HIGH);
        GPIO.setup(self.dataPin, INPUT); # set data gpio to input for slave

        #print 'self.dataPint = ', self.dataPin;

        while(GPIO.input(self.dataPin)):
            time.sleep(0.001);
            if(GPIO.input(self.dataPin)):
                GPIO.setup(self.dataPin, OUTPUT);
                GPIO.output(self.dataPin, LOW);
                GPIO.setup(self.dataPin, INPUT);
            # end if
        # end while
        #print 'ack is get'
        GPIO.setup(self.dataPin, OUTPUT);

    # end writeByte

    def start(self):
        GPIO.output(self.clkPin, HIGH);
        GPIO.output(self.dataPin, HIGH);
        GPIO.output(self.dataPin, LOW);
        GPIO.output(self.clkPin, LOW)
    # end start

    def stop(self):
        GPIO.output(self.clkPin, LOW);
        GPIO.output(self.dataPin, LOW);
        GPIO.output(self.clkPin, HIGH);
        GPIO.output(self.dataPin, HIGH);
    # end stop

    def encode(self, data):
        if(self.doublePoint):
            pointData = 0x80;
        else:
            pointData = 0;

        if(data == 0x7F):
            data = 0;
        else:
            data = HexDigits[data] + pointData;

        return data;
    # end encode
# end class TM1637


# start show cur timer
import tm1637
import RPi.GPIO as GPIO
import time

CLK = 24;
DATA  = 23;
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False);

HHMMFORMAT = '%H:%M'

try:
    digital1637 = tm1637.TM1637(CLK, DATA)
    digital1637.showDoublePoint(0);

    lastTime = 0;
    while(True):
        curTime = time.strftime(HHMMFORMAT, time.localtime(time.time()));
        if(curTime != lastTime):
            number = [1,2,3,4];
            digital1637.showData(number);
        # end if

        time.sleep(0.05);
    # end while

except KeyboardInterrupt:
    pass

GPIO.cleanup();
# end show cur timer
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要连接共阳四位数码管到 Arduino 上。每个数码管有七个引脚,分别表示数码管的七个段(a~g)。其中,一个引脚为共阳极,用于控制数码管的亮灭。 接下来,编写代码实现循环显示0-9的功能。可以使用一个数组来存储数字0-9对应的七段编码,然后使用循环依次显示每个数字。具体代码如下: ```C++ int digitPins[] = {2, 3, 4, 5}; // 数码管七段引脚 int commonPin = 6; // 共阳极引脚 int digits[][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0 {0, 1, 1, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1}, // 2 {1, 1, 1, 1, 0, 0, 1}, // 3 {0, 1, 1, 0, 0, 1, 1}, // 4 {1, 0, 1, 1, 0, 1, 1}, // 5 {1, 0, 1, 1, 1, 1, 1}, // 6 {1, 1, 1, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1} // 9 }; void setup() { for (int i = 0; i < 4; i++) { pinMode(digitPins[i], OUTPUT); } pinMode(commonPin, OUTPUT); } void loop() { for (int i = 0; i < 10; i++) { for (int j = 0; j < 4; j++) { digitalWrite(commonPin, HIGH); // 共阳极亮 for (int k = 0; k < 7; k++) { digitalWrite(digitPins[k], digits[i][k]); // 显示数字 i 的第 j 个位 } digitalWrite(digitPins[j], LOW); // 关闭第 j 个位 delay(5); // 适当延时 } } } ``` 代码中,`digitPins` 数组存储数码管的七段引脚,`commonPin` 存储共阳极引脚。`digits` 数组存储数字0-9对应的七段编码。 在 `setup()` 函数中,将数码管七段引脚和共阳极引脚设为输出模式。 在 `loop()` 函数中,使用三重循环。外层循环控制数字的循环显示,中层循环控制数码管的四个位,内层循环控制每个位的七段编码。在每个位的循环中,将共阳极引脚设为高电平,七段引脚按照对应的七段编码显示数字,然后关闭当前位的引脚,延时一段时间,进入下一个位循环。 这样,就可以实现共阳四位数码管的循环显示了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值