找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5740|回复: 12
收起左侧

6脚3位数码管驱动程序 求帮助

[复制链接]
ID:56665 发表于 2019-5-28 15:13 | 显示全部楼层 |阅读模式
我看到充电器上用的显示是用6脚3位数码管的,谁有这种数码管驱动请传上来学习学习。
回复

使用道具 举报

ID:56665 发表于 2019-5-28 15:34 | 显示全部楼层
这是数码管的电路图
6脚数码管电路图.JPG
回复

使用道具 举报

ID:56665 发表于 2019-6-27 14:44 | 显示全部楼层
已经搞好了,方法就是每一位每一段分别扫描,麻烦是有一点,硬件制约,硬件简单,软件就麻烦一点。
回复

使用道具 举报

ID:193008 发表于 2019-6-28 18:30 | 显示全部楼层
可以分享下代码吗?谢谢!
回复

使用道具 举报

ID:193008 发表于 2019-6-28 19:11 | 显示全部楼层
驱动代码分享下! 谢谢!
回复

使用道具 举报

ID:542764 发表于 2020-2-10 19:59 | 显示全部楼层
可以分享下代码吗?谢谢!
回复

使用道具 举报

ID:363678 发表于 2020-7-6 10:59 | 显示全部楼层
原理是知道,就是看软件怎么处理。
回复

使用道具 举报

ID:707500 发表于 2020-8-28 19:53 | 显示全部楼层
m182892 发表于 2019-6-27 14:44
已经搞好了,方法就是每一位每一段分别扫描,麻烦是有一点,硬件制约,硬件简单,软件就麻烦一点。

老哥上传代码学习学习
回复

使用道具 举报

ID:280512 发表于 2020-8-31 09:46 | 显示全部楼层
也可能有译码.6个脚显示?把那个段去掉了?
回复

使用道具 举报

ID:155507 发表于 2020-8-31 10:14 | 显示全部楼层
这种被叫做 Charlieplexing的方法可以用N个IO驱动N*(N-1)个LED。

6 个IO 可以驱动 30 个LED

这种数码管是由单片机I/O口直接驱动,I/O口要在工作在3态(高、低电平和高阻),驱动程序有点复杂。直接驱动每一个IO口吧,,没法省事了

这个是在内部将段引脚连接在一起了。一共8个段引脚,3个位引脚。如果是扫描显示和单个的用法一样。

如果使用的是扫描显示,程序完全都一样,认准管脚就行了。也可以自己写一段小程序,测定管脚。
每隔3~5秒显示一个段,a\b\c\d\e\f\g\h,一目了然。
回复

使用道具 举报

