找回密码
 立即注册
查看: 323|回复: 7

推荐使用宏定义实现数码管显示数组

[复制链接]
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 170 天

    [LV.7]常住居民III

    17

    主题

    371

    回帖

    1355

    积分

    荣誉版主

    积分
    1355
    发表于 2024-1-11 13:59:12 | 显示全部楼层 |阅读模式



    在STC提供的例程中有:
    u8 code t_display[]={                       //标准字库
    //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
    //black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
        0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
        0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

    u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码

    很多新手对上面数组中的数字不太理解,使用宏定义实现数码管显示数组,就很好理解了。

       a
      ---
    f| g |b   
      ---
    e|   |c   
      ---   .h
       d

    #define Sega    0x01        //Q0
    #define Segb    0x02        //Q1
    #define Segc    0x04        //Q2
    #define Segd    0x08        //Q3
    #define Sege    0x10        //Q4
    #define Segf    0x20        //Q5
    #define Segg    0x40        //Q6
    #define Segh    0x80        //Q7

    //共阳LED
    #define Num0    ~(Sega + Segb + Segc + Segd + Sege + Segf       )
    #define Num1    ~(           Segb + Segc                        )
    #define Num2    ~(Sega + Segb + Segd + Sege + Segg              )
    #define Num3    ~(Sega + Segb + Segc + Segd               + Segg)
    #define Num4    ~(       Segb + Segc               + Segf + Segg)
    #define Num5    ~(Sega        + Segc + Segd        + Segf + Segg)
    #define Num6    ~(Sega        + Segc + Segd + Sege + Segf + Segg)
    #define Num7    ~(Sega + Segb + Segc                            )
    #define Num8    ~(Sega + Segb + Segc + Segd + Sege + Segf + Segg)
    #define Num9    ~(Sega + Segb + Segc + Segd        + Segf + Segg)
    #define Numblk  ~(0                                             )
    #define Numfull ~(Sega + Segb + Segc + Segd + Sege + Segf + Segg + Segh)
    #define Num_    ~(                                          Segg) //负号

    /*
    //共阴LED
    #define Num0     (Sega + Segb + Segc + Segd + Sege + Segf       )
    #define Num1     (           Segb + Segc                        )
    #define Num2     (Sega + Segb + Segd + Sege + Segg              )
    #define Num3     (Sega + Segb + Segc + Segd               + Segg)
    #define Num4     (       Segb + Segc               + Segf + Segg)
    #define Num5     (Sega        + Segc + Segd        + Segf + Segg)
    #define Num6     (Sega        + Segc + Segd + Sege + Segf + Segg)
    #define Num7     (Sega + Segb + Segc                            )
    #define Num8     (Sega + Segb + Segc + Segd + Sege + Segf + Segg)
    #define Num9     (Sega + Segb + Segc + Segd        + Segf + Segg)
    #define Numblk   (0                                             )
    #define Numfull  (Sega + Segb + Segc + Segd + Sege + Segf + Segg + Segh)
    #define Num_     (                                          Segg) //负号
    */

    则数组定义:
    //段码
    u8 code Seg8_code[13] =
    {
            Num0 ,Num1 ,Num2 ,Num3 ,Num4 ,Num5 ,Num6 ,Num7 ,Num8 ,Num9,
            Numfull,Numblk,Num_
    };



    使用宏定义的好处:
    1,方便PCB绘制,不必一定要Q0--A,Q1--B,Q2--C,Q3--D,Q4--D,Q5--E,Q6--F,Q7--H
      例如,实际联线是:Q0--A,Q1--B,Q2--C,Q3--D,Q4--G,Q5--H,Q6--E,Q7--F

    //Q0--A,Q1--B,Q2--C,Q3--D,Q4--G,Q5--H,Q6--E,Q7--F
    #define Sega        0x01        //Q0
    #define Segb        0x02        //Q1
    #define Segc        0x04        //Q2
    #define Segd        0x08        //Q3
    #define Sege        0x40        //Q6
    #define Segf        0x80        //Q7
    #define Segg        0x10        //Q4
    #define Segh        0x20        //Q5

    同样,对HC595用到的位选码的联线也可以自由连接。

    2,可以方便增加定义要显示的内容。

    3,可以轻松应对米字形数码管

    这个方法无论从代码可读性,扩展性,维护难易程度来说,都很理想。





    回复 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    昨天 09:49
  • 签到天数: 141 天

    [LV.7]常住居民III

    20

    主题

    1078

    回帖

    2565

    积分

    金牌会员

    积分
    2565
    发表于 2024-1-11 14:12:03 | 显示全部楼层
    是的,,而且就算是换了硬件接法 也只需要维护最底层的
    #define Sega    0x01        //Q0
    #define Segb    0x02        //Q1
    #define Segc    0x04        //Q2
    #define Segd    0x08        //Q3
    #define Sege    0x10        //Q4
    #define Segf    0x20        //Q5
    #define Segg    0x40        //Q6
    #define Segh    0x80        //Q7
    这些宏定义就可以了。

    之前做过一个用到段码屏的项目,就是这么玩得。
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9441

    回帖

    1万

    积分

    管理员

    积分
    13983
    发表于 2024-1-11 16:50:26 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:02
  • 签到天数: 153 天

    [LV.7]常住居民III

    0

    主题

    398

    回帖

    456

    积分

    中级会员

    积分
    456
    发表于 2024-3-30 10:58:24 | 显示全部楼层
    学习
    靡不有初,鲜克有终
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 71 天

    [LV.6]常住居民II

    0

    主题

    205

    回帖

    456

    积分

    中级会员

    积分
    456
    发表于 2024-3-30 13:06:56 | 显示全部楼层
    程序写规范了就是方便移植
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    7 小时前
  • 签到天数: 102 天

    [LV.6]常住居民II

    11

    主题

    69

    回帖

    235

    积分

    中级会员

    积分
    235
    发表于 2024-3-31 08:40:29 | 显示全部楼层
    学习了,感觉真不错
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 115 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1049

    积分

    荣誉版主

    Cyber Hamster

    积分
    1049
    发表于 2024-4-2 22:19:02 | 显示全部楼层
    数码管也可以不是相同接法,比如四个数码管后两个倒过来用,就是8.8:8°8,a-a-d-d这么接,就能显示秒点冒号和℃了

    点评

    而且可以使用水银开关简易实现正放时间倒放温度的功能,我做过,还加了振动开关,用外部中断,白天数码管高亮度,夜间低亮度,拍一下触发振动开关变为高亮度10s  详情 回复 发表于 2024-4-2 22:22
    (=・ω・=)
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 115 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1049

    积分

    荣誉版主

    Cyber Hamster

    积分
    1049
    发表于 2024-4-2 22:22:28 | 显示全部楼层
    DebugLab 发表于 2024-4-2 22:19
    数码管也可以不是相同接法,比如四个数码管后两个倒过来用,就是8.8:8°8,a-a-d-d这么接,就能显示秒点冒 ...

    而且可以使用水银开关简易实现正放时间倒放温度的功能,我做过,还加了振动开关,用外部中断,白天数码管高亮度,夜间低亮度,拍一下触发振动开关变为高亮度10s
    (=・ω・=)
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-16 07:23 , Processed in 0.068508 second(s), 60 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表