【raspberry】(五) 四位数码管F3461BH




关于这个四位数码管:


       这个器件是和树莓派主板一起买的,节约了邮费,这个数码管一个有12个片脚,都是gpio接口,一起组合控制的,高电平3.3V,树莓派的GPIO正好满足这个要求,硬件图:


       同时数码管从数码管的原理图上看,如下,可以按照对应的硬件图连接GPIO口,8个GPIO端口控制A、B、C、D、E、F、G、DP这八个灯管,另外四个GPIO端口用来选择四个数码管的其中一个字符,也 就是这个四位的数码管,原理图中1~12代表数码管的片脚,我们只要把树莓派上的12个GPIO端口一一的连接上就可以了,需要注意的是树莓派主板上的GPIO序号



搞清楚原理后,发现了一个问题,按照图上来说同一个时刻点只能显示一位数字啊,这可是这个可是四位数码管,怎么做到四位数据同时显示呢?

       这个和人眼结构有关,其实人眼的接受频率没有计算机频率那么快,所以只要我们在0.1秒之内能够在四位数码管上都显示数据,而且不停的显示,这样我们看起来这个四个数码管就是在同一时刻显示的了


code:

        因为我的面包板上有一个温度显示器,我也想把这个问题显示器读取到的数据显示出来,所以我添加了一个按键,作为时间、日期和温度的切换,主要程序如下:


**********************************************

python 写的,下次我准备用c写,因为python不能把所有的东西连接起来


**********************************************

#!/usr/bin/env python
#### encoding: utf-8

import RPi.GPIO
import time

PIN_DATA = 24 
### 定义单个数码管各段led对应的GPIO
LED_A = 5
LED_B = 26
LED_C = 17
LED_D = 3
LED_E = 2
LED_F = 6
LED_G = 27
LED_DP = 4

### 定义1到4号数码管阳极对应的GPIO
DIGIT1 = 16
DIGIT2 = 13
DIGIT3 = 19
DIGIT4 = 22

### 定义按钮输入的GPIO
btn = 20

RPi.GPIO.setmode(RPi.GPIO.BCM)

RPi.GPIO.setup(LED_A, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_B, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_C, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_D, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_E, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_F, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_G, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_DP, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT1, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT2, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT3, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT4, RPi.GPIO.OUT)

RPi.GPIO.output(DIGIT1, True)
RPi.GPIO.output(DIGIT2, True)
RPi.GPIO.output(DIGIT3, True)
RPi.GPIO.output(DIGIT4, True)

RPi.GPIO.setup(btn, RPi.GPIO.IN, pull_up_down=RPi.GPIO.PUD_UP)

def showDigit(no, num, showDotPoint):
    # 先将正极拉低,关掉显示
	RPi.GPIO.output(DIGIT1, False)
	RPi.GPIO.output(DIGIT2, False)
	RPi.GPIO.output(DIGIT3, False)
	RPi.GPIO.output(DIGIT4, False)
	
	if (num == 0) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, False)
		RPi.GPIO.output(LED_F, False)
		RPi.GPIO.output(LED_G, True)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 1) :
		RPi.GPIO.output(LED_A, True)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, True)
		RPi.GPIO.output(LED_E, True)
		RPi.GPIO.output(LED_F, True)
		RPi.GPIO.output(LED_G, True)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 2) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, True)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, False)
		RPi.GPIO.output(LED_F, True)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 3) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, True)
		RPi.GPIO.output(LED_F, True)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 4) :
		RPi.GPIO.output(LED_A, True)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, True)
		RPi.GPIO.output(LED_E, True)
		RPi.GPIO.output(LED_F, False)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 5) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, True)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, True)
		RPi.GPIO.output(LED_F, False)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 6) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, True)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, False)
		RPi.GPIO.output(LED_F, False)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 7) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, True)
		RPi.GPIO.output(LED_E, True)
		RPi.GPIO.output(LED_F, True)
		RPi.GPIO.output(LED_G, True)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 8) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, False)
		RPi.GPIO.output(LED_F, False)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	elif (num == 9) :
		RPi.GPIO.output(LED_A, False)
		RPi.GPIO.output(LED_B, False)
		RPi.GPIO.output(LED_C, False)
		RPi.GPIO.output(LED_D, False)
		RPi.GPIO.output(LED_E, True)
		RPi.GPIO.output(LED_F, False)
		RPi.GPIO.output(LED_G, False)
		RPi.GPIO.output(LED_DP, not showDotPoint)
	
	if (no == 1) :
		RPi.GPIO.output(DIGIT1, True)
	elif (no == 2) :
		RPi.GPIO.output(DIGIT2, True)
	elif (no == 3) :
		RPi.GPIO.output(DIGIT3, True)
	elif (no == 4) :
		RPi.GPIO.output(DIGIT4, True)


def getTemperature_humidity():
        data = []                                                                                                                   
        j = 0 

        time.sleep(1)

        RPi.GPIO.setup(PIN_DATA, RPi.GPIO.OUT)
        RPi.GPIO.output(PIN_DATA, RPi.GPIO.LOW)
        time.sleep(0.02)
        RPi.GPIO.output(PIN_DATA, RPi.GPIO.HIGH)

        RPi.GPIO.setup(PIN_DATA,RPi.GPIO.IN)

        while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.LOW:
                continue

        while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.HIGH:
                continue

        while j < 40: 
                k = 0 
                while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.LOW:
                    continue

                while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.HIGH:
                    k += 1
                    if k > 100:
                        break

                if k < 8:
                    data.append(0)
                else:
                    data.append(1)
                j += 1

        print "sensor is work"
        print data

        humidity_bit = data[0:8]
        humidity_point_bit = data[8:16]
        temperature_bit = data[16:24]
        temperature_point_bit = data[24:32]
        check_bit = data [32:40]

        humidity = 0
        humidity_point = 0
        temperature = 0
        temperature_point = 0
        check = 0

        for i in range(8):
                humidity += humidity_bit[i] * 2 ** (7 - i)
                humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
                temperature += temperature_bit[i] * 2 ** (7 - i)
                temperature_point += temperature_point_bit[i] * 2 ** (7-i)
                check += check_bit[i] * 2 ** (7 - i)
        tmp = humidity + humidity_point + temperature + temperature_point

        if check == tmp:
                print "temperature :",temperature,",humidity: ", humidity
        else:
                print "wrong"
                print "temperature :",temperature,",humidity: ", humidity,",check: ", check,",tmp:",tmp
        return (temperature,humidity)

