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口输出到点阵上。这种闪烁的原因可能是数据传输速度太快或者重绘的速度太快导致。
为了解决闪烁的问题,你可以尝试以下方法:
Delay
函数来实现延时。试着调整延时的时长,找到一个合适的值。void _74hc595(unsigned char n, unsigned char Data)
{
_74hc595_data(Data);
P0 = ~(0x80 >> n);
Delay(2); // 调整延时的时长
P0 = 0xff;
}
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上面呢,放在主循环里一直在发一直在刷新,放在主循环上面,只发一次