乐此不疲 发表于 2023-6-11 21:25:31

请教!8H4K64TL-pin32的LED驱动应用失败【原因找到、结贴】

为了测试STC8H4K64TL单片机的硬件驱动LED数码管的功能,
画板子做了一个LED时钟。
此贴:STC8H4K64TL,32个8段LED数码管大电流自动刷新演示
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=337
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

@梁工 在本帖8楼发布了例程STC8H4K64TL-LED数码管自动扫描显示相关程序.rar
经过反复阅读数据手册有关LED驱动的相关章节并以上述例程为蓝本进行测试,但是烧录后板子无法显示,为全部黑屏的状态,用万用表测量数码管的COM脚和8个SEG引脚都是低电平,已经弄了三天了毫无进展来此求助,请各位抽空指点一下看看哪里可能有问题,32脚芯片是毛保拍的、版本号为HA。
测试代码如下:

void main()
{

GPIO_set();//预置所有I/O口全部为准双向口
P_SW2 |= 0x80;//允许操作扩展SFR(XSFR)
//P1IE &= 0x3f;                        //关闭外接晶振引脚(P1.6、P1.7)的数字通道
//XOSCCR = 0xc0;                //启动外部晶振
//while (!(XOSCCR & 1));//等待时钟稳定
//CLKDIV = 0x00;                //时钟不分频
//CKSEL = 0x01;                        //选择外部晶振

P2M0 = 0xff; P2M1 = 0x00; //COM0~COM7线设置为推挽输出
P0M0 = 0x0f; P0M1 = 0x00; //SEG8~SEG11(P0.0~P0.3)线设置为推挽输出、低4位推挽高4位准双向输出
P3M0 = 0xf0; P3M1 = 0x00; //SEG12~SEG15(P3.4~P3.7)线设置为推挽输出、高4位推挽低4位准双向输出

P2DR = 0x00;      //COM0~COM7线设置为强电流驱动
P0DR = 0xf0;      //SEG8~SEG11线设置为强电流驱动、低4位强电流输出
P3DR = 0x0f;      //SEG12~SEG15线设置为强电流驱动、高4位强电流输出

COMEN= 0xff;      //使能8个COM
//SEGENL = 0x00;      //不使能SEG0-SEG7
SEGENH = 0xff;      //使能SEG8-SEG15
LEDCTRL = 0x90;//(1001 0000)//0x80 + (1<<4) + 0;      //B7=1: 使能LED驱动器,B5 B4: 01(共阳),3保留, B2 B1 B0: 000占空比100%(1~7占空比7/8~1/8)
LEDCKS = 8;

COM3_DAL = 0x00;//显示熄屏
COM4_DAL = 0x6b;//显示2
COM5_DAL = 0x33;//显示3
COM6_DAL = 0x1e;//显示4
COM7_DAL = 0xff;//显示显示全亮
P37=1;

while(1)
{

/*
P00=0; //a-SEG8
P01=0; //b-SEG9
P02=0; //f-SEG10
P03=0; //g-SEG11
P34=0; //c-SEG12
P35=0; //e-SEG14
P36=0; //d-SEG13
for(i=0;i<5;i++)
{
P2=0x08<<i;
P20=1;//关闭背景灯
delay_ms(300);
}
*/
}
}如果不使用硬件LED驱动功能,而是使用I/O口直接驱动(使用主循环中的代码可以交替点亮各个数码管)是可以正常显示的。






梁工 发表于 2023-6-11 22:51:31

请参考:

乐此不疲 发表于 2023-6-12 10:14:51

梁工 发表于 2023-6-11 22:51
请参考:

我用的就是你分享的代码。


源代码如下:

/*********************************************************/

#define MAIN_Fosc        11059200L        //定义主时钟

#include        "..\..\STC8Hxxx.h"

/*************        功能说明        *************

驱动8段16个共阳数码管自动扫描显示.

P4.0~P4.7: 接SEG0~SEG7,这8根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
P0.0~P0.3: 接SEG8~SEG11, 这4根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
P3.4~P3.7: 接SEG12~SEG15,这4根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
P2.0~P2.7: 接COM0~COM7

P4.0 P4.1 P4.2 P4.3 P4.4 P4.5 P4.6 P4.7    P0.0 P0.1 P0.2P0.3P3.4P3.5P3.6P3.7
SEG0 SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7    SEG8 SEG9 SEG10 SEG11 SEG12 SEG13 SEG14 SEG15
A    B    C    D    E    F    G    H       A    B   C   D   E   F   G   H   
P2.0-COM0
P21.-COM1
P22.-COM2
P23.-COM3
P24.-COM4
P25.-COM5
P26.-COM6
P27.-COM7

******************************************/


/*************        本地常量声明        **************/

/*************        本地变量声明        **************/



/*************        本地函数声明        **************/
voiddelay_ms(u8 ms);

/****************外部函数声明和外部变量声明 *****************/


u8 code T_LED_CODE[]={                                                //标准字库
//代码          0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
//显示字符   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
            0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

//代码          0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
//显示字符   0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   空
            0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00};
       


