TA的每日心情 | 开心 2016-8-15 09:30 |
---|
签到天数: 162 天 连续签到: 1 天 [LV.7]常住居民III
|
数码管的显示分为静态和动态两种。静态就是一个GPIO控制一个LED小灯管。
但是随着控制数码管数量的增加,GPIO口就占用太多了,所以多个数码管可以有 共阴 和 共阳 两种共享引脚。这个时候如果采用静态点亮数码管的方式,共享引脚的数码管显示完全一样。所谓动态方式,就是通过GPIO选择引脚,选择要点亮的某个数码管,然后通过共享引脚点亮LED小灯管。然后快速切换点亮其他数码管,由于点亮的切换频率非常快所以感觉上数码管一直亮着。
当然也可以使用辅助芯片,如MAX7129等,只需要用更加简化的方式控制显示数据。
点击查看详细文档。
这里我使用树莓派自己编码,动态刷新各个数码管。买的数码管有24位引脚,37个led小灯,这个掩饰只使用了4 × 7 = 28 个led灯。
代码:- 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()
复制代码 其中灯管编号,引脚对应关系可以根据自己的连线方式自定义和修改:- #
- # __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] #0,1,2,3~9 对应编码
复制代码 演示视频:(为了效果明显这里显示的是 分钟 和 秒)
|
|