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

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:529
  • 最近打卡:2025-05-18 04:17:27

24

主题

522

回帖

1064

积分

荣誉版主

积分
1064
发表于 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,可以轻松应对米字形数码管

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





回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-05-17 08:57:22

33

主题

2380

回帖

4958

积分

论坛元老

积分
4958
发表于 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
这些宏定义就可以了。

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

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-05-18 08:51:13

723

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-05-18 05:51:31
已绑定手机

1

主题

836

回帖

1565

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:403
  • 最近打卡:2025-05-18 12:15:44

0

主题

336

回帖

1542

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-05-18 01:40:57

24

主题

108

回帖

186

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-18 09:56:24
已绑定手机

77

主题

4946

回帖

8670

积分

超级版主

DebugLab

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-18 09:56:24
已绑定手机

77

主题

4946

回帖

8670

积分

超级版主

DebugLab

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-18 14:59 , Processed in 0.120255 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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