try:
	t=0.003
        count = 0
        status = 0
	while True:

                if (RPi.GPIO.input(btn) == 1):
                        status = 0

                if (RPi.GPIO.input(btn) == 0 and status == 0):
                        status =1
                        count += 1
                        count %= 3
                        #time.sleep(0.3)
		        RPi.GPIO.output(DIGIT1, False)
		        RPi.GPIO.output(DIGIT2, False)
		        RPi.GPIO.output(DIGIT3, False)
		        RPi.GPIO.output(DIGIT4, False)
                        print "count =", count

                if (count == 0):
			time.sleep(t)
			showDigit(1, int(time.strftime("%M",time.localtime(time.time()))) / 10, False)
			time.sleep(t)
			showDigit(2, int(time.strftime("%M",time.localtime(time.time()))) % 10, True)
			time.sleep(t)
			showDigit(3, int(time.strftime("%S",time.localtime(time.time()))) / 10, False)
			time.sleep(t)
			showDigit(4, int(time.strftime("%S",time.localtime(time.time()))) % 10, False)
                elif (count == 1):
			time.sleep(t)
			showDigit(1, int(time.strftime("%m",time.localtime(time.time()))) / 10, False)
			time.sleep(t)
			showDigit(2, int(time.strftime("%m",time.localtime(time.time()))) % 10, True)
			time.sleep(t)
			showDigit(3, int(time.strftime("%d",time.localtime(time.time()))) / 10, False)
			time.sleep(t)
			showDigit(4, int(time.strftime("%d",time.localtime(time.time()))) % 10, False)
                elif (count == 2):
                        T,H = getTemperature_humidity()

			time.sleep(t)
			showDigit(1, T / 10, False)
			time.sleep(t)
			showDigit(2, T % 10, True)
			time.sleep(t)
			showDigit(3, H / 10, False)
			time.sleep(t)
			showDigit(4, H % 10, False)
                        print "ok"
			
except KeyboardInterrupt:
	pass

### 清理GPIO口
RPi.GPIO.cleanup()


****************************************************************************************

实际显示图片如下,还是


   




  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 点亮一位LED数码管需要以下条件: 1. 一个LED数码管模块; 2. 一个单片机或者其他控制器,如Arduino、Raspberry Pi等; 3. 一个电源,可以是电池或者其他外部电源; 4. 一些连接线或者杜邦线,将LED数码管模块与控制器连接起来; 5. 一段控制代码,用于控制LED数码管的亮灭状态。 ### 回答2: 为点亮一位LED数码管,必须具备以下条件: 第一,必须有一位LED数码管来显示数字。LED数码管是一种数字显示装置,它由七个发光二极管组成,可以显示从0到9的数字。 第二,必须有一种控制信号来控制LED数码管的点亮状态。LED数码管是通过控制发光二极管的通断来实现数字的显示的。当某个发光二极管通电时,它会发出光亮;当某个发光二极管断电时,它会熄灭。因此,必须有一种控制信号来控制每个发光二极管的通断状态,从而实现数字的显示。 第三,必须有一种电源来为LED数码管供电。LED数码管需要接受电流来工作,因此必须有一种电源来为它供电。一般情况下,LED数码管的工作电压为2V-3V,因此可以使用适配器或者电池等电源来为LED数码管提供电源。 总结起来,要点亮一位LED数码管,必须有一位LED数码管、一种控制信号和一种电源。只有具备了这些条件,才能实现LED数码管的点亮,从而显示数字。 ### 回答3: 要点亮一位LED数码管,需要具备以下条件: 1. 电源供应:为了点亮LED数码管,我们需要提供适当的电源供应,通常是通过电池或者外部电源提供的直流电。这样LED数码管才能正常工作。 2. 控制电路:LED数码管需要通过一个控制电路来控制其亮灭状态。控制电路通常包括一个数字输入设备(如微控制器或开关电路)和一个电流限制电阻,用于控制LED电流大小。 3. 共阴/共阳:在选择LED数码管时,需要确定其是共阴还是共阳接口。共阴数码管(Cathode)需要将共阴脚连接到GND,而共阳数码管(Anode)需要将共阳脚连接到电源正极。不同类型的数码管需要不同的控制方式。 4. 控制信号:LED数码管可以通过不同的控制信号来控制其显示内容。这些信号可以是数字信号,例如二进制码、BCD码或者直接的数字输入。通过改变控制信号,LED数码管可以显示不同的数字或字符。 5. 电流限制:为了防止LED数码管过流烧坏,必须使用电流限制电阻来限制电流大小。通过计算电阻的阻值,可以根据数码管的额定电流来选择适当的限流电阻。 综上所述,要点亮一位LED数码管,需要提供适当的电源供应,通过一个控制电路来控制亮灭状态,确定是共阴还是共阳接口,使用适当的控制信号来显示内容,并使用电流限制电阻来保护数码管

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值