找回密码
 立即注册
查看: 73|回复: 12

188数码管显示问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 09:15 | 显示全部楼层 |阅读模式
求大佬帮助!在使用188数码管显示数字时,可能因为使用查理复用原理导致拉高拉低过快,导致数码管的一些灯的不显示和多显示问题怎么解决? SMG.c (5.72 KB, 下载次数: 2)
188数码管.png


回复

使用道具 举报 送花

3

主题

2059

回帖

966

积分

等待验证会员

积分
966
发表于 昨天 09:18 | 显示全部楼层
针对您提到的188数码管在使用查理复用(Charlieplexing)原理时出现的显示异常问题,如部分LED不亮或误亮,以下是专业分析与解决方案:

一、问题分析

1. 查理复用原理简介  
   查理复用是一种通过控制I/O端口的输入/输出状态,实现多路LED显示的技术。其核心在于利用单个引脚在不同状态下作为驱动或感应端,从而减少所需的I/O数量。然而,该技术对时序和电压控制要求较高。

2. 可能原因  
时序控制不当:查理复用依赖精确的扫描周期,若刷新频率过低或时序混乱,可能导致某些LED未能及时响应。
电压波动或电流不足:LED点亮需要足够的驱动电流,若电源不稳定或电路设计不合理,可能造成部分LED无法正常工作。
引脚配置错误:未正确设置I/O方向或电平,可能导致部分LED处于高阻态或被误触发。
硬件干扰:共阴/共阳接法错误或外部噪声干扰,也可能导致显示异常。

二、解决方案建议

1. 优化时序控制
提高刷新频率:确保每帧刷新时间足够短(通常建议高于60Hz),以避免人眼察觉闪烁,同时保证所有LED能被正确点亮。
严格控制扫描顺序:按照设计文档中的逻辑顺序逐个激活LED,避免因跳变导致信号干扰。

2. 检查硬件连接与电源
确认共阴/共阳接法:根据数码管类型(共阴或共阳)正确连接电源和地线,避免因极性错误导致部分LED不亮。
增强电源稳定性:使用稳压器或滤波电容(如10μF电解电容)稳定供电,防止电压波动影响显示效果。
增加限流电阻:为每个LED添加适当阻值的限流电阻(一般推荐220Ω~330Ω),避免过流损坏或亮度不均。

3. 验证I/O配置
确保I/O方向正确:在查理复用中,需动态切换I/O引脚的输入/输出状态,确保每次仅有一个引脚为输出,其余为输入或高阻态。
避免浮空引脚:使用上拉/下拉电阻或软件配置为高阻态,防止引脚悬空引发误触发。

4. 排查干扰与信号完整性
缩短走线距离:尽量减少I/O引脚与数码管之间的走线长度,降低寄生电容和电感的影响。
屏蔽干扰源:若系统存在高频噪声,可考虑在电源端加装磁珠或使用屏蔽线。

三、调试建议
逐步测试:从简单模式(如单独点亮一个LED)开始,逐步扩展至复杂场景,定位具体故障点。
示波器辅助:使用示波器观察I/O信号波形,确保高低电平符合预期,无毛刺或抖动。
代码逻辑检查:确保程序中未出现逻辑错误,如重复激活同一引脚或未及时关闭其他引脚。

四、总结

188数码管在查理复用下的显示问题,主要源于时序、电源、硬件配置及信号干扰等因素。通过优化时序控制、完善电源设计、规范I/O配置及排查干扰,可有效解决显示异常问题。如问题仍未解决,建议进一步检查硬件布局或提供更详细的电路图以便深入分析。

如需进一步技术支持,请提供更多系统参数或代码片段,我们将为您定制化分析。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-08-13 02:13:34
已绑定手机

39

主题

2394

回帖

3185

积分

荣誉版主