ID:155507 发表于 2020-8-31 10:41 | 显示全部楼层
这个帖子有答案
求助:可有认识这个小数码管的朋友?求资料或驱动方式 http://www.51hei.com/bbs/dpj-185110-1.html


  1. /*--------------------------------------------------------------------------*/
  2. /***@file  led_7c7s.c
  3.     @brief  7*7数据管显示屏蔽驱动
  4.     @details
  5.     @author wjq
  6.     @date
  7.     @note
  8. */
  9. /*----------------------------------------------------------------------------*/
  10. /**********************************************************************************************************************
  11.    --------------------------------------------
  12.    |  K1  K3   ----  ----    ----  ----   K6  |
  13.    |           |   | |   | . |   | |   |      |
  14.    |           ----  ----    ----  ----       |
  15.    |           |   | |   | . |   | |   |      |
  16.    |  K2  K4   ----  ----    ----  ----   K7  |
  17.    --------------------------------------------

  18.     7线LED屏阵列如下,其中A,B,C...为LED屏的段,0,1,2.... 表示对应的连接IO

  19. 参考下图表,当需要点亮某个段时,左边的拉高,右边的拉低点亮相应位置,
  20. 如要点亮1A段,则将0号IO拉高,1号IO拉低 ,如果我们要显示一个数据,则要依次扫描7个IO

  21.         0   1   2   3   4   5   6
  22.     0   X   1A  1B  1E  K4  K1  -
  23.     1   1F  X   2A  2B  2E  2D  -
  24.     2   1G  2F  X   K5  3B  K2  K7
  25.     3   1C  2G  3F  X   3C  4E  -
  26.     4   1D  2C  3G  3A  X   4C  4G
  27.     5   3D  K3  3E  4D  4F  X   4B
  28.     6   K6  K8  4A  X   -   -   X
  29. ************************************************************************************************************************/
  30. #include "include.h"
  31. #include "task_music.h"
  32. #include "user_fm.h"
  33. #include "task_clock.h"
  34. #include "task.h"


  35. u8 __idata batchargecout;
  36. #if LED_7P7S_EN
  37. //定义COM口是否是同一排P口的。比如都是P2口
  38. #define SAME_COM_P  0

  39. #if SAME_COM_P
  40. #define LED_COM       P2
  41. #define LED_COM_DIR   P2DIR
  42. #else
  43. #define LED_COM_0_ON  P2 |= BIT(2);
  44. #define LED_COM_1_ON  P2 |= BIT(3);
  45. #define LED_COM_2_ON  P2 |= BIT(4);
  46. #define LED_COM_3_ON  P2 |= BIT(5);
  47. #define LED_COM_4_ON  P2 |= BIT(6);
  48. #define LED_COM_5_ON  P3 |= BIT(0);
  49. #define LED_COM_6_ON  P3 |= BIT(1);

  50. #define LED_COM_0_OFF  P2 &= ~BIT(2);
  51. #define LED_COM_1_OFF  P2 &= ~BIT(3);
  52. #define LED_COM_2_OFF  P2 &= ~BIT(4);
  53. #define LED_COM_3_OFF  P2 &= ~BIT(5);
  54. #define LED_COM_4_OFF  P2 &= ~BIT(6);
  55. #define LED_COM_5_OFF  P3 &= ~BIT(0);
  56. #define LED_COM_6_OFF  P3 &= ~BIT(1);

  57. #define COM_DIR0_IN    P2DIR |= BIT(2);
  58. #define COM_DIR1_IN    P2DIR |= BIT(3);
  59. #define COM_DIR2_IN    P2DIR |= BIT(4);
  60. #define COM_DIR3_IN    P2DIR |= BIT(5);
  61. #define COM_DIR4_IN    P2DIR |= BIT(6);
  62. #define COM_DIR5_IN    P3DIR |= BIT(0);
  63. #define COM_DIR6_IN    P3DIR |= BIT(1);

  64. #define COM_DIR0_OUT    P2DIR &= ~BIT(2);
  65. #define COM_DIR1_OUT    P2DIR &= ~BIT(3);
  66. #define COM_DIR2_OUT    P2DIR &= ~BIT(4);
  67. #define COM_DIR3_OUT    P2DIR &= ~BIT(5);
  68. #define COM_DIR4_OUT    P2DIR &= ~BIT(6);
  69. #define COM_DIR5_OUT    P3DIR &= ~BIT(0);
  70. #define COM_DIR6_OUT    P3DIR &= ~BIT(1);

  71. #define ALL_COM_DIRIN  {P2DIR |= 0x7c;P3DIR |= 0x03;}
  72. #define ALL_COM_OFF    {P2 &= ~0x7c;   P3 &= ~0x03;}

  73. u8 LED_COM;
  74. u8 LED_COM_DIR;

  75. #endif

  76. extern u8 __idata bVoiceOn;

  77. static u8 __idata syslastbatval= 0xff;
  78. u8  __idata curMenu;
  79. u8 __idata LED_5com7seg_dispBuf[5];
  80. u8 p_disp_buff2_value[7];

  81. u8 __idata COM_T;
  82. u8 returnCount;

  83. bool __bdata HalfsecFlash;
  84. bool __bdata ftimeflag = false;

  85. u16 __idata inputNum;

  86. typedef void(*H)(void);

  87. //extern val

  88. extern type_task_music_ctl t_msc;
  89. extern type_task_fm_ctl t_fm;
  90. extern type_t_clock t_clock;
  91. extern u8 clockset_count;



  92. #pragma constseg=LED_TBL
  93. const u8 LED_7p7seg_Table[10] =
  94. {
  95.     LED_7p7seg_0,
  96.     LED_7p7seg_1,
  97.     LED_7p7seg_2,
  98.     LED_7p7seg_3,
  99.     LED_7p7seg_4,
  100.     LED_7p7seg_5,
  101.     LED_7p7seg_6,
  102.     LED_7p7seg_7,
  103.     LED_7p7seg_8,
  104.     LED_7p7seg_9
  105. };

  106. const u8 LED_7p7seg_repeatTable[4][3] =
  107. {
  108.     {LED_7p7seg_A,LED_7p7seg_L,LED_7p7seg_L},
  109.     {LED_7p7seg_F,LED_7p7seg_0,LED_7p7seg_L},
  110.     {LED_7p7seg_S,LED_7p7seg_I,LED_7p7seg_N},
  111.     {LED_7p7seg_R,LED_7p7seg_A,LED_7p7seg_N}
  112. };

  113. const u8 LED_7p7seg_eqTable[6][3] =
  114. {
  115.     {LED_7p7seg_N,LED_7p7seg_0,LED_7p7seg_R},
  116.     {LED_7p7seg_P,LED_7p7seg_0,LED_7p7seg_P},
  117.     {LED_7p7seg_R,LED_7p7seg_0,LED_7p7seg_C},
  118.     {LED_7p7seg_J,LED_7p7seg_A,LED_7p7seg_Z},
  119.     {LED_7p7seg_C,LED_7p7seg_L,LED_7p7seg_A},
  120.     {LED_7p7seg_C,LED_7p7seg_0,LED_7p7seg_U}
  121. };
  122. #pragma constseg=default

  123. /*----------------------------------------------------------------------------*/
  124. /**@brief LED显示函数,显示四位数字
  125.    @param num 需要显示的数字
  126.    @return 无
  127.    @note
  128. */
  129. /*----------------------------------------------------------------------------*/
  130. void DispNum_7p7seg(u16 num)@"LED_7COM_API"
  131. {
  132.     u16 numtmp;
  133.    
  134.     numtmp = num;
  135.    
  136.     u8 ii;
  137.     for(ii = 4; ii > 0; ii--)
  138.     {
  139.         LED_5com7seg_dispBuf[ii-1] = LED_7p7seg_Table[num % 10];
  140.         num /= 10;
  141.         /*  //如果是加快了扫屏频率或者是FM下面降频,调用DispNum_5com7seg时,有可能
  142.             //出现还在执行这个函数的时候,扫描以及把前面的“0”显示出来的效果
  143.         */
  144.         if((curMenu == MENU_FRE))
  145.         {
  146.           if(numtmp < 1000)
  147.           {
  148.             LED_5com7seg_dispBuf[0] = LED_7p7seg_BLANK;
  149.           }   
  150.           else if(numtmp < 100)
  151.           {
  152.             LED_5com7seg_dispBuf[1] = LED_7p7seg_BLANK;
  153.           }   
  154.           else if(numtmp < 10)
  155.           {
  156.             LED_5com7seg_dispBuf[2] = LED_7p7seg_BLANK;
  157.           }
  158.         }
  159.     }
  160. }

  161. /*----------------------------------------------------------------------------*/
  162. /**@brief LED显示函数,显示播放时间
  163.    @param 无
  164.    @return 无
  165.    @note
  166. */
  167. /*----------------------------------------------------------------------------*/
  168. void LED_playtime_display_7p7seg(void)@"LED_7COM_API"
  169. {
  170.     u8 a,b;

  171.     a = t_msc.cur_time.min / 10;
  172.     b = t_msc.cur_time.min - 10*a;
  173.     LED_5com7seg_dispBuf[0] = LED_7p7seg_Table[a];
  174.     LED_5com7seg_dispBuf[1] = LED_7p7seg_Table[b];

  175.     a = t_msc.cur_time.sec / 10;
  176.     b = t_msc.cur_time.sec - 10*a;
  177.     LED_5com7seg_dispBuf[2] = LED_7p7seg_Table[a];
  178.     LED_5com7seg_dispBuf[3] = LED_7p7seg_Table[b];
  179. }

  180. /*----------------------------------------------------------------------------*/
  181. /**@brief LED显示函数,显示音量
  182.    @param 无
  183.    @return 无
  184.    @note
  185. */
  186. /*----------------------------------------------------------------------------*/
  187. void Menu_VOL_7p7seg(void)@"LED_7COM_API"
  188. {
  189.     DispNum_7p7seg(sys_ctl.volume);
  190.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_V;
  191.     LED_5com7seg_dispBuf[0] =  LED_7p7seg_BLANK;
  192. }

  193. /*----------------------------------------------------------------------------*/
  194. /**@brief LED显示函数,显示音量
  195.    @param 无
  196.    @return 无
  197.    @note
  198. */
  199. /*----------------------------------------------------------------------------*/
  200. void Menu_Voice_Switch(void)@"LED_7COM_API"
  201. {
  202.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_V;
  203.    
  204.     LED_5com7seg_dispBuf[2] =  LED_7p7seg_0;
  205.     if(bVoiceOn)
  206.     {
  207.       LED_5com7seg_dispBuf[3] =  LED_7p7seg_N;
  208.     }
  209.     else
  210.     {
  211.       LED_5com7seg_dispBuf[3] =  LED_7p7seg_F;
  212.     }
  213. }



  214. /*----------------------------------------------------------------------------*/
  215. /**@brief LED显示函数,显示音量的‘V’和'P'
  216.    @param 无
  217.    @return 无
  218.    @note
  219. */
  220. /*----------------------------------------------------------------------------*/
  221. void Menu_VOLUP_7p7seg(void)@"LED_7COM_API"
  222. {
  223.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_V;
  224.     LED_5com7seg_dispBuf[2] =  LED_7p7seg_P;
  225. }


  226. /*----------------------------------------------------------------------------*/
  227. /**@brief LED显示函数,显示音量的‘D’和'N'
  228.    @param 无
  229.    @return 无
  230.    @note
  231. */
  232. /*----------------------------------------------------------------------------*/
  233. void Menu_VOLDOWN_7p7seg(void)@"LED_7COM_API"
  234. {
  235.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_D;
  236.     LED_5com7seg_dispBuf[2] =  LED_7p7seg_N;
  237. }

  238. /*----------------------------------------------------------------------------*/
  239. /**@brief LED显示函数,显示RTC
  240.    @param 无
  241.    @return 无
  242.    @note
  243. */
  244. /*----------------------------------------------------------------------------*/
  245. void Menu_RTC_7p7seg(void)@"LED_7COM_API"
  246. {
  247. #if TASK_RTC_EN
  248.    
  249.     u16 disptmp;
  250.   
  251.     disptmp = t_time.hour*100+ t_time.minute;

  252.     DispNum_7p7seg(disptmp);

  253.     LED_5com7seg_dispBuf[4] |= LED_DDOT;
  254.       
  255.     if((HalfsecFlash))
  256.     {
  257.       if(t_clock.sub_sta == STA_SHOW_CLOCK)//&&(!Alarm_Rtc_Flag))
  258.         LED_5com7seg_dispBuf[4] &= ~LED_DDOT;
  259.     }
  260.    
  261.     if((HalfsecFlash)&&(clockset_count >= (RETURN_TIME -1))&&(clockset_count < RETURN_TIME_RTCSET))
  262.     {  
  263.       if(t_clock.set_sta == STA_SET_TIME_HOUR)
  264.       {
  265.         LED_5com7seg_dispBuf[0] = 0;
  266.         LED_5com7seg_dispBuf[1] = 0;
  267.       }
  268.       else if(t_clock.set_sta == STA_SET_TIME_MIN)
  269.       {
  270.         LED_5com7seg_dispBuf[2] = 0;
  271.         LED_5com7seg_dispBuf[3] = 0;
  272.       }
  273.   }
  274. #endif   
  275.   
  276. }


  277. /*----------------------------------------------------------------------------*/
  278. /**@brief LED显示函数,显示FM模式下的频率
  279.    @param 无
  280.    @return 无
  281.    @note
  282. */
  283. /*----------------------------------------------------------------------------*/
  284. void Menu_FRE_7p7seg(void)@"LED_7COM_API"
  285. {
  286.     u16 fmfrq;
  287.    
  288.     fmfrq = t_fm.freq / 10;
  289.    
  290.     DispNum_7p7seg(fmfrq);

  291.     if(LED_5com7seg_dispBuf[0] == LED_7p7seg_0)
  292.         LED_5com7seg_dispBuf[0] = LED_7p7seg_BLANK;

  293.     LED_5com7seg_dispBuf[4] |= LED_FM;
  294.     LED_5com7seg_dispBuf[4] |= LED_FM_DOT;
  295. }


  296. /*----------------------------------------------------------------------------*/
  297. /**@brief LED显示函数,显示输入的数字
  298.    @param 无
  299.    @return 无
  300.    @note
  301. */
  302. /*----------------------------------------------------------------------------*/
  303. void Menu_Input_Number_7p7seg(void)@"LED_7COM_API"
  304. {
  305.     DispNum_7p7seg(inputNum);
  306. }

  307. /*----------------------------------------------------------------------------*/
  308. /**@brief LED显示函数,显示MP3模式下的播放时间和当前在线媒体:SD或者USB
  309.    @param 无
  310.    @return 无
  311.    @note
  312. */
  313. /*----------------------------------------------------------------------------*/
  314. void MENU_Play_7p7seg(void)@"LED_7COM_API"
  315. {
  316.     LED_playtime_display_7p7seg();

  317.     LED_5com7seg_dispBuf[4] |= /*LED_PLAY | */LED_DDOT;

  318.     if (fs_cur_dev() != DEVICE_UDISK)
  319.         LED_5com7seg_dispBuf[4] |= LED_SD;
  320.     else
  321.         LED_5com7seg_dispBuf[4] |= LED_USB;
  322. }

  323. /*----------------------------------------------------------------------------*/
  324. /**@brief LED显示函数,显示播放模式
  325.    @param 无
  326.    @return 无
  327.    @note
  328. */
  329. /*----------------------------------------------------------------------------*/
  330. void Menu_Play_Mode_7p7seg(void)@"LED_7COM_API"
  331. {
  332.     LED_5com7seg_dispBuf[0] = LED_7p7seg_BLANK;
  333.     LED_5com7seg_dispBuf[1] = LED_7p7seg_repeatTable[(u8)sys_ctl.mode_play][0];
  334.     LED_5com7seg_dispBuf[2] = LED_7p7seg_repeatTable[(u8)sys_ctl.mode_play][1];
  335.     LED_5com7seg_dispBuf[3] = LED_7p7seg_repeatTable[(u8)sys_ctl.mode_play][2];
  336. }

  337. /*----------------------------------------------------------------------------*/
  338. /**@brief LED显示函数,显示文件序号和当前在线媒体:SD或者USB
  339.    @param 无
  340.    @return 无
  341.    @note
  342. */
  343. /*----------------------------------------------------------------------------*/
  344. void Menu_Next_7p7seg(void)@"LED_7COM_API"
  345. {
  346.     DispNum_7p7seg(t_msc.music_num);

  347.     //LED_5com7seg_dispBuf[4] |= LED_PLAY;
  348.      
  349.     if (fs_cur_dev() != DEVICE_UDISK)
  350.         LED_5com7seg_dispBuf[4] |= LED_SD;
  351.     else
  352.         LED_5com7seg_dispBuf[4] |= LED_USB;
  353. }

  354. /*----------------------------------------------------------------------------*/
  355. /**@brief LED显示函数,显示文件序号和当前在线媒体:SD或者USB
  356.    @param 无
  357.    @return 无
  358.    @note
  359. */
  360. /*----------------------------------------------------------------------------*/
  361. void Menu_ALLNUM_7p7seg(void)@"LED_7COM_API"
  362. {
  363.     DispNum_7p7seg(t_msc.music_total);

  364.     //LED_5com7seg_dispBuf[4] |= LED_PLAY;
  365.      
  366.     if (fs_cur_dev() != DEVICE_UDISK)
  367.         LED_5com7seg_dispBuf[4] |= LED_SD;
  368.     else
  369.         LED_5com7seg_dispBuf[4] |= LED_USB;
  370. }


  371. /*----------------------------------------------------------------------------*/
  372. /**@brief LED显示函数,显示当前电台序号
  373.    @param 无
  374.    @return 无
  375.    @note
  376. */
  377. /*----------------------------------------------------------------------------*/
  378. void Menu_FMNext_7p7seg(void)@"LED_7COM_API"
  379. {
  380.     DispNum_7p7seg(t_fm.ch_sel);
  381.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_P;
  382.     LED_5com7seg_dispBuf[0] =  LED_7p7seg_BLANK;
  383.     LED_5com7seg_dispBuf[4] |= LED_FM;
  384. }

  385. /*----------------------------------------------------------------------------*/
  386. /**@brief LED显示函数,显示REC 录音
  387.    @param 无
  388.    @return 无
  389.    @note
  390. */
  391. /*----------------------------------------------------------------------------*/
  392. void Menu_Rec(void)@"LED_7COM_API"
  393. {
  394.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_R;
  395.     LED_5com7seg_dispBuf[2] =  LED_7p7seg_E;
  396.     LED_5com7seg_dispBuf[3] =  LED_7p7seg_C;
  397.     if (fs_cur_dev() == DEVICE_UDISK)
  398.         LED_5com7seg_dispBuf[4] |= LED_USB;
  399.     else if (fs_cur_dev() == DEVICE_SDMMC)
  400.         LED_5com7seg_dispBuf[4] |= LED_SD;
  401. }

  402. /*----------------------------------------------------------------------------*/
  403. /**@brief LED显示函数,显示-sp-扩音器用
  404.    @param 无
  405.    @return 无
  406.    @note
  407. */
  408. /*----------------------------------------------------------------------------*/
  409. void Menu_Spear(void)@"LED_7COM_API"
  410. {
  411.     LED_5com7seg_dispBuf[0] =  LED_7p7seg__;
  412.     LED_5com7seg_dispBuf[1] =  LED_7p7seg_S;
  413.     LED_5com7seg_dispBuf[2] =  LED_7p7seg_P;
  414.     LED_5com7seg_dispBuf[3] =  LED_7p7seg__;
  415. }


  416. /*----------------------------------------------------------------------------*/
  417. /**@brief LED显示函数,显示”PC“
  418.    @param 无
  419.    @return 无
  420.    @note
  421. */
  422. /*----------------------------------------------------------------------------*/
  423. void Menu_PCconnect_7p7seg(void)@"LED_7COM_API"
  424. {
  425.     LED_5com7seg_dispBuf[1] = LED_7p7seg_P;
  426.     LED_5com7seg_dispBuf[2] = LED_7p7seg_C;

  427.     //LED_5com7seg_dispBuf[4] |= LED_USB;
  428. }

  429. /*----------------------------------------------------------------------------*/
  430. /**@brief LED关闭
  431.    @param 无
  432.    @return 无
  433.    @note 空函数,留待扩展
  434. */
  435. /*----------------------------------------------------------------------------*/
  436. void Menu_OFF_7p7seg(void)@"LED_7COM_API"
  437. {
  438.     LED_5com7seg_dispBuf[1] = LED_7p7seg_0;
  439.     LED_5com7seg_dispBuf[2] = LED_7p7seg_F;
  440.     LED_5com7seg_dispBuf[3] = LED_7p7seg_F;
  441. }

  442. /*----------------------------------------------------------------------------*/
  443. /**@brief LED显示函数,显示”NO“
  444.    @param 无
  445.    @return 无
  446.    @note
  447. */
  448. /*----------------------------------------------------------------------------*/
  449. void Menu_NULL_7p7seg(void)@"LED_7COM_API"
  450. {
  451.   
  452. }

  453. /*----------------------------------------------------------------------------*/
  454. /**@brief LED显示函数,显示”NO“
  455.    @param 无
  456.    @return 无
  457.    @note
  458. */
  459. /*----------------------------------------------------------------------------*/
  460. void Menu_NO_Device_7p7seg(void)@"LED_7COM_API"
  461. {
  462.     LED_5com7seg_dispBuf[1] = LED_7p7seg_N;
  463.     LED_5com7seg_dispBuf[2] = LED_7p7seg_0;
  464. }

  465. /*----------------------------------------------------------------------------*/
  466. /**@brief LED显示函数,显示”NO“
  467.    @param 无
  468.    @return 无
  469.    @note
  470. */
  471. /*----------------------------------------------------------------------------*/
  472. void Menu_NO_Music_7p7seg(void)@"LED_7COM_API"
  473. {
  474.     Menu_NO_Device_7p7seg();
  475. }

  476. /*----------------------------------------------------------------------------*/
  477. /**@brief LED显示函数,暂停时的菜单显示
  478.    @param 无
  479.    @return 无
  480.    @note
  481. */
  482. /*----------------------------------------------------------------------------*/
  483. void Menu_Pause_7p7seg(void)@"LED_7COM_API"
  484. {
  485.   LED_5com7seg_dispBuf[0] = LED_7p7seg_P;
  486.   LED_5com7seg_dispBuf[1] = LED_7p7seg_A;
  487.   LED_5com7seg_dispBuf[2] = LED_7p7seg_U;
  488.   LED_5com7seg_dispBuf[3] = LED_7p7seg_S;
  489. }

  490. /*----------------------------------------------------------------------------*/
  491. /**@brief LED显示函数,显示当前使用的EQ
  492.    @param 无
  493.    @return 无
  494.    @note
  495. */
  496. /*----------------------------------------------------------------------------*/
  497. void Menu_EQ_7p7seg(void)@"LED_7COM_API"
  498. {
  499.   LED_5com7seg_dispBuf[0] = LED_7p7seg_BLANK;
  500.   LED_5com7seg_dispBuf[1] = LED_7p7seg_eqTable[sys_ctl.eq_num][0];
  501.   LED_5com7seg_dispBuf[2] = LED_7p7seg_eqTable[sys_ctl.eq_num][1];
  502.   LED_5com7seg_dispBuf[3] = LED_7p7seg_eqTable[sys_ctl.eq_num][2];
  503. }

  504. /*----------------------------------------------------------------------------*/
  505. /**@brief LED显示函数,显示”LINE“
  506.    @param 无
  507.    @return 无
  508.    @note
  509. */
  510. /*----------------------------------------------------------------------------*/
  511. void MENU_linein_7p7seg(void)@"LED_7COM_API"
  512. {
  513.     LED_5com7seg_dispBuf[0] = LED_7p7seg_L;
  514.     LED_5com7seg_dispBuf[1] = LED_7p7seg_I;
  515.     LED_5com7seg_dispBuf[2] = LED_7p7seg_N;
  516.     LED_5com7seg_dispBuf[3] = LED_7p7seg_E;
  517.     LED_5com7seg_dispBuf[4] |= LED_AUX;
  518. }

  519. /*----------------------------------------------------------------------------*/
  520. /**@brief LED显示函数,显示”----“
  521.    @param 无
  522.    @return 无
  523.    @note
  524. */
  525. /*----------------------------------------------------------------------------*/
  526. void MENU_Waiting_7p7seg(void)@"LED_7COM_API"
  527. {
  528.     LED_5com7seg_dispBuf[0] = LED_7p7seg_L;
  529.     LED_5com7seg_dispBuf[1] = LED_7p7seg_0;
  530.     LED_5com7seg_dispBuf[2] = LED_7p7seg_A;
  531.     LED_5com7seg_dispBuf[3] = LED_7p7seg_d;
  532. }

  533. /*----------------------------------------------------------------------------*/
  534. /**@brief LED显示函数,显示”HI“
  535.    @param 无
  536.    @return 无
  537.    @note
  538. */
  539. /*----------------------------------------------------------------------------*/
  540. void MENU_Power_on_7p7seg(void)@"LED_7COM_API"
  541. {
  542.     LED_5com7seg_dispBuf[0] = LED_7p7seg_H;
  543.     LED_5com7seg_dispBuf[1] = LED_7p7seg_I;
  544.     LED_5com7seg_dispBuf[2] = LED_7p7seg_F;
  545.     LED_5com7seg_dispBuf[3] = LED_7p7seg_I;
  546.    
  547. }

  548. /*----------------------------------------------------------------------------*/
  549. /**@brief LED初始化函数,不显示
  550.    @param 无
  551.    @return 无
  552.    @note
  553. */
  554. /*----------------------------------------------------------------------------*/
  555. void LED_7p7seg_Init(void)@"TASK_RECORD_SEG_1"
  556. {
  557. #if (!SAME_COM_P)
  558.   p_disp_buff2_value[0] = 0;
  559.   p_disp_buff2_value[1] = 0;
  560.   p_disp_buff2_value[2] = 0;
  561.   p_disp_buff2_value[3] = 0;
  562.   p_disp_buff2_value[4] = 0;
  563.   p_disp_buff2_value[5] = 0;
  564.   p_disp_buff2_value[6] = 0;
  565.   ALL_COM_DIRIN;
  566.   ALL_COM_OFF;
  567. #endif
  568.   
  569.   LED_COM_DIR |= 0xFE;                          //P20保持不变
  570.   COM_T = 0;
  571. }

  572. #pragma constseg=LED_7p7s_CONST
  573. const H menu_LED_7p7seg[] =
  574. {
  575.     Menu_NULL_7p7seg,
  576.     Menu_EQ_7p7seg,
  577.     Menu_VOL_7p7seg,
  578.     Menu_FRE_7p7seg,
  579.     Menu_Input_Number_7p7seg,
  580.     Menu_NO_Music_7p7seg,
  581.     MENU_Play_7p7seg,
  582.     Menu_Play_Mode_7p7seg,
  583.     Menu_Next_7p7seg,
  584.     Menu_Pause_7p7seg,
  585.     Menu_NO_Device_7p7seg,
  586.     MENU_Power_on_7p7seg,
  587.     MENU_Waiting_7p7seg,
  588.     MENU_linein_7p7seg,
  589.     Menu_FMNext_7p7seg,
  590.     Menu_PCconnect_7p7seg,
  591.     Menu_OFF_7p7seg,
  592.     Menu_VOLUP_7p7seg,
  593.     Menu_VOLDOWN_7p7seg,
  594.     Menu_RTC_7p7seg,
  595.     Menu_Rec,
  596.     Menu_Spear,
  597.     Menu_ALLNUM_7p7seg,
  598.     Menu_Voice_Switch,
  599. };
  600. #pragma constseg=default
  601. /*----------------------------------------------------------------------------*/
  602. /**@brief 7p7s LED 显示函数
  603.    @param menu_number,需要显示的菜单号码
  604.    @return 无
  605.    @note
  606. */
  607. /*----------------------------------------------------------------------------*/
  608. void DispMenu_LED_7p7seg(u8 menu_number)@"LED_7P7S_API"
  609. {
  610.     u8 i;
  611.     void (*p)(void);

  612.     p = menu_LED_7p7seg[menu_number];
  613.     returnCount = 0;

  614.     for(i=0;i<5;i++)
  615.       LED_5com7seg_dispBuf[i] = LED_7p7seg_BLANK;

  616.     (*p)();
  617.    
  618.     IE_EA = 0;
  619.     led_value_set();
  620.     IE_EA = 1;
  621. }


  622. /*----------------------------------------------------------------------------*/
  623. /**@brief 显示函数,根据指定的菜单号显示相应的菜单
  624.    @param menu_number 需要显示的菜单号码
  625.    @return 无
  626.    @note
  627. */
  628. /*----------------------------------------------------------------------------*/
  629. void DispMenu(u8 menu_number)@"LED_7P7S_API"//@"DealMsg"
  630. {
  631.     if(menu_number != MENU_INPUT_NUM)
  632.         inputNum = 0;
  633.    
  634. #ifdef LED_7P7S_EN
  635.      syslastbatval= 0xff;//更新电池显示
  636.      DispMenu_LED_7p7seg(menu_number);
  637. #endif  
  638. }



  639. __near_func void DispBat(void)
  640. {   
  641.   u8 static __idata count;
  642.   
  643.   //if(sys_ctl.disp_bat_val != syslastbatval)
  644.   {
  645.     LED_5com7seg_dispBuf[4] &= ~LED_FULL;
  646.     LED_5com7seg_dispBuf[4] &= ~LED_HALF;
  647.    
  648.     if((curMenu != MENU_OFF)&&(curMenu != MENU_POWER_ON))
  649.     {
  650.       if(sys_ctl.disp_bat_val == 2)
  651.       {
  652.         LED_5com7seg_dispBuf[4] |= LED_FULL;
  653.       }  
  654.       else if(sys_ctl.disp_bat_val == 1)
  655.       {
  656.         LED_5com7seg_dispBuf[4] |= LED_HALF;
  657.       }
  658.       else if(sys_ctl.disp_bat_val == 0)
  659.       {
  660.         if(HalfsecFlash)
  661.         {
  662.           LED_5com7seg_dispBuf[4] |= LED_HALF;
  663.         }
  664.       }
  665.       else
  666.       {
  667.         if(batchargecout == 1)
  668.         {
  669.          
  670.         }
  671.         else if(batchargecout == 2)
  672.         {
  673.           LED_5com7seg_dispBuf[4] |= LED_HALF;
  674.         }
  675.         else
  676.         {
  677.           LED_5com7seg_dispBuf[4] |= LED_FULL;
  678.           LED_5com7seg_dispBuf[4] |= LED_HALF;
  679.         }
  680.       }
  681.     }
  682.    
  683.     if(LED_5com7seg_dispBuf[4]&LED_HALF)   
  684.       p_disp_buff2_value[0] |= BIT(4);
  685.     else
  686.       p_disp_buff2_value[0] &= ~BIT(4);
  687.    
  688.     if(LED_5com7seg_dispBuf[4]&LED_FULL)
  689.       p_disp_buff2_value[2] |= BIT(6);
  690.     else
  691.       p_disp_buff2_value[2] &= ~BIT(6);
  692.   }
  693.   //syslastbatval = sys_ctl.disp_bat_val;
  694. }


  695. #define     BitCHK_0(REG,POS)   ((REG & (1 << POS)) == 0x00)
  696. /*----------------------------------------------------------------------------*/
  697. /**@brief 7脚LED扫描函数,逐次点灯每个LED的每一段(P21 ~ P27)
  698.    @param 无
  699.    @return 无
  700.    @note
  701. */
  702. /*----------------------------------------------------------------------------*/
  703. __near_func void LED_7p7seg_Scan(void)
  704. {
  705.   static u8 __idata count = 0;
  706.   
  707.   u8 com_seg_first_off;
  708.   
  709.   u8 dis_seg = 0,dir_temp = 0,out_temp = 0;
  710.    
  711.     DispBat();
  712.     /*if (COM_T == 8)
  713.     {
  714.     count = 8;
  715.     LineInCheck();                           //复用检测
  716.     EarphoneCheck();
  717.     DCINCheck();
  718.   }  */
  719.    
  720.   if(sys_ctl.backlight_sta == 0)
  721.   {
  722.     ALL_COM_OFF;
  723.     ALL_COM_DIRIN;
  724.     return;
  725.   }
  726.   
  727.   if (count > 6)
  728.   {
  729.     count = 0;
  730.     COM_T++;
  731.   }
  732.   
  733.   if(COM_T > 6)                                //复用检测时注意修改此处                             
  734.     COM_T = 0;
  735.   
  736.    dis_seg = p_disp_buff2_value[COM_T];
  737.   
  738.    //if(count == COM_T)                          //SEG及COM同一IO情况不存在   
  739.    //{
  740.    //  count += 1;
  741.    //}
  742.    
  743.    
  744.    while(count<7)
  745.    {
  746.      if(count == COM_T)                          //SEG及COM同一IO情况不存在   
  747.      {
  748.        count ++;
  749.      }
  750.      
  751.      if(BitCHK_0(dis_seg,count))
  752.      {
  753.        count++;
  754.        // break;
  755.      }
  756.      else
  757.      {
  758.        break;
  759.      }
  760.    }
  761.    
  762.    dis_seg = dis_seg & BIT(count);  
  763.    count++;
  764.   
  765.   //同一个P口的时候  
  766.   //out_temp = LED_COM;
  767.   
  768.   dir_temp = LED_COM_DIR;
  769.   
  770.   dir_temp  = 0xff;           
  771.   dir_temp &= ~((1 << COM_T) | dis_seg);
  772.   
  773.   out_temp |= (1 << COM_T);   
  774.   
  775.   LED_COM = out_temp;
  776.   LED_COM_DIR = dir_temp;                     //点亮一段
  777.   
  778. #if (!SAME_COM_P) //数码管的口,不在同一个P口上
  779.   
  780.   ALL_COM_OFF;
  781.   ALL_COM_DIRIN;
  782.   
  783.   if(LED_COM&BIT(0))
  784.   {
  785.     LED_COM_0_ON;
  786.   }
  787.   
  788.   if(LED_COM&BIT(1))
  789.   {
  790.     LED_COM_1_ON;
  791.   }  
  792.   
  793.   if(LED_COM&BIT(2))
  794.   {
  795.     LED_COM_2_ON;
  796.   }  
  797.   
  798.   if(LED_COM&BIT(3))
  799.   {
  800.     LED_COM_3_ON;
  801.   }
  802.   
  803.   if(LED_COM&BIT(4))
  804.   {
  805.     LED_COM_4_ON;
  806.   }  
  807.   
  808.   if(LED_COM&BIT(5))
  809.   {
  810.     LED_COM_5_ON;
  811.   }
  812.   
  813.   if(LED_COM&BIT(6))
  814.   {
  815.     LED_COM_6_ON;
  816.   }   
  817.   
  818.   if((dir_temp&BIT(0)) == 0)
  819.   {
  820.     COM_DIR0_OUT;
  821.   }
  822.    
  823.   if((dir_temp&BIT(1)) == 0)
  824.   {
  825.     COM_DIR1_OUT;
  826.   }  
  827.   
  828.   if((dir_temp&BIT(2)) == 0)
  829.   {
  830.     COM_DIR2_OUT;
  831.   }
  832.   
  833.   if((dir_temp&BIT(3)) == 0)
  834.   {
  835.     COM_DIR3_OUT;
  836.   }  
  837.   
  838.   if((dir_temp&BIT(4)) == 0)
  839.   {
  840.     COM_DIR4_OUT;
  841.   }  
  842.   
  843.   if((dir_temp&BIT(5)) == 0)
  844.   {
  845.     COM_DIR5_OUT;
  846.   }
  847.   
  848.   if((dir_temp&BIT(6)) == 0)
  849.   {
  850.     COM_DIR6_OUT;
  851.   }
  852.   
  853. #endif
  854.   
  855. // count++;
  856. }

  857. /*------------------------------------------------------3--------------------------*/
  858. /**@brief 根据7脚LED的真值表进行映射(每段输出高的IO记为COM端 7*7)COM:0~6  SEG:1~7
  859.    @param 无
  860.    @return 无
  861.    @note
  862. */
  863. /*------------------------------------------------------------------------------*/
  864. void led_value_set(void)@"LED_7COM_API"
  865. {
  866.     u8 tmpbuf[7];
  867.    
  868.     memset(tmpbuf, 0, 7);

  869.     if(LED_5com7seg_dispBuf[0]&BIT_A)     tmpbuf[0] |= BIT(1);
  870.     if(LED_5com7seg_dispBuf[0]&BIT_B)     tmpbuf[0] |= BIT(2);
  871.     if(LED_5com7seg_dispBuf[0]&BIT_C)     tmpbuf[3] |= BIT(0);
  872.     if(LED_5com7seg_dispBuf[0]&BIT_D)     tmpbuf[4] |= BIT(0);
  873.     if(LED_5com7seg_dispBuf[0]&BIT_E)     tmpbuf[0] |= BIT(3);
  874.     if(LED_5com7seg_dispBuf[0]&BIT_F)     tmpbuf[1] |= BIT(0);
  875.     if(LED_5com7seg_dispBuf[0]&BIT_G)     tmpbuf[2] |= BIT(0);

  876.     if(LED_5com7seg_dispBuf[1]&BIT_A)     tmpbuf[1] |= BIT(2);
  877.     if(LED_5com7seg_dispBuf[1]&BIT_B)     tmpbuf[1] |= BIT(3);
  878.     if(LED_5com7seg_dispBuf[1]&BIT_C)     tmpbuf[4] |= BIT(1);
  879.     if(LED_5com7seg_dispBuf[1]&BIT_D)     tmpbuf[1] |= BIT(5);
  880.     if(LED_5com7seg_dispBuf[1]&BIT_E)     tmpbuf[1] |= BIT(4);
  881.     if(LED_5com7seg_dispBuf[1]&BIT_F)     tmpbuf[2] |= BIT(1);
  882.     if(LED_5com7seg_dispBuf[1]&BIT_G)     tmpbuf[3] |= BIT(1);

  883.     if(LED_5com7seg_dispBuf[2]&BIT_A)     tmpbuf[4] |= BIT(3);
  884.     if(LED_5com7seg_dispBuf[2]&BIT_B)     tmpbuf[2] |= BIT(4);
  885.     if(LED_5com7seg_dispBuf[2]&BIT_C)     tmpbuf[3] |= BIT(4);
  886.     if(LED_5com7seg_dispBuf[2]&BIT_D)     tmpbuf[5] |= BIT(0);
  887.     if(LED_5com7seg_dispBuf[2]&BIT_E)     tmpbuf[5] |= BIT(2);
  888.     if(LED_5com7seg_dispBuf[2]&BIT_F)     tmpbuf[3] |= BIT(2);
  889.     if(LED_5com7seg_dispBuf[2]&BIT_G)     tmpbuf[4] |= BIT(2);

  890.     if(LED_5com7seg_dispBuf[3]&BIT_A)     tmpbuf[6] |= BIT(5);
  891.     if(LED_5com7seg_dispBuf[3]&BIT_B)     tmpbuf[5] |= BIT(6);
  892.     if(LED_5com7seg_dispBuf[3]&BIT_C)     tmpbuf[4] |= BIT(5);
  893.     if(LED_5com7seg_dispBuf[3]&BIT_D)     tmpbuf[5] |= BIT(3);
  894.     if(LED_5com7seg_dispBuf[3]&BIT_E)     tmpbuf[3] |= BIT(5);
  895.     if(LED_5com7seg_dispBuf[3]&BIT_F)     tmpbuf[5] |= BIT(4);
  896.     if(LED_5com7seg_dispBuf[3]&BIT_G)     tmpbuf[4] |= BIT(6);
  897.    
  898.     if(LED_5com7seg_dispBuf[4]&LED_DDOT)   tmpbuf[2] |= BIT(3);
  899.     if(LED_5com7seg_dispBuf[4]&LED_USB)    tmpbuf[5] |= BIT(1);
  900.     if(LED_5com7seg_dispBuf[4]&LED_SD)     tmpbuf[0] |= BIT(5);
  901.     if(LED_5com7seg_dispBuf[4]&LED_FM)     tmpbuf[2] |= BIT(5);
  902.     if(LED_5com7seg_dispBuf[4]&LED_FM_DOT) tmpbuf[6] |= BIT(4);   
  903.     if(LED_5com7seg_dispBuf[4]&LED_HALF)   tmpbuf[0] |= BIT(4);
  904.     if(LED_5com7seg_dispBuf[4]&LED_FULL)   tmpbuf[2] |= BIT(6);
  905.    
  906.     memcpy(p_disp_buff2_value, tmpbuf, 7);   
  907. }
  908. #endif

复制代码


回复

使用道具 举报

ID:808485 发表于 2020-8-31 14:09 | 显示全部楼层
顶10楼,关键I/O要3态。

三态IO脚驱动LED矩阵

三态IO脚驱动LED矩阵
回复

使用道具 举报

ID:820555 发表于 2020-11-3 17:45 | 显示全部楼层
哥,你这个数码管程序有吗,可以借鉴下不
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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