//共阳数码管字库导入, i为LED位置0~15, dis为要显示的代码 0~9, A~F, 1.~9., 空
void        LoadLED_B(u8 i, u8 dis)
{
        u8        xdata *px;
       
        px = &COM0_DAL + 15 - i;                //PCB布局低位数码管在右边, 所以用(15-i)反一下
        *px = T_LED_CODE;
}

/**********************************************/
void main(void)
{
        u8        i;

        P_SW2 |= 0x80;        //允许访问XSFR(扩展特殊功能寄存器)

//        XOSCCR = 0xc0;         //启动外部晶振
//        while (!(XOSCCR & 1));   //等待时钟稳定
//        CLKDIV = 0x00;         //时钟不分频
//        CKSEL = 0x01;            //选择外部晶振


        P2n_push_pull(0xff);        //COM0~COM7线设置为推挽输出
        P4n_push_pull(0xff);        //SEG0~SEG7(P4.0~P4.7)线设置为推挽输出
        P0n_push_pull(0x0f);        //SEG8~SEG11(P0.0~P0.3)线设置为推挽输出
        P3n_push_pull(0xf0);        //SEG12~SEG15(P3.4~P3.7)线设置为推挽输出

        P2DR = 0x00;        //COM0~COM7线设置为强电流驱动
        P4DR = 0x00;        //SEG0~SEG7线设置为强电流驱动
        P0DR = 0xf0;        //SEG8~SEG11线设置为强电流驱动
        P3DR = 0x0f;        //SEG12~SEG15线设置为强电流驱动

        COMEN= 0xff;        //允许8个COM
        SEGENL = 0xff;        //允许8个SEG 低字节
        SEGENH = 0xff;        //允许8个SEG 高字节
        LEDCTRL = 0x80 + (1<<4) + 0;        //B7=1: ON,B5 B4: 0共阴, 1共阳, 2共阴共阳, 3保留, B2 B1 B0: 0占空比100%, 1~7占空比7/8~1/8
        LEDCKS = 8;                //数码管COM扫描显示的主频时钟数 = 160*9*LEDCKS, 每个COM显示时间=1440*LEDCKS/fosc(MHz) us, COM扫描频率=fosc/(1440*LEDCKS *COM数).
                                        //例如 fosc = 11.0592MHz, 8个COM, LEDCKS = 8, 则每个COM显示时间=1440*8/11.0592 = 1042 us, COM扫描频率=11059200/(1440*8*8)=120Hz.
                                        //已知扫描时间t(us)计算 LEDCKS = t*fosc(MHz)/1440, 比如fosc = 24MHz, 要求1个COM扫描1ms, 则 LEDCKS = 1000*24/1440 = 16.7, 取整数17.

        for(i=0; i<16; i++)       
       
        LoadLED_B(i,15-i);        //共阳,显示FEDCBA9876543210
       
       
        while (1)
        {
                //刷新COM0_DAL~COM7_DAL, COM0_DAH~COM7_DAH,即可刷新共阳显示内容.
               
        }
}



梁工 发表于 2023-6-12 10:27:01

示波器看一下输出COM信号有吗?

乐此不疲 发表于 2023-6-12 10:30:54

本帖最后由 乐此不疲 于 2023-6-12 10:39 编辑

梁工 发表于 2023-6-11 22:51
请参考:
多谢梁工指点,问题已经解决了,再谢!

乐此不疲 发表于 2023-6-12 11:50:24

驱动失败的原因是犯了一个低级错误、显示数据发送错了地址,分享于此提醒初次使用这个芯片的新手。
对于共阳极数码管的16个显示数据寄存器分为低8位COM0_DA_L----COM7_DA_L(头文件定义的书写格式为COM0_DAL----COM7_DAL),它对应SEG0-----SEG7的段码;还有高8位的COM0_DA_H----COM7_DA_H,它对应SEG8-----SEG15的段码,对于STC8H4K64TL-32引脚的芯片只有SEG8-SEG15段的引脚,发送数据时必须使用COM0_DAH----COM7_DAH这8个寄存器,如果错送到COMn_DAL寄存器就无显示了。

梁工 发表于 2023-6-12 15:22:21

乐此不疲 发表于 2023-6-12 11:50
驱动失败的原因是犯了一个低级错误、显示数据发送错了地址,分享于此提醒初次使用这个芯片的新手。
对于共 ...

我的例子里说明得很清楚的。

AHBbGao 发表于 2024-10-18 18:28:43

我现在用这个8H4K64TL可以点亮
由8个0603的led灯组成的一个8段显示屏,
但是亮度还是不够,如果我想再提高亮度有没有什么办法呀。
软件上已调成最高亮度。硬件将限流电阻也全去掉了。

神农鼎 发表于 2024-10-18 19:44:29



什么?8H4K64TL硬件80mA大电流LED数码管自动刷新驱动居然可以8位亮度256种组合? - 段码LCD/80mA大电流LED数码管自动刷新显示/RTC实时时钟/触摸按键/低功耗 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)

页: [1]
查看完整版本: 请教!8H4K64TL-pin32的LED驱动应用失败【原因找到、结贴】