树莓派:4B
python 3.7
网上有很多种对于数码管的驱动程序,这种代码是我能找到最简洁的。
老练的代码就意味着不好懂,所以我做了详尽的注释。
在前辈的代码基础上做了修改,原始程序调试过程中有很多bug,无法直接使用。
源代码地址:树莓派驱动4位数码管显示时间 | 树莓派实验室 (nxez.com)
1.接线
2.代码
import RPi.GPIO as GPIO
import time, random
"""
Display date to LED lights
There are four lights, it displays 4 number
共阳极
"""
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) #采用BCM模式
pins = [26, 19, 13, 6, 5, 11, 9,10] #GPIO ports 数码管单段对应的GPIO针脚号
sels = [21, 20, 16, 12] #GPIO ports to select led, there are four led lights数码管4个位
nums = [0x3f, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7d, 0x07, 0x7f, 0x6f,0x80] #数字0~9对应的16进制,参照excel表格
#指定N脚状态,高或者低
def setp(n, status='on'):
if status == 'on':
GPIO.output(n, GPIO.HIGH)
else:
GPIO.output(n, GPIO.LOW)
#初始化引脚,所有置high
for i in pins + sels:
GPIO.setup(i, GPIO.OUT) #设置所有相关引脚都为输出引脚
setp(i, 'on')
#初始化引脚,所有位置low 关闭所有显示
for i in sels:
setp(i, 'off')
#
# __A_
# | | | 0 -> 011 1111 -> 0x3f
# F | | B | 1 -> 010 0001 -> 0x21
# |__G__| | 2 -> 111 0110 -> 0x76
# | | | 4 -> ...
# E | | C | ...
# |__D__| DP | 9 -> ... -> 0x5f
#刷新数码管
def flush(sel, n):
setp(sels[sel], 'on')
n = int(n)
n = nums[n]
for i in sels:
if i != sels[sel]: #若非选定位,全部置低熄灭
setp(i, 'off')
#点亮数字
for i in range(7):
if (n & (1 << i)):
setp(pins[i], 'off')
# time.sleep(0.5)
#熄灭数字,为显示下一个做准备
for i in range(7):
if (n & (1 << i)):
setp(pins[i], 'on')
try:
while True:
t = time.gmtime() #获取当前时间
# print("%d : %d" % (t.tm_min ,t.tm_sec))
flush(3, t.tm_min / 10) #分的十位
flush(2, t.tm_min % 10) #分的个位
flush(1, t.tm_sec / 10) #秒的十位
flush(0, t.tm_sec % 10) #秒的个位
except:
GPIO.cleanup()
如果要显示其他的字符,往表格中填入。excel表格放不了,就把公式贴进来。
显示 | DP | G | F | E | D | C | B | A | 二进制 | 十六进制 |
0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 00111111 | 3F |
1 | 0 | 0 | 0 | 0 | 0 | 1 | <