数码管的显示分为静态和动态两种。静态就是一个GPIO控制一个LED小灯管。
但是随着控制数码管数量的增加,GPIO口就占用太多了,所以多个数码管可以有 共阴 和 共阳 两种共享引脚。这个时候如果采用静态点亮数码管的方式,共享引脚的数码管显示完全一样。所谓动态方式,就是通过GPIO选择引脚,选择要点亮的某个数码管,然后通过共享引脚点亮LED小灯管。然后快速切换点亮其他数码管,由于点亮的切换频率非常快所以感觉上数码管一直亮着。
当然也可以使用辅助芯片,如MAX7129等,只需要用更加简化的方式控制显示数据。
点击查看详细文档。
这里我使用树莓派自己编码,动态刷新各个数码管。买的数码管有24位引脚,37个led小灯,这个掩饰只使用了4 × 7 = 28 个led灯。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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) def setp(n, status = 'on' ): if status = = 'on' : GPIO.output(n, GPIO.HIGH) else : GPIO.output(n, GPIO.LOW) for i in pins + sels: GPIO.setup(i, GPIO.OUT) setp(i, 'off' ) for i in sels: setp(i, 'on' ) # # __2_ # | | | 0 -> 011 1111 -> 0x3f # 1 | | 3 | 1 -> 010 0001 -> 0x21 # |__7__| | 2 -> 111 0110 -> 0x76 # | | | 4 -> ... # 6 | | 4 | ... # |__5__| | 9 -> ... -> 0x5f # pins = [ 27 , 17 , 22 , 10 , 25 , 24 , 11 ] #GPIO ports sels = [ 14 , 15 , 18 , 23 ] #GPIO ports to select led, there are four led lights nums = [ 0x3f , 0x21 , 0x76 , 0x5e , 0x4d , 0x5b , 0x7b , 0x0e , 0x7f , 0x5f ] def flush(sel, n): setp(sels[sel], 'off' ) n = nums[n] for i in sels: if i ! = sels[sel]: setp(i, 'on' ) for i in range ( 7 ): if (n & ( 1 << i)): setp(pins[i], 'on' ) for i in range ( 7 ): if (n & ( 1 << i)): setp(pins[i], 'off' ) try : while True : t = time.gmtime() 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() |
其中灯管编号,引脚对应关系可以根据自己的连线方式自定义和修改:
1
2
3
4
5
6
7
8
|
# # __2_ # | | | 0 -> 011 1111 -> 0x3f # 1 | | 3 | 1 -> 010 0001 -> 0x21 # |__7__| | 2 -> 111 0110 -> 0x76 # | | | 4 -> ... # 6 | | 4 | ... # |__5__| | 9 -> ... -> 0x5f |
1
2
3
|
pins = [ 27 , 17 , 22 , 10 , 25 , 24 , 11 ] #GPIO ports sels = [ 14 , 15 , 18 , 23 ] #GPIO ports to select led, there are four led lights nums = [ 0x3f , 0x21 , 0x76 , 0x5e , 0x4d , 0x5b , 0x7b , 0x0e , 0x7f , 0x5f ] #0,1,2,3~9 对应编码 |
演示视频:(为了效果明显这里显示的是 分钟 和 秒)
未经允许不得转载:网购经验网 » 树莓派驱动4位数码管显示时间
评论前必须登录!
登陆 注册