积分
3185
发表于 昨天 10:43 | 显示全部楼层
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 11:00 | 显示全部楼层
  1. #include "SMG.h"
  2. //数码管
  3. //P13->P1
  4. //P15->P2
  5. //P54->P3
  6. //P11->P4
  7. //P31->P5
  8. //高阻输入
  9. #define  P0_MODE_IN_HIZ(Pin)                        P0M1 |= (Pin), P0M0 &= ~(Pin);
  10. #define  P1_MODE_IN_HIZ(Pin)                        P1M1 |= (Pin), P1M0 &= ~(Pin);
  11. #define  P2_MODE_IN_HIZ(Pin)                        P2M1 |= (Pin), P2M0 &= ~(Pin);
  12. #define  P3_MODE_IN_HIZ(Pin)                        P3M1 |= (Pin), P3M0 &= ~(Pin);
  13. #define  P4_MODE_IN_HIZ(Pin)                        P4M1 |= (Pin), P4M0 &= ~(Pin);
  14. #define  P5_MODE_IN_HIZ(Pin)                        P5M1 |= (Pin), P5M0 &= ~(Pin);
  15. #define  P6_MODE_IN_HIZ(Pin)                        P6M1 |= (Pin), P6M0 &= ~(Pin);
  16. #define  P7_MODE_IN_HIZ(Pin)                        P7M1 |= (Pin), P7M0 &= ~(Pin);
  17. //推挽输出
  18. #define  P0_MODE_OUT_PP(Pin)                        P0M1 &= ~(Pin), P0M0 |= (Pin);
  19. #define  P1_MODE_OUT_PP(Pin)                        P1M1 &= ~(Pin), P1M0 |= (Pin);
  20. #define  P2_MODE_OUT_PP(Pin)                        P2M1 &= ~(Pin), P2M0 |= (Pin);
  21. #define  P3_MODE_OUT_PP(Pin)                        P3M1 &= ~(Pin), P3M0 |= (Pin);
  22. #define  P4_MODE_OUT_PP(Pin)                        P4M1 &= ~(Pin), P4M0 |= (Pin);
  23. #define  P5_MODE_OUT_PP(Pin)                        P5M1 &= ~(Pin), P5M0 |= (Pin);
  24. #define  P6_MODE_OUT_PP(Pin)                        P6M1 &= ~(Pin), P6M0 |= (Pin);
  25. #define  P7_MODE_OUT_PP(Pin)                        P7M1 &= ~(Pin), P7M0 |= (Pin);
  26. sbit PSEG_1 = P1^3;
  27. sbit PSEG_2 = P1^5;
  28. sbit PSEG_3 = P5^4;
  29. sbit PSEG_4 = P1^1;
  30. sbit PSEG_5 = P3^1;
  31. #define PIN1_IN() P1_MODE_IN_HIZ(0x08);                                                       //把单片机IO口配置为高阻输入
  32. #define PIN2_IN() P1_MODE_IN_HIZ(0x20);
  33. #define PIN3_IN() P5_MODE_IN_HIZ(0x10);
  34. #define PIN4_IN() P1_MODE_IN_HIZ(0x02);
  35. #define PIN5_IN() P3_MODE_IN_HIZ(0x02);
  36. #define PIN1_L() P1_MODE_OUT_PP(0x08);PSEG_1 = 0;   //配置为推挽输出,且拉低
  37. #define PIN2_L() P1_MODE_OUT_PP(0x20);PSEG_2 = 0;
  38. #define PIN3_L() P5_MODE_OUT_PP(0x10);PSEG_3 = 0;
  39. #define PIN4_L() P1_MODE_OUT_PP(0x02);PSEG_4 = 0;
  40. #define PIN5_L() P3_MODE_OUT_PP(0x02);PSEG_5 = 0;
  41. #define PIN1_H() P1_MODE_OUT_PP(0x08);PSEG_1 = 1;  //配置为推挽输出,且拉高
  42. #define PIN2_H() P1_MODE_OUT_PP(0x20);PSEG_2 = 1;
  43. #define PIN3_H() P5_MODE_OUT_PP(0x10);PSEG_3 = 1;
  44. #define PIN4_H() P1_MODE_OUT_PP(0x02);PSEG_4 = 1;
  45. #define PIN5_H() P3_MODE_OUT_PP(0x02);PSEG_5 = 1;
  46. /************************************************************************************/
  47. void LED_GPIO_Init(void)//初始化IO口
  48. {  
  49. //        P11 = 0;
  50. //                                P13 = 0;
  51. //                                P15 = 0;
  52. //                                P31 = 0;
  53. //                                P54 = 0;
  54.                 //P13,P11,P15
  55.                 P1_MODE_OUT_PP( 0x02 | 0x08 | 0x20 );
  56.                 //P31
  57.                 P3_MODE_OUT_PP( 0x02 );
  58.                 //P54
  59.                 P5_MODE_OUT_PP( 0x10 );
  60.                 Set_AllPin_INPUT();
  61. }
  62. /********************************熄灭所有数码管***********************************/
  63. void Set_AllPin_INPUT(void)
  64. {
  65. //                P11 = 1;
  66. //                P13 = 1;
  67. //                P15 = 1;
  68. //                P31 = 1;
  69. //                P54 = 1;
  70.                 PIN1_IN();//把单片机IO口配置为输入模式
  71.                 PIN2_IN();
  72.                 PIN3_IN();
  73.                 PIN4_IN();
  74.                 PIN5_IN();
  75. }
  76. unsigned char bai=0,shi=0,ge=0;//百位,十位,个位,
  77. unsigned short display_sram=0;
  78. unsigned short code Segment[3][11]={
  79.   {0x0000,0x0006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},//百位
  80.   {0x0770,0x0420,0x0741,0x0661,0x0431,0x0271,0x0371,0x0460,0x0771,0x0671,0x0000},//十位
  81.   {0xE888,0x8080,0xD808,0xD880,0xB080,0x7880,0x7888,0x8880,0xF888,0xF880,0x0000} //个位
  82.         };
  83. // 扫描函数 - 确保所有段线明确输出高低电平
  84. void Display_Scan1(void)
  85. {
  86.     if(display_sram & 0x8000) {
  87.         PIN2_H();
  88.     } else {
  89.         PIN2_L();
  90.     }
  91.    
  92.     if(display_sram & 0x4000) {
  93.         PIN3_H();
  94.     } else {
  95.         PIN3_L();
  96.     }
  97.    
  98.     if(display_sram & 0x2000) {
  99.         PIN4_H();
  100.     } else {
  101.         PIN4_L();
  102.     }
  103.    
  104.     if(display_sram & 0x1000) {
  105.         PIN5_H();
  106.     } else {
  107.         PIN5_L();
  108.     }
  109.    
  110.     PIN1_L();  // 最后使能位选
  111. }
  112. void Display_Scan2(void)
  113. {
  114.     if(display_sram & 0x0800) {
  115.         PIN1_H();
  116.     } else {
  117.         PIN1_L();
  118.     }
  119.    
  120.     if(display_sram & 0x0400) {
  121.         PIN3_H();
  122.     } else {
  123.         PIN3_L();
  124.     }
  125.    
  126.     if(display_sram & 0x0200) {
  127.         PIN4_H();
  128.     } else {
  129.         PIN4_L();
  130.     }
  131.    
  132.     if(display_sram & 0x0100) {
  133.         PIN5_H();
  134.     } else {
  135.         PIN5_L();
  136.     }
  137.    
  138.     PIN2_L();  // 使能位选
  139. }
  140. void Display_Scan3(void)
  141. {
  142.     if(display_sram & 0x0080) {
  143.         PIN1_H();
  144.     } else {
  145.         PIN1_L();
  146.     }
  147.    
  148.     if(display_sram & 0x0040) {
  149.         PIN2_H();
  150.     } else {
  151.         PIN2_L();
  152.     }
  153.    
  154.     if(display_sram & 0x0020) {
  155.         PIN4_H();
  156.     } else {
  157.         PIN4_L();
  158.     }
  159.    
  160.     if(display_sram & 0x0010) {
  161.         PIN5_H();
  162.     } else {
  163.         PIN5_L();
  164.     }
  165.    
  166.     PIN3_L();  // 使能位选
  167. }
  168. void Display_Scan4(void)
  169. {
  170.     if(display_sram & 0x0008) {
  171.         PIN1_H();
  172.     } else {
  173.         PIN1_L();
  174.     }
  175.    
  176.     if(display_sram & 0x0004) {
  177.         PIN2_H();
  178.     } else {
  179.         PIN2_L();
  180.     }
  181.    
  182.     if(display_sram & 0x0002) {
  183.         PIN3_H();
  184.     } else {
  185.         PIN3_L();
  186.     }
  187.    
  188.     if(display_sram & 0x0001) {
  189.         PIN5_H();
  190.     } else {
  191.         PIN5_L();
  192.     }
  193.    
  194.     PIN4_L();  // 使能位选
  195. }
  196. /****************************显示函数***********************************/
  197. //放在定时器中断函数,5ms运行一次,扫描一轮需要4*5ms=20ms,
  198. //也就是50Hz的刷新频率,如果感觉闪烁,可以4ms运行。
  199. void Display_tube(void)
  200. {
  201.     static unsigned char case_cnt = 0;
  202.     Set_AllPin_INPUT();  // 先关闭所有位选
  203.     display_sram = Segment[0][bai] | Segment[1][shi] | Segment[2][ge];
  204.    
  205.     switch(case_cnt) {
  206.         case 0: Display_Scan1(); break;
  207.         case 1: Display_Scan2(); break;
  208.         case 2: Display_Scan3(); break;
  209.         case 3: Display_Scan4(); break;
  210.         default: case_cnt = 0; return;
  211.     }
  212.     case_cnt++;
  213.     if(case_cnt >= 4) case_cnt = 0;
  214. }
  215. void Dispaly_Dig(unsigned int dig)//拆分
  216. {        
  217.         bai =  dig/100;
  218.         shi = (dig/10) %10;
  219.         ge  =  dig%10;
  220.         Display_tube();
  221. }
