找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 178|回复: 4
打印 上一主题 下一主题
收起左侧

单排5脚188数码管的驱动方法探讨

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 WL0123 于 2026-3-30 22:07 编辑

极简的单排5脚188数码管的驱动方法试探
在一些低档消费电子产品中常见一种单排5脚188和单排6脚1888数码管。由于这种数码管内部结构异于常见的数码管。商家提供的内部LED与引脚关系图看上去也感觉杂乱无章。仔细研究一番其实就是一种矩阵连接关系,以单排5脚188为例,将原图重新排列一下就可以明显看出来就是一种共阴关系。一次最多可以点亮4个笔段。如果单片机引脚直接连接数码管有过流损坏单片机端口的风险,如果数码管每个脚接限流电阻,由于需要点亮的笔段不确定,随亮点多少不同亮度会不均匀,为此利用新型单片机端口的高阻模式和内置上拉电阻,按需要点亮的笔段使能上拉电阻提供驱动电流。作为当前用作共阴的端口设准双向模式低电平,不论需要点亮的笔段多少,各笔段亮度一致。5脚188数码管共16个笔段,需要分4次才能完成全部笔段扫描。由此制作一个表格,将8位标准段码拆解为5位驱动码。实践证明:数码管亮度能够满足大多数应用场景,并且无鬼影。还有其他更简洁的驱动方式,欢迎坛友探讨。




  1. //5脚188数码管驱动程序示例
  2. //使用STC8H1K08单片机
  3. #include <STC8H.H>
  4. #include <intrins.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. uchar code table[]={       //数码管段码0~f
  8. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  10. uint count;                //计数
  11. uchar num;                 //计数
  12. uchar w1,w2,w3;            //数码管位
  13. bit flag;                  //中断标志

  14. void Timer0_Init();        //初始化定时器0
  15. void display();                                //显示函数

  16. //主函数
  17. void main()
  18. {//端口模式初始化       
  19.         P1M0 = 0x00;P1M1 = 0x00;//准双向
  20.         P3M0 = 0x00;P3M1 = 0x00;//准双向
  21.         P5M0 = 0x00;P5M1 = 0x00;//准双向
  22.         P_SW2 |= 0x80;          //打开扩展存储器
  23.         Timer0_Init();          //初始化定时器0
  24.         while(1)
  25.         {
  26.                 if(flag)
  27.                 {
  28.                         flag=0;           //周期5ms
  29.                         display();        //显示函数
  30.                         if(++count>=100)  //0.5s
  31.                         {
  32.                                 count=0;
  33.                                 if(++num>188)num=0;
  34.                                 if(num>=100)w1=table[1];
  35.                                 else w1=0x00;
  36.                                 w2=table[num/10%10];
  37.                                 w3=table[num%10];
  38.                         }
  39.                 }
  40.         }
  41. }

  42. void Timer0_Isr(void) interrupt 1
  43. {
  44.         flag=1;
  45. }

  46. void Timer0_Init(void)                //5毫秒@11.0592MHz
  47. {
  48.         AUXR |= 0x80;           //定时器时钟1T模式
  49.         TMOD &= 0xF0;           //设置定时器模式
  50.         TL0 = 0x00;             //设置定时初始值
  51.         TH0 = 0x28;             //设置定时初始值
  52.         TF0 = 0;                //清除TF0标志
  53.         TR0 = 1;                //定时器0开始计时
  54.         ET0 = 1;                //使能定时器0中断
  55.         EA  = 1;                //使能总中断
  56. }

  57. //数码管显示函数
  58. void display()
  59. {
  60.         static uchar i=0;       
  61.         uchar a[4];
  62.         switch(i)
  63.         {/******************5位***********4位**********3位**********2位**********1位***********/
  64.                 case 0: a[0]=(w3>>2&0x10)|(w3>>2&0x08)|(w3>>1&0x04)|(w3<<0&0x02)|(0 /*COM1*/); break;
  65.                 case 1: a[1]=(w2>>0&0x10)|(w2<<0&0x08)|(w2<<1&0x04)|(0 /*COM2*/)|(w3>>0&0x01); break;
  66.                 case 2: a[2]=(w2>>1&0x10)|(w2<<1&0x08)|(0 /*COM3*/)|(w2<<1&0x02)|(w3>>2&0x01); break;
  67.                 case 3: a[3]=(w2>>2&0x10)|(0 /*COM4*/)|(w1<<1&0x04)|(w1>>1&0x02)|(w3>>4&0x01); break;
  68.         }
  69.         P1M1=~(0x01<<i)&0x1f;   //P1.0~1.3轮流高阻转准双向
  70.         P1PU=a[i];              //按位使能上拉电阻提供高电平驱动电流,代替端口寄存器高电平
  71.         P1=a[i];                //按COM位提供低电平共地驱动电流,其它位为高阻模式,高低电平无关
  72.         i=++i%4;                //循环计数
  73. }

复制代码







评分

参与人数 3黑币 +33 收起 理由
wjhhhhh + 11 赞一个!
zouyiling + 12 共享资料的奖励!
szb314 + 10 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1138544 发表于 2026-3-31 16:23 | 只看该作者
这种想法我曾经也试过,但是内部上拉电阻太大(30~50kΩ),提供的电流太小了,灯非常暗,我用的是应广的pfs123。
您这个灯的亮度看起来还挺高,难道这个芯片的内部上拉电阻很小?
回复

使用道具 举报

板凳
ID:1091094 发表于 2026-3-31 23:31 | 只看该作者
我最近也在琢磨这个,看见人家的产品的九齐单片机没有高阻态,不知道怎么实现的
回复

使用道具 举报

地板
ID:1133081 发表于 2026-4-1 07:00 | 只看该作者
本帖最后由 WL0123 于 2026-4-1 07:21 编辑
jessie_Leung 发表于 2026-3-31 16:23
这种想法我曾经也试过,但是内部上拉电阻太大(30~50kΩ),提供的电流太小了,灯非常暗,我用的是应广的pfs1 ...

如果内部上拉电阻30~50kΩ,那就是准双向模式的配置。STC8H1K08内部是另外添加的约4K上拉电阻。此例显示亮度是VCC=4.8V条件,3.3V条件未试。


回复

使用道具 举报

5#
ID:1138544 发表于 2026-4-1 15:32 | 只看该作者
WL0123 发表于 2026-4-1 07:00
如果内部上拉电阻30~50kΩ,那就是准双向模式的配置。STC8H1K08内部是另外添加的约4K上拉电 ...

如果上拉电阻约为4K,靠上拉来供电,那点亮某个段的时候,通过单颗led的电流应该只在1mA的级别,这样能够让led达到很好的亮度吗? 这是我的疑惑之处
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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