找回密码
 立即注册
查看: 61|回复: 7

STC8H4K64TL 驅動LED閃爍的問題!

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2026-03-07 13:04:41
已绑定手机

17

主题

328

回帖

2240

积分

金牌会员

积分
2240
发表于 2026-2-26 13:30:44 | 显示全部楼层 |阅读模式
在調試AI8H8K64TL內置的LED驅動器驅動點陣LED的時候,發現更新數據的不能太快,不然就會有亮度不均的問題出現(并不是因為刷新率低頻閃),如果數據更新慢,就顯示很穩定,看不出有亮度不均的問題,看哪位大神有沒好的辦法處理這個,感覺是是LED驅動器的一個瓶頸?
燒錄用40MHZ,調整這個值就可以看出有沒閃爍,unsigned int delay_val = 50;      // 初始延时 500ms,可修改以改变速度


#include <STC8H.H>
#include <intrins.h>
#include <absacc.h>

// ================== NUM字模表(数字0-9) ==================
unsigned char code NUM[][8] = {
    {0x70,0x88,0x98,0xA8,0xC8,0x88,0x70,0x00}, // 0
    {0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00}, // 1
    {0xF0,0x08,0x08,0x70,0x80,0x80,0xF8,0x00}, // 2
    {0xF0,0x08,0x08,0x30,0x08,0x08,0xF0,0x00}, // 3
    {0x10,0x30,0x50,0x90,0xF8,0x10,0x10,0x00}, // 4
    {0xF8,0x80,0xF0,0x08,0x08,0x08,0xF0,0x00}, // 5
    {0x70,0x80,0xF0,0x88,0x88,0x88,0x70,0x00}, // 6
    {0xF8,0x08,0x10,0x20,0x40,0x40,0x40,0x00}, // 7
    {0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00}, // 8
    {0x70,0x88,0x88,0x78,0x08,0x88,0x70,0x00}  // 9
};

// ================== 配置参数(根据调试结果) ==================
#define ROW_REVERSE    1   // 数组行序颠倒(NUM[][0]对应物理最后一行)
#define BIT7_IS_LEFT   1   // 字节的最高位(bit7)对应最左边列
#define COL_REVERSE    0   // 列序正常(左边数字的列0对应SEG0)

// ================== 全局变量 ==================
unsigned char i, r, c;
unsigned int row_data[8];

// ================== 函数声明 ==================
void Init(void);
void Display_Two_Digits_To_Region(unsigned char d_left, unsigned char d_right,
                                   unsigned char xdata *p_low, unsigned char xdata *p_high);
void Delay_x10ms(unsigned int x);  // x * 10ms 延时

// ================== 初始化 ==================
void Init(void)
{
    unsigned char xdata *p;
    P_SW2 |= 0x80;

    P0M0 = 0x0F; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0xFF; P2M1 = 0x00;
    P3M0 = 0xF0; P3M1 = 0x00;
    P4M0 = 0xFF; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P2DR = 0x00;

    COMEN   = 0xFF;
    SEGENL  = 0xFF;
    SEGENH  = 0xFF;
    LEDCTRL = 0xA0;   // 自动切换极性,硬件处理共阴/共阳
    LEDCKS  = 0x00;

    // 清空所有显示RAM
    p = (unsigned char xdata *)0xFB10; for (i = 0; i < 8; i++) p = 0;
    p = (unsigned char xdata *)0xFB18; for (i = 0; i < 8; i++) p = 0;
    p = (unsigned char xdata *)0xFB20; for (i = 0; i < 8; i++) p = 0;
    p = (unsigned char xdata *)0xFB28; for (i = 0; i < 8; i++) p = 0;

    EA = 1;
}

// ================== 将两个数字显示到指定区域 ==================
void Display_Two_Digits_To_Region(unsigned char d_left, unsigned char d_right,
                                   unsigned char xdata *p_low, unsigned char xdata *p_high)
{
    for (r = 0; r < 8; r++) row_data[r] = 0;

    for (r = 0; r < 7; r++) {
        unsigned char row_left, row_right;
        if (ROW_REVERSE) {
            row_left  = NUM[d_left][6 - r];
            row_right = NUM[d_right][6 - r];
        } else {
            row_left  = NUM[d_left][r];
            row_right = NUM[d_right][r];
        }

        // 左边数字占 bit0~4
        for (c = 0; c < 5; c++) {
            unsigned char bit_mask = BIT7_IS_LEFT ? (0x80 >> c) : (1 << c);
            if (row_left & bit_mask) {
                unsigned char target_c = COL_REVERSE ? (4 - c) : c;
                row_data[r] |= (1 << target_c);
            }
        }

        // 右边数字占 bit5~9
        for (c = 0; c < 5; c++) {
            unsigned char bit_mask = BIT7_IS_LEFT ? (0x80 >> c) : (1 << c);
            if (row_right & bit_mask) {
                unsigned char target_c = COL_REVERSE ? (4 - c) : c;
                row_data[r] |= (1 << (target_c + 5));
            }
        }
    }

    for (r = 0; r < 7; r++) {
        p_low[r]  = (unsigned char)(row_data[r] & 0xFF);        // SEG0~7
        p_high[r] = (unsigned char)((row_data[r] >> 8) & 0x03); // SEG8~9
    }
    p_low[7] = 0;
    p_high[7] = 0;
}