复制代码

主要是我这个代码不清楚哪有问题。参考的代码是:https://blog.csdn.net/weixin_42401119/article/details/120704663
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 11:01 | 显示全部楼层
晓*** 发表于 2025-8-13 10:43
https://www.stcaimcu.com/thread-7580-1-1.html

感谢,我先阅读一下您的文章。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 11:02 | 显示全部楼层
晓*** 发表于 2025-8-13 10:43
https://www.stcaimcu.com/thread-7580-1-1.html

这个数码管在PCB布线时,每一个引脚的线长需要等长吗?我驱动显示不全有没有可能是这个问题呢?

点评

不需要等长,也不可能因为没有等长处理导致显示问题,这个IO频率远到不了考虑等长的地步。  详情 回复 发表于 昨天 23:24
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2025-08-13 09:45:20
已绑定手机

86

主题

5898

回帖

1万

积分

超级版主

积分
10659
发表于 昨天 11:24 | 显示全部楼层
逐段显示,只有亮的段两个IO推挽,其他IO高阻,点亮前后加延时

点评

也许,同一时间可以点亮多段呢,这样节约刷新时间,LED亮度也能提升。  详情 回复 发表于 昨天 23:21
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 13:45 | 显示全部楼层
晓*** 发表于 2025-8-13 10:43
https://www.stcaimcu.com/thread-7580-1-1.html

