某论坛上看到一个人提问,把我的回答也记在这边做个记录。

原问题

现在是4位数码管,共阳,已经驱动74hc595让4位数码管亮起来了,现在在这基础上再控制数码管上数字的亮度,想过用pwm控制,但是,一般来说pwm管脚不是直连数码管阴极的吗?现在是单片机直连595驱动,595驱动上的管脚连接数码管,从而点亮数码管的,所以不知道该怎么解决?

回答

都没答到到点子上。用595驱动时一样可以用PWM的概念控制亮度。楼主一定是觉得亮度太高想降低亮度对不对。你可以这样,我自己就是这么做的,完全没有任何问题。

首先定义一个最高亮度,比如200,这个数字可以随意定,数字越大可控制的亮度级别越精细
#define MAX_BRIGHT 200
然后定义一个你需要的亮度,这个亮度取值0-200,比如2
#define BRIGHT 2
再定义1个变量用于PWM计数
uchar nowPwm;

然后在main函数的while循环中(或者定时器中)写以下代码

    while(1){
        nowPwm++;
        if (nowPwm<=BRIGHT)
        {
            // PWM计数还没有超过你指定亮度值的时候点亮数码管(也就是让位选端的IO通电)
            // 根据你自己的写法填在这里
        } else {
            // 当PWM计数已经超过你设置的亮度值以后,就关闭所有数码管的输出
            // 根据你自己的写法填在这里
        }
        // 计数超过最大亮度值时计数值归零,进行下一个PWM的Cycle
        if (nowPwm>=MAX_BRIGHT)
        {
            nowPwm=0;
        }
    }
Last modification:November 28, 2020
If you think my article is useful to you, please feel free to appreciate