找回密码
 立即注册
查看: 75|回复: 9

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 6 天前 | 显示全部楼层 |阅读模式
  1. /*
  2. Author:
  3. Date:
  4.         三个管脚的详细说明
  5.         SRCLK(Shift Register Clock):
  6.                 移位寄存器时钟输入管脚。此管脚用于控制数据逐位移入内部的移位寄存器。每当 SRCLK 出现一个上升沿时,SER 引脚上的数据就会被移入移位寄存器的下一位。
  7.         RCLK(Register Clock):
  8.                 存储寄存器时钟输入管脚。该管脚用于将移位寄存器中的数据转移到存储寄存器中。当 RCLK 出现上升沿时,移位寄存器里当前存储的数据会被传送到存储寄存器,然后由并行输出端输出。
  9.         SER(Serial Data Input):
  10.                 串行数据输入管脚。要移入移位寄存器的数据就是通过这个管脚逐位输入的
  11. */
  12. #include "reg52.h"
  13. #include "INTRINS.h"
  14. typedef unsigned int u16;
  15. typedef unsigned char u8;
  16. sbit SRCLK_74HC595 = P3^6;
  17. sbit RCLK_74HC595 = P3^5;
  18. sbit SER_74HC595 = P3^4;
  19. u8 ledwei[8]={0X7F,0XBF,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  20. u8 dotduan[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  21. void Delay1ms(void)        //@11.0592MHz
  22. {
  23.         unsigned char data i, j;
  24.         _nop_();
  25.         _nop_();
  26.         _nop_();
  27.         i = 11;
  28.         j = 190;
  29.         do
  30.         {
  31.                 while (--j);
  32.         } while (--i);
  33. }
  34. void _nop_();
  35. void WriteBytetoHC595(unsigned char dat)
  36. {
  37.         signed char i;
  38.         SRCLK_74HC595 = 0;
  39.         RCLK_74HC595 = 0;
  40.     for (i = 7; i>=0; i--) {
  41.                 SER_74HC595=(dat>>i)&0x01;
  42.         SRCLK_74HC595 = 1;
  43.                 _nop_();_nop_();
  44.                 SRCLK_74HC595 = 0; // SRCLK上升沿可以发送移位脉冲
  45.     }
  46.        
  47.     RCLK_74HC595 = 1;
  48.         _nop_();_nop_();
  49.         RCLK_74HC595 = 0; // RCLK上升沿可以发送
  50. }
  51. void matrix_led(unsigned char x,unsigned char y){
  52.         P0 =ledwei[x];
  53.         WriteBytetoHC595(dotduan[y]);
  54. }
  55. void main() {
  56. //    WriteBytetoHC595(0x80);
  57. //    P0 = 0X7F;
  58.         while(1){
  59.                 P0=0xFF;matrix_led(0,0);Delay1ms();
  60.                 P0=0xFF;matrix_led(1,1);        Delay1ms();
  61.                 P0=0xFF;matrix_led(5,5);        Delay1ms();
  62.         }
  63. }
复制代码
P0=0xFF;matrix_led(0,0);Delay1ms();前面的P0=0xff就是负责消隐的。

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

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 6 天前 | 显示全部楼层
在普中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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 6 天前 | 显示全部楼层
P0=0xFF后面再加延时试试
建议学习8H4K64TL硬件LED驱动
单芯片点256个灯
https://www.stcaimcu.com/thread-7591-1-1.html
DebugLab
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 6 天前 | 显示全部楼层

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

0,1 误触发,微亮


所以matrix_led函数修改:
P0 = 0xFF后
先设置595
再设置P0
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

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

看来ai也有不懂装懂胡编的时候。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 5 天前 | 显示全部楼层
erci*** 发表于 2025-4-25 16:06
P0 = 0x7F
595 = 0x80
0,0 亮


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

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;
        }
}
显示正常了
截图202504260903474862.jpg

点评

指教不敢当啊,共同进步!  发表于 5 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 5 天前 | 显示全部楼层
Debu*** 发表于 2025-4-25 15:51
P0=0xFF后面再加延时试试
建议学习8H4K64TL硬件LED驱动
单芯片点256个灯

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-05-01 06:53:32
已绑定手机

4

主题

339

回帖

1558

积分

金牌会员

积分
1558
发表于 5 天前 | 显示全部楼层
yzhk*** 发表于 2025-4-26 08:49
看来ai也有不懂装懂胡编的时候。

AI说的也没错,你这也是时序问题,
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:265
  • 最近打卡:2025-05-01 07:25:06

0

主题

206

回帖

1522

积分

金牌会员

积分
1522
发表于 5 天前 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 21:00 , Processed in 0.150571 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表