您好我这边按照您的驱动程序重新写了数码管的驱动程序,但是还是出现了显示错误的问题。
主函数:
  1. #include "Config.h"
  2. #include "SMG.h"
  3. #include "Delay.h"
  4. #include "Timer.h"
  5. //========================================================================
  6. void Sys_Init(void);
  7. void Project_Task(void);
  8. //========================================================================
  9. //========================================================================
  10. // 主函数
  11. void main()
  12. {
  13.                 Sys_Init();
  14.                
  15.                 while(1)
  16.                 {
  17.                         Project_Task();
  18.                 }
  19. }
  20. //========================================================================
  21. void Sys_Init(void)
  22. {
  23.                 P_SW2 |= 0x80;  // 使能访问XSFR
  24.                
  25.                 // 配置引脚       
  26.                 //P10_PWM1P,冷白
  27.                 //P12_PWM2P,红色
  28.                 //P14_PWM3P,绿色
  29.                 //P16_PWM4P,蓝色
  30.                 //P17_PWM5_2,暖白
  31.                 //P33_INT1,人体
  32.                 //P34_ADC12,光敏
  33.                 //P32_INT0_ADC10,拨键
  34.                 //P30_INT4,按键1
  35.                 //P37_INT3,按键2
  36.                 //数码管
  37.                 //P13->P1
  38.                 //P15->P2
  39.                 //P54->P3
  40.                 //P11->P4
  41.                 //P31->P5
  42.                 //P36_INT2_ADC14,充电
  43.                 //P35_ADC13,电池电压
  44.                 P1M1 = BIN(00101010);  
  45.                 P1M0 = BIN(11010101);
  46.                 P3M1 = BIN(01111110);  
  47.                 P3M0 = BIN(00000000);
  48.     P5M1 = BIN(00010000);
  49.                 P5M0 = BIN(00000000);
  50.                
  51.                 P10 = 0;
  52.                 P12 = 0;
  53.                 P14 = 0;
  54.                 P16 = 0;
  55.                 P17 = 0;
  56.                
  57.                 SMG_GPIO_Init();
  58.                 Timer0_Init();
  59.                 Timer1_Init();
  60.                 EA = 1;
  61. }
  62. //========================================================================
  63. void Project_Task(void)
  64. {
  65.         display(0,0,0,0,1);       
  66. }
