数码管显示分为为静态和动态显示,静态显示这是通过GPIO口控制LED,但是随着数码管数量的增加,需要的GPIO口占用太多了,本次使用的数码管为四位一体共阴数码管,在没有使用辅助芯片(74HC595)的情况下,需要使用12个IO口进行相应的控制。
首先我们要进行硬件上的连接(在这里犯了一点点错误,想着直接GPIO.0~GPIO.7连接a~dp,GPIO.21~GPIO.24连接d1~d4):
但是发现数码管不受控制,无法进行相应的显示,后来通过逐步排查原因,发现是这些引脚已经被LVDS显示使用了,无法改变其状态值,所以不能使用其引脚进行控制,故取其他引脚进行进行使用:
通过繁琐的连线和排查,然后进行了相应的代码书写,由于没有辅助芯片的使用,故采用逐个显示的方式进行显示,通过Python自带的模块time.strftime可以显示出相应的时间,以下是百度上摘抄的部分内容:
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
借助该函数,我们可以显示出相应的内容,以下是使用该模块显示时间的实验结果:
最后把代码贴上,不够精简,请原谅:
#!usr/bin/env python
#-*-coding:utf-8 -*-
import gpio
import time
# BCM gpio编号
LED_A = 225
LED_B = 230
LED_C = 35
LED_D = 231
LED_E = 67
LED_F = 34
LED_G = 203
LED_DP = 64
DIG1 = 114
DIG2 = 65
DIG3 = 229
DIG4 = 228
#设置输出端口
gpio.setup(LED_A,'out')
gpio.setup(LED_B,'out')
gpio.setup(LED_C,'out')
gpio.setup(LED_D,'out')
gpio.setup(LED_E,'out')
gpio.setup(LED_F,'out')
gpio.setup(LED_G,'out')
gpio.setup(LED_DP,'out')
gpio.setup(DIG1,'out')
gpio.setup(DIG2,'out')
gpio.setup(DIG3,'out')
gpio.setup(DIG4,'out')
def showDigit(Bit,num):
gpio.set(DIG1, 1)
gpio.set(DIG2, 1)
gpio.set(DIG3, 1)
gpio.set(DIG4, 1)
if (num == 0) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 1)
gpio.set(LED_G, 0)
gpio.set(LED_DP,0)
elif (num == 1) :
gpio.set(LED_A, 0)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 0)
gpio.set(LED_E, 0)
gpio.set(LED_F, 0)
gpio.set(LED_G, 0)
gpio.set(LED_DP,0)
elif (num == 2) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 0)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 0)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 3) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 0)
gpio.set(LED_F, 0)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 4) :
gpio.set(LED_A, 0)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 0)
gpio.set(LED_E, 0)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 5) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 0)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 0)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 6) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 0)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 7) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 0)
gpio.set(LED_E, 0)
gpio.set(LED_F, 0)
gpio.set(LED_G, 0)
gpio.set(LED_DP,0)
elif (num == 8) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 9) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 0)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
if (Bit == 1) :
gpio.set(DIG1, 0)
elif (Bit == 2) :
gpio.set(DIG2, 0)
elif (Bit == 3) :
gpio.set(DIG3, 0)
elif (Bit == 4) :
gpio.set(DIG4, 0)
def print_message():
print 'Running ...'
print 'Please press Ctrl+C to end the running ...'
try:
t=0.005
while True:
print_message()
time.sleep(t)
showDigit(1, int(time.strftime("%H",time.localtime(time.time()))) / 10)
time.sleep(t)
showDigit(2, int(time.strftime("%H",time.localtime(time.time()))) % 10)
time.sleep(t)
showDigit(3, int(time.strftime("%M",time.localtime(time.time()))) / 10)
time.sleep(t)
showDigit(4, int(time.strftime("%M",time.localtime(time.time()))) % 10)
except KeyboardInterrupt:
pass
gpio.cleanup()
总结:安装上面的代码,我们可以在数码管 上显示出时间,但是数字会出现闪烁的情况,无论T设置多小,都会有一点点闪烁的感觉,可能是代码不够精简的缘故,或者是由于IO口电平翻转所需要时间太长的缘故,或许还是需要借助辅助芯片进行使用,既能节省IO口的使用数量,也能使得显示更加稳定。
如果以上阐述内容有什么错误,欢迎留言探讨。
数码管显示分为为静态和动态显示,静态显示这是通过GPIO口控制LED,但是随着数码管数量的增加,需要的GPIO口占用太多了,本次使用的数码管为四位一体共阴数码管,在没有使用辅助芯片(74HC595)的情况下,需要使用12个IO口进行相应的控制。
首先我们要进行硬件上的连接(在这里犯了一点点错误,想着直接GPIO.0~GPIO.7连接a~dp,GPIO.21~GPIO.24连接d1~d4):
但是发现数码管不受控制,无法进行相应的显示,后来通过逐步排查原因,发现是这些引脚已经被LVDS显示使用了,无法改变其状态值,所以不能使用其引脚进行控制,故取其他引脚进行进行使用:
通过繁琐的连线和排查,然后进行了相应的代码书写,由于没有辅助芯片的使用,故采用逐个显示的方式进行显示,通过Python自带的模块time.strftime可以显示出相应的时间,以下是百度上摘抄的部分内容:
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
借助该函数,我们可以显示出相应的内容,以下是使用该模块显示时间的实验结果:
最后把代码贴上,不够精简,请原谅:
#!usr/bin/env python
#-*-coding:utf-8 -*-
import gpio
import time
# BCM gpio编号
LED_A = 225
LED_B = 230
LED_C = 35
LED_D = 231
LED_E = 67
LED_F = 34
LED_G = 203
LED_DP = 64
DIG1 = 114
DIG2 = 65
DIG3 = 229
DIG4 = 228
#设置输出端口
gpio.setup(LED_A,'out')
gpio.setup(LED_B,'out')
gpio.setup(LED_C,'out')
gpio.setup(LED_D,'out')
gpio.setup(LED_E,'out')
gpio.setup(LED_F,'out')
gpio.setup(LED_G,'out')
gpio.setup(LED_DP,'out')
gpio.setup(DIG1,'out')
gpio.setup(DIG2,'out')
gpio.setup(DIG3,'out')
gpio.setup(DIG4,'out')
def showDigit(Bit,num):
gpio.set(DIG1, 1)
gpio.set(DIG2, 1)
gpio.set(DIG3, 1)
gpio.set(DIG4, 1)
if (num == 0) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 1)
gpio.set(LED_G, 0)
gpio.set(LED_DP,0)
elif (num == 1) :
gpio.set(LED_A, 0)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 0)
gpio.set(LED_E, 0)
gpio.set(LED_F, 0)
gpio.set(LED_G, 0)
gpio.set(LED_DP,0)
elif (num == 2) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 0)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 0)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 3) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 0)
gpio.set(LED_F, 0)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 4) :
gpio.set(LED_A, 0)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 0)
gpio.set(LED_E, 0)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 5) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 0)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 0)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 6) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 0)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 7) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 0)
gpio.set(LED_E, 0)
gpio.set(LED_F, 0)
gpio.set(LED_G, 0)
gpio.set(LED_DP,0)
elif (num == 8) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 1)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
elif (num == 9) :
gpio.set(LED_A, 1)
gpio.set(LED_B, 1)
gpio.set(LED_C, 1)
gpio.set(LED_D, 1)
gpio.set(LED_E, 0)
gpio.set(LED_F, 1)
gpio.set(LED_G, 1)
gpio.set(LED_DP,0)
if (Bit == 1) :
gpio.set(DIG1, 0)
elif (Bit == 2) :
gpio.set(DIG2, 0)
elif (Bit == 3) :
gpio.set(DIG3, 0)
elif (Bit == 4) :
gpio.set(DIG4, 0)
def print_message():
print 'Running ...'
print 'Please press Ctrl+C to end the running ...'
try:
t=0.005
while True:
print_message()
time.sleep(t)
showDigit(1, int(time.strftime("%H",time.localtime(time.time()))) / 10)
time.sleep(t)
showDigit(2, int(time.strftime("%H",time.localtime(time.time()))) % 10)
time.sleep(t)
showDigit(3, int(time.strftime("%M",time.localtime(time.time()))) / 10)
time.sleep(t)
showDigit(4, int(time.strftime("%M",time.localtime(time.time()))) % 10)
except KeyboardInterrupt:
pass
gpio.cleanup()
总结:安装上面的代码,我们可以在数码管 上显示出时间,但是数字会出现闪烁的情况,无论T设置多小,都会有一点点闪烁的感觉,可能是代码不够精简的缘故,或者是由于IO口电平翻转所需要时间太长的缘故,或许还是需要借助辅助芯片进行使用,既能节省IO口的使用数量,也能使得显示更加稳定。
如果以上阐述内容有什么错误,欢迎留言探讨。