找回密码
 立即注册
查看: 414|回复: 6

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

[复制链接]
  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 125 天

    [LV.7]常住居民III

    30

    主题

    107

    回帖

    928

    积分

    高级会员

    积分
    928
    发表于 2023-6-11 21:25:31 | 显示全部楼层 |阅读模式
    本帖最后由 乐此不疲 于 2023-6-12 11:52 编辑

    为了测试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。
    测试代码如下:

    1. void main()
    2. {
    3. GPIO_set();//预置所有I/O口全部为准双向口  
    4. P_SW2 |= 0x80;//允许操作扩展SFR(XSFR)
    5. //P1IE &= 0x3f;                        //关闭外接晶振引脚(P1.6、P1.7)的数字通道
    6. //XOSCCR = 0xc0;                //启动外部晶振
    7. //while (!(XOSCCR & 1));//等待时钟稳定
    8. //CLKDIV = 0x00;                //时钟不分频
    9. //CKSEL = 0x01;                        //选择外部晶振
    10. P2M0 = 0xff; P2M1 = 0x00; //COM0~COM7线设置为推挽输出
    11. P0M0 = 0x0f; P0M1 = 0x00; //SEG8~SEG11(P0.0~P0.3)线设置为推挽输出、低4位推挽高4位准双向输出
    12. P3M0 = 0xf0; P3M1 = 0x00; //SEG12~SEG15(P3.4~P3.7)线设置为推挽输出、高4位推挽低4位准双向输出
    13. P2DR = 0x00;        //COM0~COM7线设置为强电流驱动
    14. P0DR = 0xf0;        //SEG8~SEG11线设置为强电流驱动、低4位强电流输出
    15. P3DR = 0x0f;        //SEG12~SEG15线设置为强电流驱动、高4位强电流输出
    16. COMEN  = 0xff;        //使能8个COM
    17. //SEGENL = 0x00;        //不使能SEG0-SEG7
    18. SEGENH = 0xff;        //使能SEG8-SEG15
    19. 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)
    20. LEDCKS = 8;
    21. COM3_DAL = 0x00;//显示熄屏
    22. COM4_DAL = 0x6b;//显示2
    23. COM5_DAL = 0x33;//显示3
    24. COM6_DAL = 0x1e;//显示4
    25. COM7_DAL = 0xff;//显示显示全亮
    26. P37=1;
    27. while(1)
    28. {
    29. /*
    30. P00=0; //a-SEG8
    31. P01=0; //b-SEG9
    32. P02=0; //f-SEG10
    33. P03=0; //g-SEG11
    34. P34=0; //c-SEG12
    35. P35=0; //e-SEG14
    36. P36=0; //d-SEG13
    37. for(i=0;i<5;i++)
    38. {
    39. P2=0x08<<i;
    40. P20=1;//关闭背景灯
    41. delay_ms(300);
    42. }
    43. */
    44. }
    45. }
    复制代码
    如果不使用硬件LED驱动功能,而是使用I/O口直接驱动(使用主循环中的代码可以交替点亮各个数码管)是可以正常显示的。




    回复 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3008

    回帖

    6783

    积分

    超级版主

    积分
    6783
    发表于 2023-6-11 22:51:31 | 显示全部楼层
    请参考:
    STC8H4K64TL-LED数码管自动扫描显示相关程序.rar (2.52 MB, 下载次数: 27)
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 125 天

    [LV.7]常住居民III

    30

    主题

    107

    回帖

    928

    积分

    高级会员

    积分
    928
     楼主| 发表于 2023-6-12 10:14:51 | 显示全部楼层

    我用的就是你分享的代码。
    777.jpg

    源代码如下:

    1. /*********************************************************/
    2. #define MAIN_Fosc        11059200L        //定义主时钟
    3. #include        "..\..\STC8Hxxx.h"
    4. /*************        功能说明        *************
    5. 驱动8段16个共阳数码管自动扫描显示.
    6. P4.0~P4.7: 接SEG0~SEG7,  这8根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
    7. P0.0~P0.3: 接SEG8~SEG11, 这4根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
    8. P3.4~P3.7: 接SEG12~SEG15,这4根SEG线跟LED连接要串联限流电阻(建议300欧姆以上).
    9. P2.0~P2.7: 接COM0~COM7
    10. P4.0 P4.1 P4.2 P4.3 P4.4 P4.5 P4.6 P4.7    P0.0 P0.1 P0.2  P0.3  P3.4  P3.5  P3.6  P3.7
    11. SEG0 SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7    SEG8 SEG9 SEG10 SEG11 SEG12 SEG13 SEG14 SEG15
    12. A    B    C    D    E    F    G    H       A    B     C     D     E     F     G     H     
    13. P2.0-COM0
    14. P21.-COM1
    15. P22.-COM2
    16. P23.-COM3
    17. P24.-COM4
    18. P25.-COM5
    19. P26.-COM6
    20. P27.-COM7
    21. ******************************************/
    22. /*************        本地常量声明        **************/
    23. /*************        本地变量声明        **************/
    24. /*************        本地函数声明        **************/
    25. void  delay_ms(u8 ms);
    26. /****************  外部函数声明和外部变量声明 *****************/
    27. u8 code T_LED_CODE[]={                                                //标准字库
    28. //代码            0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
    29. //显示字符   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    30.             0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
    31. //代码            0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
    32. //显示字符   0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   空
    33.             0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00};
    34.        
    35. //共阳数码管字库导入, i为LED位置0~15, dis为要显示的代码 0~9, A~F, 1.~9., 空
    36. void        LoadLED_B(u8 i, u8 dis)
    37. {
    38.         u8        xdata *px;
    39.        
    40.         px = &COM0_DAL + 15 - i;                //PCB布局低位数码管在右边, 所以用(15-i)反一下
    41.         *px = T_LED_CODE[dis & 0x0f];
    42. }
    43. /**********************************************/
    44. void main(void)
    45. {
    46.         u8        i;
    47.         P_SW2 |= 0x80;        //允许访问XSFR(扩展特殊功能寄存器)
    48. //        XOSCCR = 0xc0;           //启动外部晶振
    49. //        while (!(XOSCCR & 1));   //等待时钟稳定
    50. //        CLKDIV = 0x00;           //时钟不分频
    51. //        CKSEL = 0x01;            //选择外部晶振
    52.         P2n_push_pull(0xff);        //COM0~COM7线设置为推挽输出
    53.         P4n_push_pull(0xff);        //SEG0~SEG7(P4.0~P4.7)线设置为推挽输出
    54.         P0n_push_pull(0x0f);        //SEG8~SEG11(P0.0~P0.3)线设置为推挽输出
    55.         P3n_push_pull(0xf0);        //SEG12~SEG15(P3.4~P3.7)线设置为推挽输出
    56.         P2DR = 0x00;        //COM0~COM7线设置为强电流驱动
    57.         P4DR = 0x00;        //SEG0~SEG7线设置为强电流驱动
    58.         P0DR = 0xf0;        //SEG8~SEG11线设置为强电流驱动
    59.         P3DR = 0x0f;        //SEG12~SEG15线设置为强电流驱动
    60.         COMEN  = 0xff;        //允许8个COM
    61.         SEGENL = 0xff;        //允许8个SEG 低字节
    62.         SEGENH = 0xff;        //允许8个SEG 高字节
    63.         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
    64.         LEDCKS = 8;                //数码管COM扫描显示的主频时钟数 = 160*9*LEDCKS, 每个COM显示时间=1440*LEDCKS/fosc(MHz) us, COM扫描频率=fosc/(1440*LEDCKS *COM数).
    65.                                         //例如 fosc = 11.0592MHz, 8个COM, LEDCKS = 8, 则每个COM显示时间=1440*8/11.0592 = 1042 us, COM扫描频率=11059200/(1440*8*8)=120Hz.
    66.                                         //已知扫描时间t(us)计算 LEDCKS = t*fosc(MHz)/1440, 比如fosc = 24MHz, 要求1个COM扫描1ms, 则 LEDCKS = 1000*24/1440 = 16.7, 取整数17.
    67.         for(i=0; i<16; i++)       
    68.        
    69.         LoadLED_B(i,15-i);        //共阳,显示FEDCBA9876543210
    70.        
    71.        
    72.         while (1)
    73.         {
    74.                 //刷新COM0_DAL~COM7_DAL, COM0_DAH~COM7_DAH,即可刷新共阳显示内容.
    75.                
    76.         }
    77. }
    复制代码




    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3008

    回帖

    6783

    积分

    超级版主

    积分
    6783
    发表于 2023-6-12 10:27:01 | 显示全部楼层
    示波器看一下输出COM信号有吗?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 125 天

    [LV.7]常住居民III

    30

    主题

    107

    回帖

    928

    积分

    高级会员

    积分
    928
     楼主| 发表于 2023-6-12 10:30:54 | 显示全部楼层
    本帖最后由 乐此不疲 于 2023-6-12 10:39 编辑

    多谢梁工指点,问题已经解决了,再谢!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 125 天

    [LV.7]常住居民III

    30

    主题

    107

    回帖

    928

    积分

    高级会员

    积分
    928
     楼主| 发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3008

    回帖

    6783

    积分

    超级版主

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

    我的例子里说明得很清楚的。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-15 14:15 , Processed in 0.070567 second(s), 56 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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