复制代码


数码管驱动:
  1. #include "SMG.h"
  2. //数码管
  3. //P13->P1
  4. //P15->P2
  5. //P54->P3
  6. //P11->P4
  7. //P31->P5
  8. //高阻输入
  9. #define  P0_MODE_IN_HIZ(Pin)                        P0M1 |= (Pin), P0M0 &= ~(Pin);
  10. #define  P1_MODE_IN_HIZ(Pin)                        P1M1 |= (Pin), P1M0 &= ~(Pin);
  11. #define  P2_MODE_IN_HIZ(Pin)                        P2M1 |= (Pin), P2M0 &= ~(Pin);
  12. #define  P3_MODE_IN_HIZ(Pin)                        P3M1 |= (Pin), P3M0 &= ~(Pin);
  13. #define  P4_MODE_IN_HIZ(Pin)                        P4M1 |= (Pin), P4M0 &= ~(Pin);
  14. #define  P5_MODE_IN_HIZ(Pin)                        P5M1 |= (Pin), P5M0 &= ~(Pin);
  15. #define  P6_MODE_IN_HIZ(Pin)                        P6M1 |= (Pin), P6M0 &= ~(Pin);
  16. #define  P7_MODE_IN_HIZ(Pin)                        P7M1 |= (Pin), P7M0 &= ~(Pin);
  17. //推挽输出
  18. #define  P0_MODE_OUT_PP(Pin)                        P0M1 &= ~(Pin), P0M0 |= (Pin);
  19. #define  P1_MODE_OUT_PP(Pin)                        P1M1 &= ~(Pin), P1M0 |= (Pin);
  20. #define  P2_MODE_OUT_PP(Pin)                        P2M1 &= ~(Pin), P2M0 |= (Pin);
  21. #define  P3_MODE_OUT_PP(Pin)                        P3M1 &= ~(Pin), P3M0 |= (Pin);
  22. #define  P4_MODE_OUT_PP(Pin)                        P4M1 &= ~(Pin), P4M0 |= (Pin);
  23. #define  P5_MODE_OUT_PP(Pin)                        P5M1 &= ~(Pin), P5M0 |= (Pin);
  24. #define  P6_MODE_OUT_PP(Pin)                        P6M1 &= ~(Pin), P6M0 |= (Pin);
  25. #define  P7_MODE_OUT_PP(Pin)                        P7M1 &= ~(Pin), P7M0 |= (Pin);
  26. //准双向口
  27. #define  P0_MODE_IO_PU(Pin)                                P0M1 &= ~(Pin), P0M0 &= ~(Pin);
  28. #define  P1_MODE_IO_PU(Pin)                                P1M1 &= ~(Pin), P1M0 &= ~(Pin);
  29. #define  P2_MODE_IO_PU(Pin)                                P2M1 &= ~(Pin), P2M0 &= ~(Pin);
  30. #define  P3_MODE_IO_PU(Pin)                                P3M1 &= ~(Pin), P3M0 &= ~(Pin);
  31. #define  P4_MODE_IO_PU(Pin)                                P4M1 &= ~(Pin), P4M0 &= ~(Pin);
  32. #define  P5_MODE_IO_PU(Pin)                                P5M1 &= ~(Pin), P5M0 &= ~(Pin);
  33. #define  P6_MODE_IO_PU(Pin)                                P6M1 &= ~(Pin), P6M0 &= ~(Pin);
  34. #define  P7_MODE_IO_PU(Pin)                                P7M1 &= ~(Pin), P7M0 &= ~(Pin);
  35. sbit PSEG_1 = P1^3;
  36. sbit PSEG_2 = P1^5;
  37. sbit PSEG_3 = P5^4;
  38. sbit PSEG_4 = P1^1;
  39. sbit PSEG_5 = P3^1;
  40. #define PIN1_IN() P1_MODE_IN_HIZ(0x08);                                                       //把单片机IO口配置为高阻输入
  41. #define PIN2_IN() P1_MODE_IN_HIZ(0x20);
  42. #define PIN3_IN() P5_MODE_IN_HIZ(0x10);
  43. #define PIN4_IN() P1_MODE_IN_HIZ(0x02);
  44. #define PIN5_IN() P3_MODE_IN_HIZ(0x02);
  45. #define PIN1_OUT_L() P1_MODE_OUT_PP(0x08);PSEG_1 = 0;   //配置为推挽输出,且拉低
  46. #define PIN2_OUT_L() P1_MODE_OUT_PP(0x20);PSEG_2 = 0;
  47. #define PIN3_OUT_L() P5_MODE_OUT_PP(0x10);PSEG_3 = 0;
  48. #define PIN4_OUT_L() P1_MODE_OUT_PP(0x02);PSEG_4 = 0;
  49. #define PIN5_OUT_L() P3_MODE_OUT_PP(0x02);PSEG_5 = 0;
  50. #define PIN1_OUT_H() P1_MODE_OUT_PP(0x08);PSEG_1 = 1;  //配置为推挽输出,且拉高
  51. #define PIN2_OUT_H() P1_MODE_OUT_PP(0x20);PSEG_2 = 1;
  52. #define PIN3_OUT_H() P5_MODE_OUT_PP(0x10);PSEG_3 = 1;
  53. #define PIN4_OUT_H() P1_MODE_OUT_PP(0x02);PSEG_4 = 1;
  54. #define PIN5_OUT_H() P3_MODE_OUT_PP(0x02);PSEG_5 = 1;
  55. //各个LED灯珠代表的位
  56. //#define A1 0x00000001
  57. #define B1 0x00000002
  58. #define C1 0x00000004
  59. //#define D1 0x00000008
  60. //#define E1 0x00000010
  61. //#define F1 0x00000020
  62. //#define G1 0x00000040
  63. #define A2 0x00000080
  64. #define B2 0x00000100
  65. #define C2 0x00000200
  66. #define D2 0x00000400
  67. #define E2 0x00000800
  68. #define F2 0x00001000
  69. #define G2 0x00002000
  70. #define A3 0x00004000
  71. #define B3 0x00008000
  72. #define C3 0x00010000
  73. #define D3 0x00020000
  74. #define E3 0x00040000
  75. #define F3 0x00080000
  76. #define G3 0x00100000
  77. #define DP1 0x00200000
  78. #define DP2 0x00400000
  79. #define K1 0x00800000
  80. #define K2 0x01000000
  81. u32 xdata display_num;
  82. //第一个7段码从0~9对应的编码
  83. code u32 digit1[11] =
  84. {
  85.         0,         //0
  86.         B1|C1,     //1
  87.         0,         //2
  88.         0,         //3
  89.         0,         //4
  90.         0,         //5
  91.         0,         //6
  92.         0,         //7
  93.         0,                                 //8
  94.         0,         //9
  95.         0,         //黑 消隐
  96. };
  97. //第二个7段码从0~9对应的编码
  98. code u32 digit2[11] =
  99. {
  100.         A2|B2|C2|D2|E2|F2,         //0
  101.         B2|C2,                     //1
  102.         A2|B2|D2|E2|G2,            //2
  103.         A2|B2|C2|D2|G2,            //3
  104.         B2|C2|F2|G2,               //4
  105.         A2|C2|D2|F2|G2,            //5
  106.         A2|C2|D2|E2|F2|G2,         //6
  107.         A2|B2|C2,                  //7
  108.         A2|B2|C2|D2|E2|F2|G2,                  //8
  109.         A2|B2|C2|D2|F2|G2,         //9
  110.         0,                                           //黑 消隐
  111. };
  112. //第三个7段码从0~9对应的编码
  113. code u32 digit3[11] =
  114. {
  115.         A3|B3|C3|D3|E3|F3,         //0
  116.         B3|C3,                     //1
  117.         A3|B3|D3|E3|G3,            //2
  118.         A3|B3|C3|D3|G3,            //3
  119.         B3|C3|F3|G3,               //4
  120.         A3|C3|D3|F3|G3,            //5
  121.         A3|C3|D3|E3|F3|G3,         //6
  122.         A3|B3|C3,                  //7
  123.         A3|B3|C3|D3|E3|F3|G3,      //8
  124.         A3|B3|C3|D3|F3|G3,         //9
  125.         0,                               //黑 消隐
  126. };
  127. /************************************************************************************/
  128. void SMG_GPIO_Init(void)//初始化IO口
  129. {
  130.                 Set_AllPin_INPUT();
  131. }
  132. /********************************熄灭所有数码管***********************************/
  133. void Set_AllPin_INPUT(void)
  134. {
  135. //                P11 = 1;
  136. //                P13 = 1;
  137. //                P15 = 1;
  138. //                P31 = 1;
  139. //                P54 = 1;
  140.                 PIN1_IN();//把单片机IO口配置为输入模式
  141.                 PIN2_IN();
  142.                 PIN3_IN();
  143.                 PIN4_IN();
  144.                 PIN5_IN();
  145. }
  146. void display(u16 num,bit dp_1,bit dp_2,bit KK1,bit KK2)
  147. {
  148.         u8 num1,num2,num3;
  149.         num1 = num / 100;               //拆分出百位
  150.         num2 = (num % 100) / 10;          //拆分出十位
  151.         num3 = num % 10;                //拆分出个位               
  152.         display_num = digit1[num1] | digit2[num2] | digit3[num3];   
  153.         if(dp_1)  display_num |= DP1;   //暂未写消隐功能  可根据小数点位置和小数点前数字为零处理消隐
  154.         if(dp_2)  display_num |= DP1;
  155.         if(KK1)  display_num |= K1;
  156.         if(KK2)  display_num |= K2;
  157. }
  158. //刷数码管定时器 1000Hz  三个数码管平均333Hz
  159. void Timer0_Isr(void) interrupt 1
  160. {
  161.         static u8 sta;
  162.         Set_AllPin_INPUT();     //关闭数码管        
  163.         switch (sta)
  164.         {
  165.                 case 1:
  166.                         PIN1_OUT_L();
  167.                         if(display_num & B3) PIN2_OUT_H();   //1                B3        D3        F3        G3
  168.                         if(display_num & D3) PIN3_OUT_H();
  169.                         if(display_num & F1) PIN4_OUT_H();
  170.                         if(display_num & G2) PIN5_OUT_H();               
  171.                         sta++;
  172.                         break;
  173.                 case 2:
  174.                         PIN2_OUT_L();
  175.                         if(display_num & A3) PIN1_OUT_H();   //2                A3        B2        D2        E2        
  176.                         if(display_num & B2) PIN3_OUT_H();
  177.                         if(display_num & D2) PIN4_OUT_H();
  178.                         if(display_num & E2) PIN5_OUT_H();
  179. //                        if(display_num & DP1) PIN1_OUT_H();               
  180.                         sta++;
  181.                         break;
  182.                 case 3:               
  183.                         PIN3_OUT_L();
  184.                         if(display_num & C3) PIN1_OUT_H();   //3                C3        A2        C2        F2
  185.                         if(display_num & A2) PIN2_OUT_H();
  186.                         if(display_num & C2) PIN4_OUT_H();
  187.                         if(display_num & F2) PIN5_OUT_H();
  188. //                        if(display_num & DP2) PIN1_OUT_H();                        
  189.                         sta++;
  190.                         break;
  191.                 case 4:        
  192.                         PIN4_OUT_L();
  193.                         if(display_num & E3) PIN1_OUT_H();   //4                E3        C1        B1        G2
  194.                         if(display_num & C1) PIN2_OUT_H();
  195.                         if(display_num & B1) PIN3_OUT_H();
  196.                         if(display_num & G2) PIN5_OUT_H();               
  197.                         sta++;
  198.                         break;
  199.                 case 5:
  200.                         PIN5_OUT_L();
  201.                         if(display_num & DP1) PIN1_OUT_H();   //5                DP1        DP2        K1        K2
  202.                         if(display_num & DP2) PIN4_OUT_H();
  203.                         if(display_num & K1)  PIN3_OUT_H();
  204.                         if(display_num & K2)  PIN2_OUT_H();
  205.                         sta = 1;
  206.                         break;
  207. //                case 6:               
  208. //                        PIN6_OUT_L();
  209. //                        if(display_num & E2) PIN3_OUT_H();   //6                E2        D3        F3
  210. //                        if(display_num & D3) PIN4_OUT_H();
  211. //                        if(display_num & F3) PIN5_OUT_H();               
  212. //                        sta = 1;
  213. //                        break;
  214.                 default:
  215.                         sta = 1;
  216.                         break;
  217.         }
  218. }
