关于这个四位数码管:


       这个器件是和树莓派主板一起买的,节约了邮费,这个数码管一个有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()


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

实际显示图片如下,还是


   




Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