void Delay_x10ms(unsigned int x)
{
    unsigned char i, j;
    while (x--) {
        _nop_(); _nop_();
        i = 144; j = 157;
        do { while (--j); } while (--i);
    }
}

// ================== 主函数 ==================
void main(void)
{
    unsigned int count = 0;          // 计数值 0~1000
    unsigned char thou, hund, tens, ones;
    unsigned int delay_val = 50;      // 初始延时 500ms,可修改以改变速度

    Init();

    // 共阴区和共阳区地址指针
    unsigned char xdata *p_low_cath  = (unsigned char xdata *)0xFB10;
    unsigned char xdata *p_high_cath = (unsigned char xdata *)0xFB18;
    unsigned char xdata *p_low_anod  = (unsigned char xdata *)0xFB20;
    unsigned char xdata *p_high_anod = (unsigned char xdata *)0xFB28;

    while (1)
    {
        // 分解四位数字
        thou = count / 1000;
        hund = (count % 1000) / 100;
        tens = (count % 100) / 10;
        ones = count % 10;

        // 共阴区显示千位和百位
        Display_Two_Digits_To_Region(thou, hund, p_low_cath, p_high_cath);
        // 共阳区显示十位和个位
        Display_Two_Digits_To_Region(tens, ones, p_low_anod, p_high_anod);

        // 延时(调整速度)
        Delay_x10ms(delay_val);

        // 计数递增,到1000后归零
        count++;
        if (count > 1000) count = 0;
    }
}

819e3f285fec41168cac2c74f99f9cf1.mp4

230.49 KB, 下载次数: 2

专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:719
  • 最近打卡:2026-03-07 07:41:42
已绑定手机

97

主题

7247

回帖

1万

积分

超级版主

积分
13780
发表于 2026-2-26 15:11:23 | 显示全部楼层
每个SEG要串电阻,建议100~300Ω,COM不要串电阻,上传原理图看看
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2026-03-07 13:04:41
已绑定手机

17

主题

328

回帖

2240

积分

金牌会员

积分
2240
发表于 2026-2-26 22:24:46 | 显示全部楼层
Debu*** 发表于 2026-2-26 15:11
每个SEG要串电阻,建议100~300Ω,COM不要串电阻,上传原理图看看

有在你16x16的點陣板試試嗎?看看是否有這個問題?

点评

无明显亮度不均  详情 回复 发表于 2026-2-26 22:28
专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:719
  • 最近打卡:2026-03-07 07:41:42
已绑定手机

97

主题

7247

回帖

1万

积分

超级版主

积分
13780
发表于 2026-2-26 22:28:08 | 显示全部楼层
VECEN*** 发表于 2026-2-26 22:24
有在你16x16的點陣板試試嗎?看看是否有這個問題?

无明显亮度不均
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2026-03-07 13:04:41
已绑定手机

17

主题

328

回帖

2240

积分

金牌会员

积分
2240
发表于 2026-2-26 22:30:34 | 显示全部楼层
Debu*** 发表于 2026-2-26 22:28
无明显亮度不均

你用我這個程序跑一下看看,看3和4位數字有沒亮不均
专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2026-03-07 13:04:41
已绑定手机

17

主题

328

回帖

2240

积分

金牌会员

积分
2240
发表于 2026-2-26 22:43:15 | 显示全部楼层
Debu*** 发表于 2026-2-26 22:28
无明显亮度不均

其他数字确实也不是很明显,但是肉眼看得出来,亮度高还好一些,调到最低亮度就明显多了,特别是有数字4和影响最大,5个点都亮,就会变暗很多
专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2026-03-07 13:04:41
已绑定手机

17

主题

328

回帖

2240

积分

金牌会员

积分
2240
发表于 2026-2-27 14:48:33 | 显示全部楼层
Debu*** 发表于 2026-2-26 15:11
每个SEG要串电阻,建议100~300Ω,COM不要串电阻,上传原理图看看

加了限流電阻也是一樣的問題,調慢一些就沒那麼明顯,你在顯示漢字是移動的,看不出來
专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2026-03-07 13:04:41
已绑定手机

17

主题

328

回帖

2240

积分

金牌会员

积分
2240
发表于 2026-2-27 14:55:08 | 显示全部楼层
Debu*** 发表于 2026-2-26 15:11
每个SEG要串电阻,建议100~300Ω,COM不要串电阻,上传原理图看看

原理圖跟你的16X16一樣,不過我只是用了SEG0-9而以,共陰陳陽模式驅動
专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 15:32 , Processed in 0.114014 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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