普中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为啥亮起来的?而且亮度不高。
在普中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
[本文内容由国芯人工智能辅助生成,仅供参考] P0=0xFF后面再加延时试试
建议学习8H4K64TL硬件LED驱动
单芯片点256个灯
https://www.stcaimcu.com/thread-7591-1-1.html
P0 = 0x7F
595 = 0x80
0,0 亮
P0 = 0xFF
P0 = 0xBF ; 但是此时595 == 0x80
0,1 误触发,微亮
所以matrix_led函数修改:
P0 = 0xFF后
先设置595
再设置P0
国芯人工智能 发表于 2025-4-25 15:28
在普中A2开发板上,LED点阵显示程序消隐失败的问题可能源于多个方面。以下是对该问题的详细分析及解决方案 ...
看来ai也有不懂装懂胡编的时候。{:shui:} 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;
}
}
显示正常了
DebugLab 发表于 2025-4-25 15:51
P0=0xFF后面再加延时试试
建议学习8H4K64TL硬件LED驱动
单芯片点256个灯
够厉害,不要别的芯片,直接就一个stc8直接带起来那么多led。看来引脚扩展技术几乎用不到了。主控stc8直接通信给点阵那端的stc8就可以了。 yzhkpli 发表于 2025-4-26 08:49
看来ai也有不懂装懂胡编的时候。
AI说的也没错,你这也是时序问题, {:ciya:}
页:
[1]