找回密码
 立即注册
查看: 2720|回复: 32

什么?STC硬件80mA大电流LED数码管自动刷新驱动居然可以8位亮度256种组合?怎么实现

[复制链接]
  • TA的每日心情
    开心
    昨天 21:13
  • 签到天数: 108 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1021

    积分

    荣誉版主

    Cyber Hamster

    积分
    1021
    发表于 2024-1-24 00:13:30 | 显示全部楼层 |阅读模式
    截图202402011007232094.jpg
    什么?RMB1.6 !  STC8H4K32TL-40MHz-LQFP48/32, QFN48/32
    16个触摸按键,硬件自动刷新驱动32个8段LED数码管,或16个米字形数码管
    80mA大电流硬件LED数码管自动刷新驱动器居然可以8位亮度256种组合
    怎么实现的!!!

    截图202401311551474979.jpg
    截图202402011006247495.jpg
    截图202401271130259231.jpg
    截图202401271127483781.jpg
    ↑ ↑ ↑ 首先起一个比较吸引人的题目 ↑ ↑ ↑
    这是之前的帖子:
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6257
    然后是正文:
    因为我要用电位器调米字数码管的亮度,但是STC8H4K64TL只支持3位亮度,调起来一级一级的蹦看起来很明显,一点也不丝滑,想了很多办法都不能很优雅的解决这个问题,后来过了几天灵机一动就解决了,在此我把这个方法命名为STC8H4K64TL的“硬3软580mA大电流硬件LED驱动器亮度调节方法,不废话了,具体看程序,无关代码已删除,关键代码都写了备注。

    程序:


    unsigned char                SEG_Bri;        //8bit亮度,范围0~251

    void PWM_Func(void)
    {
            SEG_Bri=(unsigned char)((pow((float)Filter_Value,2.2F))/351204.0F);        //Gamma校正,输入Filter_Value,范围0~4095,输出SEG_Bri,范围0~251
    }

    void SEG_Func(unsigned char temp)        //输入temp,范围0~8,对应亮度0%、12.5%、25%、37.5%、50%、62.5%、75%、87.5%、100%
    {
            if(temp>8)                                                //无效数据限幅
            {
                    temp=8;
            }
            if(temp)                                                //大于0亮
            {
                    LEDCTRL=7-(temp-1)|0x90;        //计算LEDCTRL
                    COMEN=0x1F;                                        //开COM
                    SEGENL=0xFF;                                //开SEG
                    SEGENH=0x3F;                                //开SEG
            }
            else                                                        //否则灭
            {
                    COMEN=0x00;                                        //关COM
                    SEGENL=0x00;                                //关SEG(不关低亮度有鬼影,仅在硬件亮度频繁在0和1之间切换时有)
                    SEGENH=0x00;                                //关SEG(不关低亮度有鬼影,
    仅在硬件亮度频繁在0和1之间切换时有
                    LEDCTRL=0x97;                                //无法关闭,只能设置为最低亮度
            }
            COM0_DA_L=(unsigned char)SEG_Buf[SEG_Addr];
            COM0_DA_H=(unsigned char)(SEG_Buf[SEG_Addr]>>8)&0x3F;
            COM1_DA_L=(unsigned char)SEG_Buf[SEG_Addr+1];
            COM1_DA_H=(unsigned char)(SEG_Buf[SEG_Addr+1]>>8)&0x3F;
            COM2_DA_L=(unsigned char)SEG_Buf[SEG_Addr+2];
            COM2_DA_H=(unsigned char)(SEG_Buf[SEG_Addr+2]>>8)&0x3F;
            COM3_DA_L=(unsigned char)SEG_Buf[SEG_Addr+3];
            COM3_DA_H=(unsigned char)(SEG_Buf[SEG_Addr+3]>>8)&0x3F;
            COM4_DA_L=(unsigned char)(SEG_Buf[SEG_Addr]>>15)&0x01;
            COM4_DA_H=0x00;
    }

    void Init(void)
    {
            P_SW2|=EAXFR;
            
            //PxMx在这里设置一下,硬件LED驱动器相关IO设置成推挽
            P2DR=0x00;
            
            AUXR=0x55;                                //设置定时器0为12T模式,设置定时器1为1T模式,使能定时器2,设置定时器2为1T模式,选择定时器2作为波特率发生器
            TMOD=0x01;                                //设置定时器0为16位不自动重载模式,设置定时器1为16位自动重载模式
            TM2PS=0x00;                                //设置定时器2分频器
            
            TL1=(0x10000-6400);                //设置定时器1初始值(6400)频率同步,160*8*5=6400
            TH1=(0x10000-6400)>>8;        //设置定时器1初始值(6400)频率同步,160*8*5=6400
            TF1=0;                                        //清除TF1中断标志位
            TR1=1;                                        //打开定时器1
            ET1=1;                                        //启用定时器1中断
            
            COMEN=0x1F;                                //使用的COM
            SEGENL=0xFF;                        //使用的SEG
            SEGENH=0x3F;                        //使用的SEG
            LEDCTRL=0x90;                        //默认最大亮度
            LEDCKS=0x00;                        //最高频率不分频
            
            EA=1;
            
            COM0_DA_L=0x00;
            COM0_DA_H=0x00;
            COM1_DA_L=0x00;
            COM1_DA_H=0x00;
            COM2_DA_L=0x00;
            COM2_DA_H=0x00;
            COM3_DA_L=0x00;
            COM3_DA_H=0x00;
            COM4_DA_L=0x00;
            COM4_DA_H=0x00;
    }

    void main(void)
    {
            Init();
            while(1)
            {
                    PWM_Func();
            }
    }

    void Timer1_Isr(void) interrupt 3
    {
            static unsigned char temp,temph,templ;
            if(SEG_Bri>0&&SEG_Bri<=4)        //1、2、3都按4处理,否则极低亮度闪烁明显,因为硬件LED驱动器运行到哪里不知道,也没有中断,频率不能绝对同步
            {
                    SEG_Bri=4;
            }
            temph=SEG_Bri/28;                //因为硬件量化级数是0~8共9级,9的倍数在8位之内最大值为252,所以SEG_Bri为0~251,软件量化级数为252/9=28,temph为MSB,给硬件,范围0~8
            templ=SEG_Bri%28;                //因为硬件量化级数是0~8共9级,9的倍数在8位之内最大值为252,所以SEG_Bri为0~251,软件量化级数为252/9=28,templ为LSB,给软件,范围0~27
            if(templ<=temp)                        //和模拟电路PWM类似,temp为上升锯齿波,templ为固定值,二者比较即可形成PWM,如果等于也按本级亮度处理,不然最高亮度temph溢出
            {
                    SEG_Func(temph);        //硬件为本级亮度
            }
            else
            {
                    SEG_Func(temph+1);        //硬件为下一级亮度
            }
            temp++;                                        //计数器扫描,范围0~27
            if(temp==28)                        //溢出
            {
                    temp=0;                                //清零
            }
    }



    让你愉快的去编程的小工具
    截图202404140746087876.jpg

    截图202404140745243528.jpg
    深圳国芯人工智能有限公司-工具软件 (stcai.com)
    截图202403310801273160.jpg









    截图202403130854333103.jpg
    截图202403130854482250.jpg
    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    (=・ω・=)
    回复 送花

    使用道具 举报

  • TA的每日心情
    无聊
    1 小时前
  • 签到天数: 118 天

    [LV.6]常住居民II

    3

    主题

    204

    回帖

    562

    积分

    高级会员

    积分
    562
    发表于 2024-1-24 01:31:37 | 显示全部楼层
    这看起来像是通过抖动获得更多的亮度等级,和显示器6抖8的原理一样。

    截图202401241549156991.jpg
    截图202401241549376464.jpg
    原来硬件提供的亮度控制位只有3位8种亮度组合
    你现在软件搞到 8位256种亮度组合

    截图202401240837083105.jpg
    截图202401240859239204.jpg
    截图202401240859507129.jpg


    截图202401270832379435.jpg

    点评

    252  发表于 2024-1-24 08:53
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    11 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    12

    主题

    340

    回帖

    1070

    积分

    金牌会员

    积分
    1070
    发表于 2024-1-24 08:16:31 | 显示全部楼层
    这个厉害了,得让姚总给你加鸡腿

    截图202404101037055004.jpg

    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    0

    主题

    392

    回帖

    517

    积分

    高级会员

    积分
    517
    发表于 2024-1-24 08:22:09 | 显示全部楼层
    论起一个吸引人的标题的重要性
    靡不有初,鲜克有终
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    37

    主题

    870

    回帖

    3956

    积分

    荣誉版主

    积分
    3956
    发表于 2024-1-24 08:43:14 | 显示全部楼层
    软件的魅力~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:27
  • 签到天数: 122 天

    [LV.7]常住居民III

    12

    主题

    315

    回帖

    874

    积分

    高级会员

    积分
    874
    发表于 2024-1-24 13:10:53 | 显示全部楼层
    软件是可以调整LED的亮度的

    点评

    纯软件扫描又浪费了硬件LED驱动器,占用CPU,所以想出了这种软硬接合的方法  发表于 2024-1-26 22:46
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:27
  • 签到天数: 122 天

    [LV.7]常住居民III

    12

    主题

    315

    回帖

    874

    积分

    高级会员

    积分
    874
    发表于 2024-1-24 13:11:51 | 显示全部楼层
    已经在产品中应用了

    点评

    帮上个视频或图片大家欣赏下  详情 回复 发表于 2024-1-24 15:48
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9255

    回帖

    1万

    积分

    管理员

    积分
    13993
    发表于 2024-1-24 15:48:09 | 显示全部楼层
    jwg 发表于 2024-1-24 13:11
    已经在产品中应用了

    帮上个视频或图片大家欣赏下
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    17

    主题

    280

    回帖

    394

    积分

    中级会员

    积分
    394
    发表于 2024-1-24 16:14:55 | 显示全部楼层
    厉害了
    回复 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    11 小时前
  • 签到天数: 113 天

    [LV.6]常住居民II

    1

    主题

    4

    回帖

    327

    积分

    中级会员

    积分
    327
    发表于 2024-1-26 10:26:16 | 显示全部楼层
    牛逼啊
    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-1 19:04 , Processed in 0.074945 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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