51单片机8*8点阵一直闪烁

51单片机中使用8*8点阵做了个笑脸,为什么一直在闪烁?有没有什么办法能让它稳定下来?

#include "regx52.h"
#include "Delay.h"
#include "T0.h"
sbit SER = P3 ^ 4;
sbit RCK = P3 ^ 5;
sbit SCK = P3 ^ 6;

unsigned char arr[]={
0x7E,0x91,0xA3,0xA5,
0xA3,0x91,0x7E,0x00,
0x00,0x7E,0xA1,0x93,
0x95,0x93,0xA1,0x7E,};


void _74hc595_init()
{
    SER = 0; RCK = 0; SCK = 0;
}
void _74hc595_data(unsigned char Data)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        SER = Data & (0x80 >> i);
        SCK = 1; SCK = 0;
    }
    RCK = 1; RCK = 0; 
}
void _74hc595(unsigned char n, unsigned char Data)
{
    
    _74hc595_data(Data);
    P0 = ~(0x80 >> n);Delay(1);
    P0 = 0xff;

}
void main()
{
    unsigned  char k;

    _74hc595_init();
    while (1)
    {
        _74hc595(0,arr[0]);
        _74hc595(1,arr[1]);
        _74hc595(2,arr[2]);
        _74hc595(3,arr[3]);
        _74hc595(4,arr[4]);
        _74hc595(5,arr[5]);
        _74hc595(6,arr[6]);
        _74hc595(7,arr[7]);

最后我判断了一下,应该是扫描太慢了,我试着把Delay和消影删掉了,可以得到一个稳定有残影的图像,于是我把消影加上,发现LED变暗了,这个我暂时解决不了,不过这个问题算是解决了

引用 皆我百晓生 小程序回复内容作答:
根据你提供的代码,闪烁的问题可能是由于刷新速度过快导致的。你可以尝试在 _74hc595 函数中的 Delay 函数调用之后增加一个延迟时间,例如 Delay(10),来降低刷新速度,看看是否能够稳定显示笑脸。

另外,你的代码中缺少一些必要的结束符号,需要在最后添加 } 来闭合 main 函数和文件。

最后,确保你的硬件连接正确,包括点阵模块和 74HC595 芯片的引脚连接。如果连接有误,也可能导致闪烁的问题。

我博客有荔枝

【以下回答由 GPT 生成】

我理解你的问题是,你在使用51单片机的8x8点阵显示一个笑脸时,点阵一直在闪烁。你想知道有什么方法可以使点阵显示稳定下来。

根据你提供的代码,点阵的显示是通过控制74HC595芯片实现的。你的代码中通过一个循环不断地将笑脸的数据传输给74HC595芯片,然后再通过P0口输出到点阵上。这种闪烁的原因可能是数据传输速度太快或者重绘的速度太快导致。

为了解决闪烁的问题,你可以尝试以下方法:

  1. 增加延时:在每次发送数据到74HC595芯片后,增加一个适当的延时,以等待数据在点阵上稳定显示。你可以通过使用Delay函数来实现延时。试着调整延时的时长,找到一个合适的值。
void _74hc595(unsigned char n, unsigned char Data)
{
    _74hc595_data(Data);
    P0 = ~(0x80 >> n); 
    Delay(2);  // 调整延时的时长
    P0 = 0xff;
}
  1. 使用双缓冲:你可以为点阵的数据使用两个缓冲区,在刷新显示时交替使用这两个缓冲区。这样可以避免数据传输和重绘时的闪烁。你可以尝试在代码中增加一个全局变量来保存两个缓冲区。
unsigned char buffer1[] = {
0x7E,0x91,0xA3,0xA5,
0xA3,0x91,0x7E,0x00,
0x00,0x7E,0xA1,0x93,
0x95,0x93,0xA1,0x7E,
};

unsigned char buffer2[] = {
// 另一个缓冲区的数据
};

unsigned char *displayBuffer = buffer1;

void main()
{
    unsigned char k;

    _74hc595_init();
    while (1)
    {
        for (k = 0; k < 8; k++)
        {
            _74hc595(k, displayBuffer[k]);
        }

        displayBuffer = (displayBuffer == buffer1) ? buffer2 : buffer1;
    }
}

以上是两种常见的解决方法。你可以先尝试增加延时,如果仍然有闪烁的问题,再考虑使用双缓冲。希望对你有帮助!如果有任何问题,请随时提问。



【相关推荐】



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

试试

void _74hc595(unsigned char n, unsigned char Data)
{
    P0 = 0xff; 
    _74hc595_data(Data);
    P0 = ~(0x80 >> n);
   Delay(3);
}

_74hc595(0,arr[0]);这些显示程序放在while上面呢,放在主循环里一直在发一直在刷新,放在主循环上面,只发一次