查看: 7714|回复: 3

[项目] 树莓派驱动4位数码管显示时间

[复制链接]
  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-11-7 13:43:46 | 显示全部楼层 |阅读模式
    分享到:
    20141012215423910-0.jpg
    数码管的显示分为静态和动态两种。静态就是一个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 对应编码
    复制代码
    演示视频:(为了效果明显这里显示的是 分钟 和 秒)

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-6-25 09:54
  • 签到天数: 216 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-11-8 03:21:27 | 显示全部楼层
    →_→原文地址:http://shumeipai.nxez.com/2014/10/12/raspberry-pi-drive-four-digital-tube-display-time.html
    表示不想吐槽……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-6-25 09:54
  • 签到天数: 216 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-11-8 03:23:14 | 显示全部楼层
    那图片明显的PS痕迹……对楼主的这种行为表示……管理员你怎么看?@EEboard爱板网
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-7-21 12:58
  • 签到天数: 907 天

    连续签到: 2 天

    [LV.10]以坛为家III

    发表于 2014-11-17 10:34:41 | 显示全部楼层
    .....................................................
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 15:12 , Processed in 0.146737 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.