74HC595控制的4位数码管

我是一个刚接触单片机的,我在写74HC595有关的程序时,遇到了一个问题,就是数码管的亮度会比正常显示时的亮度要暗很多,同时在亮“1”这一个数字时“1”会很亮,其他的数字就不会有这种情况,这是什么原因呢?我在检查代码是发现代码并没有什么不对的地方。
麻烦各位帮忙指点指点

img


#define SCLK PB0
#define RCLK PB1
#define DIO PB2

下面是主函数:
void main()
{
    initialize();  //初始化的程序
    while(1)
    {
        asm("clrwdt");
        duan_wei_display();    
        
    }
}

一下是输入串行数据:
void input_serial_data(uchar data)
{
    static uchar i;
    for(i=0;i<8;i++)        
    {
        if(data&0x80)        
        {
            DIO = 1;        
        }
        else
        {
            DIO = 0;        
        }
        
        SCLK = 0;
        SCLK = 1;            
        SCLK = 0;
        data<<=1;            
        
    }
    

}
数码管扫描:

void duan_wei_display()        
{
    static uchar r_num_i;                    
    num_progressive_increase();            
    
    //个位
    input_serial_data(num1[num_plus%10]);                    
    input_serial_data(0x01);                    
    RCLK = 0;
    RCLK = 1;


    //十位
    input_serial_data(num1[num_plus/10%10]);                    
    input_serial_data(0x02);                    
    RCLK = 0;
    RCLK = 1;

    //百位
    input_serial_data(num1[num_plus/100%10]);                    
    input_serial_data(0x04);                    
    RCLK = 0;
    RCLK = 1;

    //千位    
    input_serial_data(num1[num_plus/1000%10]);                    
    input_serial_data(0x08);                    
    RCLK = 0;
    RCLK = 1;
}

下面的是让数码管每秒递增1的程序
void num_progressive_increase()        
{
    
    if(F_595time_1s==1)            
    {
        F_595time_1s = 0;            
        
        num_plus++;

        if(num_plus>9999)
        {
            num_plus = 0;            
        }
    }
        
}

该回答引用gpt
您好,根据您提供的代码,可能存在以下原因导致数码管亮度问题:

1.74HC595芯片输出电流不足,导致数码管亮度不够,可以尝试增加输出电流或者使用更高功率的74HC595芯片。

2.数码管共阳极导致数字“1”亮度更高,其他数字较暗,可以尝试使用共阴极数码管或者调整数码管驱动电路。

3.输入串行数据时,输出高低电平的时间不够稳定,可能存在一些闪烁现象。您可以使用延时函数来保证输出时钟的稳定性。

4.数码管显示的亮度还受到外部环境的影响,比如周围光线亮度等。因此,您可以尝试在不同环境下观察数码管的亮度表现,以确定是否存在其他原因影响数码管亮度。

希望以上建议对您有所帮助。

【以下回答由 GPT 生成】

问题的原因是74HC595控制的4位数码管在显示时亮度较暗,并且在亮“1”这个数字时特别亮的原因是因为代码中没有设置数码管的亮度控制。可能的解决方法是通过设置PWM信号来调整74HC595的亮度。

以下是修改后的代码示例:

#define SCLK PB0
#define RCLK PB1
#define DIO PB2
#define PWM_Pin PB4

void main()
{
    initialize();  //初始化的程序
    setup_pwm();   //设置PWM
    while(1)
    {
        asm("clrwdt");
        duan_wei_display();    
    }
}

void input_serial_data(uchar data)
{
    static uchar i;
    for(i=0;i<8;i++)
    {
        if(data&0x80)        
        {
            DIO = 1;        
        }
        else
        {
            DIO = 0;        
        }

        SCLK = 0;
        SCLK = 1;            
        SCLK = 0;
        data<<=1;            
    }
}

void setup_pwm()
{
    //设置PWM频率和最大亮度
    //例如:Frequency = 1kHz,Duty Cycle = 50%
    //请根据具体需求设置
    T2CKPS0 = 1;    // T2CKPS<1:0> = 0b01, Prescaler = 4
    T2CKPS1 = 0;
    TMR2ON = 1;     // Timer2 is on
    PR2 = 124;      // PWM Period = (PR2 + 1) * 4 * Tosc * Prescaler = 1ms
    CCPR1L = 62;    // Duty Cycle = (CCPR1L:CCP1CON<5:4>) / (PR2 + 1) = 50%
    CCP1CON = 0b00001100;   // Enable PWM on CCP1 pin

    //将PWM引脚设置为输出
    TRISB4 = 0;
}

void duan_wei_display()        
{
    static uchar r_num_i;                    
    num_progressive_increase();            

    //个位
    input_serial_data(num1[num_plus%10]);
    input_serial_data(0x01);
    RCLK = 0;
    RCLK = 1;


    //十位
    input_serial_data(num1[num_plus/10%10]);
    input_serial_data(0x02);
    RCLK = 0;
    RCLK = 1;

    //百位
    input_serial_data(num1[num_plus/100%10]);   
}

请注意,修改的部分是新增了设置PWM和调整亮度的相关代码。具体的PWM设置和亮度控制参数需要根据实际情况进行调整。在以上代码示例中,我使用了Timer2和CCP1模块来实现PWM输出,请根据单片机的具体型号和数据手册来进行调整。

希望这个解决方案能对你有所帮助!如果还有其他问题,请随时告诉我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^