复制代码


定时器初始化函数:
  1. #include "Timer.h"
  2. void Timer0_Init(void)                //1毫秒@24.000MHz
  3. {
  4.         AUXR |= 0x80;                        //定时器时钟1T模式
  5.         TMOD &= 0xF0;                        //设置定时器模式
  6.         TL0 = 0x40;                                //设置定时初始值
  7.         TH0 = 0xA2;                                //设置定时初始值
  8.         TF0 = 0;                                //清除TF0标志
  9.         TR0 = 1;                                //定时器0开始计时
  10.         ET0 = 1;                                //使能定时器0中断
  11. }
  12. void Timer1_Init(void)                //10毫秒@24.000MHz
  13. {
  14.         AUXR &= 0xBF;                        //定时器时钟12T模式
  15.         TMOD &= 0x0F;                        //设置定时器模式
  16.         TL1 = 0xE0;                                //设置定时初始值
  17.         TH1 = 0xB1;                                //设置定时初始值
  18.         TF1 = 0;                                //清除TF1标志
  19.         TR1 = 1;                                //定时器1开始计时
  20.         ET1 = 1;                                //使能定时器1中断
  21. }
复制代码


麻烦您帮我看一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 13:47 | 显示全部楼层
显示效果:
显示123、11、55、0四种,最后的两种图标显示没问题,但是会出现频闪。
显示123.jpg
显示55.jpg
显示11.jpg
显示00.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-13 09:15:54
已绑定手机

3

主题

18

回帖

85

积分

注册会员

积分
85
发表于 昨天 13:55 | 显示全部楼层
这是我选用的数码管和数码管的连线
数码管连线.png
188数码管.png
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-14 06:24 , Processed in 0.143996 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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