实验器材:
- 4位数码管(3461BS[共阴])
- 树莓派B
数码管基本知识:
数码管驱动方式
静态驱动。每个数码管的每个片段都有一个自己的I/O端口进行驱动。优点是亮度高,缺点时占用I/O端口多。比如要驱动4个数码管,每个数码管有8个片段,那么总共需要4*8 = 27个I/O端口。
动态驱动。每个数码管的a,b,c,d,e,f,g,dp同名片段连在一起,同时每个数码管有自己的独立的控制I/O,用于控制是否显示。比如4位数码管,总共有12个针脚。那么每个8个针脚用于控制显示片段,4个针脚用于控制每个数码管的显示。
3461BS共阴数码管,那么控制片段显示的针脚为LOW的时候,发光。但是控制端,还是必须是HIGH,对应的数码管才会显示。
如果需要每个数码管显示不同的数字,那么必须通过在1~2ms内反复刷新数码。
树莓派GPIO的连接方式:
4位数码管引脚图:
http://c.hiphotos.baidu.com/zhidao/pic/item/a2cc7cd98d1001e9a348c00fb80e7bec54e797be.jpg
将数码管和GPIO连接起来,然后对数码管每个片段进行编码
按照 hgfedcba的顺序对每个数码管编码
0的二进制代码为
h g f e d c b a
1 1 0 0 0 0 0 0 转换成16进制为0xc0
segCode = [0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90] #0~9
完整代码
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
BIT0 = 24 #数码管1
BIT1 = 5#数码管2
BIT2 = 6#数码管3
BIT3 = 26#数码管4
segCode = [0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90] #0~9
pins = [19,22,12,20,21,13,25,16,26,6,5,24]
bits = [BIT0, BIT1, BIT2, BIT3]
def print_msg():
print 'Program is running...'
print 'Please press Ctrl+C end the program...'
def digitalWriteByte(val):
GPIO.output(19, val & (0x01 << 0))
GPIO.output(22, val & (0x01 << 1))
GPIO.output(12, val & (0x01 << 2))
GPIO.output(20, val & (0x01 << 3))
GPIO.output(21, val & (0x01 << 4))
GPIO.output(13, val & (0x01 << 5))
GPIO.output(25, val & (0x01 << 6))
GPIO.output(16, val & (0x01 << 7))
def display_1():
show()
for i in range(10):
digitalWriteByte(segCode[i])
time.sleep(0.2)
hide()
def hide():
GPIO.output(BIT0, GPIO.LOW)
GPIO.output(BIT1, GPIO.LOW)
GPIO.output(BIT2, GPIO.LOW)
GPIO.output(BIT3, GPIO.LOW)
def show():
GPIO.output(BIT0, GPIO.HIGH)
GPIO.output(BIT1, GPIO.HIGH)
GPIO.output(BIT2, GPIO.HIGH)
GPIO.output(BIT3, GPIO.HIGH)
def showNum(bit,num):
hide()
GPIO.output(bits[bit], GPIO.HIGH)
digitalWriteByte(segCode[num])
time.sleep(0.005)
def display_3(num):
b0 = num % 10
b1 = num % 100 / 10
b2 = num % 1000 / 100
b3 = num / 1000
if num < 10:
showNum(0,b0)
elif num >= 10 and num < 100:
showNum(0,b0)
showNum(1,b1)
elif num >= 100 and num < 1000:
showNum(0,b0)
showNum(1,b1)
showNum(2,b2)
elif num >= 1000 and num < 10000:
showNum(0,b0)
showNum(1,b1)
showNum(2,b2)
showNum(3,b3)
else:
print 'Out of range, num should be 0~9999 !'
def setup():
#GPIO.setmode(GPIO.BOARD) #Number GPIOs by its physical location
GPIO.setmode(GPIO.BCM)
for pin in pins:
GPIO.setup(pin, GPIO.OUT) #set all pins' mode is output
GPIO.output(pin, GPIO.HIGH) #set all pins are high level(3.3V)
def loop():
while True:
print_msg()
display_1()
time.sleep(1)
tmp = int(raw_input('Please input a num(0~9999):'))
for i in range(500):
display_3(tmp)
time.sleep(1)
def destroy(): #When program ending, the function is executed.
for pin in pins:
GPIO.output(pin, GPIO.LOW) #set all pins are low level(0V)
GPIO.setup(pin, GPIO.IN) #set all pins' mode is input
if __name__ == '__main__': #Program starting from here
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
以上代码参照
http://blog.csdn.net/jcdjx/article/details/41347059?utm_source=tuicool