找回密码
 立即注册
查看: 1279|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2023-6-11 21:25:31 | 显示全部楼层 |阅读模式
为了测试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口直接驱动(使用主循环中的代码可以交替点亮各个数码管)是可以正常显示的。






回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 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. }
复制代码




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-30 05:40:21

5

主题

12

回帖

131

积分

注册会员

积分
131
发表于 2024-10-18 18:28:43 | 显示全部楼层
我现在用这个8H4K64TL可以点亮
由8个0603的led灯组成的一个8段显示屏,
但是亮度还是不够,如果我想再提高亮度有没有什么办法呀。
软件上已调成最高亮度。硬件将限流电阻也全去掉了。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-10-18 19:44:29 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:42 , Processed in 0.158082 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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