3回答

0收藏

树莓派驱动4位数码管显示时间

Raspberry Pi Raspberry Pi 8114 人阅读 | 3 人回复 | 2014-11-07


数码管的显示分为静态和动态两种。静态就是一个GPIO控制一个LED小灯管。
但是随着控制数码管数量的增加,GPIO口就占用太多了,所以多个数码管可以有 共阴 和 共阳 两种共享引脚。这个时候如果采用静态点亮数码管的方式,共享引脚的数码管显示完全一样。所谓动态方式,就是通过GPIO选择引脚,选择要点亮的某个数码管,然后通过共享引脚点亮LED小灯管。然后快速切换点亮其他数码管,由于点亮的切换频率非常快所以感觉上数码管一直亮着。

当然也可以使用辅助芯片,如MAX7129等,只需要用更加简化的方式控制显示数据。
点击查看详细文档。

这里我使用树莓派自己编码,动态刷新各个数码管。买的数码管有24位引脚,37个led小灯,这个掩饰只使用了4 × 7 = 28 个led灯。
代码:
  1. import RPi.GPIO as GPIO
  2. import time, random

  3. """
  4. Display date to LED lights
  5. There are four lights, it displays 4 number
  6. """

  7. GPIO.setwarnings(False)
  8. GPIO.setmode(GPIO.BCM)


  9. def setp(n, status='on'):
  10.     if status == 'on':
  11.         GPIO.output(n, GPIO.HIGH)
  12.     else:
  13.         GPIO.output(n, GPIO.LOW)

  14. for i in pins + sels:
  15.     GPIO.setup(i, GPIO.OUT)
  16.     setp(i, 'off')

  17. for i in sels:
  18.     setp(i, 'on')

  19. #
  20. #     __2_
  21. #    |     |    |  0 ->  011 1111 -> 0x3f
  22. #  1 |     | 3  |  1 ->  010 0001 -> 0x21
  23. #    |__7__|    |  2 ->  111 0110 -> 0x76
  24. #    |     |    |  4 ->  ...
  25. #  6 |     | 4  |        ...
  26. #    |__5__|    |  9 ->  ...      -> 0x5f
  27. #

  28. pins = [27, 17, 22, 10, 25, 24, 11] #GPIO ports
  29. sels = [14, 15, 18, 23] #GPIO ports to select led, there are four led lights
  30. nums = [0x3f, 0x21, 0x76, 0x5e, 0x4d, 0x5b, 0x7b, 0x0e, 0x7f, 0x5f]

  31. def flush(sel, n):
  32.     setp(sels[sel], 'off')
  33.     n = nums[n]
  34.     for i in sels:
  35.         if i != sels[sel]:
  36.             setp(i, 'on')

  37.     for i in range(7):
  38.         if (n & (1 << i)):
  39.             setp(pins[i], 'on')

  40.     for i in range(7):
  41.         if (n & (1 << i)):
  42.             setp(pins[i], 'off')

  43. try:
  44.     while True:
  45.         t = time.gmtime()
  46.         flush(3, t.tm_min / 10)
  47.         flush(2, t.tm_min % 10)
  48.         flush(1, t.tm_sec / 10)
  49.         flush(0, t.tm_sec % 10)
  50. except:
  51.     GPIO.cleanup()
复制代码
其中灯管编号,引脚对应关系可以根据自己的连线方式自定义和修改:
  1. #
  2. #     __2_
  3. #    |     |    |  0 ->  011 1111 -> 0x3f
  4. #  1 |     | 3  |  1 ->  010 0001 -> 0x21
  5. #    |__7__|    |  2 ->  111 0110 -> 0x76
  6. #    |     |    |  4 ->  ...
  7. #  6 |     | 4  |        ...
  8. #    |__5__|    |  9 ->  ...      -> 0x5f

  9. pins = [27, 17, 22, 10, 25, 24, 11] #GPIO ports
  10. sels = [14, 15, 18, 23] #GPIO ports to select led, there are four led lights
  11. nums = [0x3f, 0x21, 0x76, 0x5e, 0x4d, 0x5b, 0x7b, 0x0e, 0x7f, 0x5f] #0,1,2,3~9 对应编码
复制代码
演示视频:(为了效果明显这里显示的是 分钟 和 秒)

分享到:
回复

使用道具 举报

回答|共 3 个

倒序浏览

沙发

PokeBox

发表于 2014-11-8 03:21:27 | 只看该作者

→_→原文地址:http://shumeipai.nxez.com/2014/10/12/raspberry-pi-drive-four-digital-tube-display-time.html
表示不想吐槽……
板凳

PokeBox

发表于 2014-11-8 03:23:14 | 只看该作者

那图片明显的PS痕迹……对楼主的这种行为表示……管理员你怎么看?@EEboard爱板网
地板

expertss

发表于 2014-11-17 10:34:41 | 只看该作者

.....................................................
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条