yzhkpli 发表于 7 天前

普中A2的板子led点阵显示程序消隐失败

/*
Author:
Date:
        三个管脚的详细说明
        SRCLK(Shift Register Clock):
                移位寄存器时钟输入管脚。此管脚用于控制数据逐位移入内部的移位寄存器。每当 SRCLK 出现一个上升沿时,SER 引脚上的数据就会被移入移位寄存器的下一位。
        RCLK(Register Clock):
                存储寄存器时钟输入管脚。该管脚用于将移位寄存器中的数据转移到存储寄存器中。当 RCLK 出现上升沿时,移位寄存器里当前存储的数据会被传送到存储寄存器,然后由并行输出端输出。
        SER(Serial Data Input):
                串行数据输入管脚。要移入移位寄存器的数据就是通过这个管脚逐位输入的

*/
#include "reg52.h"
#include "INTRINS.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit SRCLK_74HC595 = P3^6;
sbit RCLK_74HC595 = P3^5;
sbit SER_74HC595 = P3^4;

u8 ledwei={0X7F,0XBF,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 dotduan={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

void Delay1ms(void)        //@11.0592MHz
{
        unsigned char data i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}

void _nop_();
void WriteBytetoHC595(unsigned char dat)
{
        signed char i;
        SRCLK_74HC595 = 0;
        RCLK_74HC595 = 0;
    for (i = 7; i>=0; i--) {
                SER_74HC595=(dat>>i)&0x01;
      SRCLK_74HC595 = 1;
                _nop_();_nop_();
                SRCLK_74HC595 = 0; // SRCLK上升沿可以发送移位脉冲
    }
       
    RCLK_74HC595 = 1;
        _nop_();_nop_();
        RCLK_74HC595 = 0; // RCLK上升沿可以发送
}
void matrix_led(unsigned char x,unsigned char y){
        P0 =ledwei;
        WriteBytetoHC595(dotduan);
}
void main() {
//    WriteBytetoHC595(0x80);
//    P0 = 0X7F;
        while(1){
                P0=0xFF;matrix_led(0,0);Delay1ms();
                P0=0xFF;matrix_led(1,1);        Delay1ms();
                P0=0xFF;matrix_led(5,5);        Delay1ms();
        }
}P0=0xFF;matrix_led(0,0);Delay1ms();前面的P0=0xff就是负责消隐的。

但是消隐失败了。以左上角为(0,0),只想显示(0,0),(1,1),(5,5)。其余那三个led为啥亮起来的?而且亮度不高。

国芯人工智能 发表于 7 天前

在普中A2开发板上,LED点阵显示程序消隐失败的问题可能源于多个方面。以下是对该问题的详细分析及解决方案。

1. 问题分析

消隐(Ghosting)通常是由于LED点阵在切换显示内容时,未完全关闭前一个显示内容,导致残留影像。这种现象在快速切换显示内容时尤为明显。根据提供的代码,消隐失败可能由以下原因引起:

1.1 时序问题
在LED点阵显示中,时序控制至关重要。如果SRCLK和RCLK的时序不准确,可能导致数据未完全移入移位寄存器或未正确锁存到存储寄存器,从而导致消隐失败。

1.2 延时不足
代码中的延时函数Delay1ms可能不足以确保LED点阵完全关闭前一个显示内容。延时过短会导致切换过快,从而产生消隐现象。

1.3 数据更新频率
如果数据更新频率过高,可能导致LED点阵在显示新内容时,前一个内容尚未完全关闭,从而产生消隐。

2. 解决方案

2.1 优化时序控制
确保SRCLK和RCLK的时序准确。在数据移入移位寄存器后,应确保有足够的时间将数据锁存到存储寄存器。可以通过增加延时或调整时钟信号的占空比来优化时序。

```c
void HC595SendData(u8 dat)
{
    u8 i;
    for(i=0;i> 7;
      dat

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 7 天前

P0=0xFF后面再加延时试试
建议学习8H4K64TL硬件LED驱动
单芯片点256个灯
https://www.stcaimcu.com/thread-7591-1-1.html

ercircle 发表于 7 天前


P0 = 0x7F
595 = 0x80
0,0 亮
P0 = 0xFF
P0 = 0xBF ; 但是此时595 == 0x80

0,1 误触发,微亮


所以matrix_led函数修改:
P0 = 0xFF后
先设置595
再设置P0

yzhkpli 发表于 6 天前

国芯人工智能 发表于 2025-4-25 15:28
在普中A2开发板上,LED点阵显示程序消隐失败的问题可能源于多个方面。以下是对该问题的详细分析及解决方案 ...

看来ai也有不懂装懂胡编的时候。{:shui:}

yzhkpli 发表于 6 天前

ercircle 发表于 2025-4-25 16:06
P0 = 0x7F
595 = 0x80
0,0 亮



版主确实厉害。
以下是按您指教修改后的
void matrix_led(unsigned char x,unsigned char y){
        WriteBytetoHC595(dotduan);
        P0 =ledwei;
}

void main() {
        u8 ledNum=~0x01;
        P0=0x7f;
        while(1){
                matrix_led(0,0);Delay1ms();P0=0xFF;
                matrix_led(1,1);      Delay1ms();P0=0xFF;
                matrix_led(5,5);      Delay1ms();P0=0xFF;
        }
}
显示正常了

yzhkpli 发表于 6 天前

DebugLab 发表于 2025-4-25 15:51
P0=0xFF后面再加延时试试
建议学习8H4K64TL硬件LED驱动
单芯片点256个灯


够厉害,不要别的芯片,直接就一个stc8直接带起来那么多led。看来引脚扩展技术几乎用不到了。主控stc8直接通信给点阵那端的stc8就可以了。

haiyang201 发表于 6 天前

yzhkpli 发表于 2025-4-26 08:49
看来ai也有不懂装懂胡编的时候。

AI说的也没错,你这也是时序问题,

大叶子 发表于 6 天前

{:ciya:}
页: [1]
查看完整版本: 普中A2的板子led点阵显示程序消隐失败