找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单排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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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