[程序源码] 3位一体6脚数码管如何驱动

[复制链接]
12275|33
zhjb1 发表于 2018-7-24 14:40 | 显示全部楼层
LKC134 发表于 2018-7-21 20:28
下面是数码管的脚位图

这种管子很少见,属于逻辑驱动类型的。引脚1~5都可以作为阳极,分别对应驱显段码。例如想显示1,对应的是BC接电,看下5个接线图上中满足:2接正,1,3接地;上右也可:3接正,2,4接地;下游也可以:5接正,2,3接地。其他的依葫芦画瓢,都需要串联电阻限流的。
chongdongchen 发表于 2018-7-24 14:46 | 显示全部楼层
曾经买了个LED点阵电子胸牌,并他他驱动了,里面也是这种电路结构,只不过数量更多
似水流年1 发表于 2018-7-24 17:02 | 显示全部楼层
用了个跟你差不多的,就是个三态驱动,没啥高深的
  1. #include        "User.h"

  2. #define PIN1 PB1
  3. #define PIN2 PA5
  4. #define PIN3 PA4
  5. #define PIN4 PA2
  6. #define PIN5 PC0
  7. #define PIN6 PC1

  8. #define PIN1T TRISB1
  9. #define PIN2T TRISA5
  10. #define PIN3T TRISA4
  11. #define PIN4T TRISA2
  12. #define PIN5T TRISC0
  13. #define PIN6T TRISC1

  14. #define Key1 PC3
  15. #define Key2 PA6
  16. #define Key3 PA1

  17. #define sega 1
  18. #define segb (1<<1)
  19. #define segc (1<<2)
  20. #define segd (1<<3)
  21. #define sege (1<<4)
  22. #define segf (1<<5)
  23. #define segg (1<<6)
  24. unsigned char const SegMentCode[11]=
  25. {
  26.         sega|segb|segc|segd|sege|segf,//0
  27.         segb|segc,//1
  28.         sega|segb|segd|sege|segg,//2
  29.         sega|segb|segc|segd|segg,//3
  30.         segb|segc|segf|segg,//4
  31.         sega|segc|segd|segf|segg,//5
  32.         sega|segc|segd|sege|segf|segg,//6
  33.         sega|segb|segc,//7
  34.         sega|segb|segc|segd|sege|segf|segg,//8
  35.         sega|segb|segc|segd|segf|segg, //9
  36.     segg
  37. };


  38. typedef struct {
  39.         unsigned int b0 : 1;
  40.         unsigned int b1 : 1;
  41.         unsigned int b2 : 1;
  42.         unsigned int b3 : 1;
  43.         unsigned int b4 : 1;
  44.         unsigned int b5 : 1;
  45.         unsigned int b6 : 1;
  46.         unsigned int b7 : 1;
  47. }_bits;
  48. typedef union  
  49. {
  50.         unsigned int byte;           //便于储存
  51.         _bits bits;
  52. }data_union;
  53. data_union segbufunion;
  54. #define segaf segbufunion.bits.b0
  55. #define segbf segbufunion.bits.b1
  56. #define segcf segbufunion.bits.b2
  57. #define segdf segbufunion.bits.b3
  58. #define segef segbufunion.bits.b4
  59. #define segff segbufunion.bits.b5
  60. #define seggf segbufunion.bits.b6
  61. #define dspbuf segbufunion.byte       

  62. unsigned int DispDat;
  63. unsigned char DispNum,KeyBuff;
  64. bit Flag_Lock;
  65. void SM(void)
  66. {
  67.         switch(DispNum)
  68.     {
  69.             case 4:
  70.                 {
  71.                 if(segaf)
  72.                 {PIN5T = 0;PIN5 = 0;}
  73.                 if(segbf)
  74.                 {PIN4T = 0;PIN4 = 0;}
  75.                 if(segcf)
  76.                 {PIN3T = 0;PIN3 = 0;}               
  77.                 PIN2T = 0;PIN2 = 0;
  78.                 PIN6T = 0;PIN6 = 1;
  79.                 break;
  80.              }
  81.         case 5:
  82.                 {
  83.                                 if(seggf){PIN6T = 0;PIN6 = 0;}
  84.                 if(segff){PIN4T = 0;PIN4 = 0;}
  85.                 if(segef){PIN3T = 0;PIN3 = 0;}
  86.                 if(segdf){PIN2T = 0;PIN2 = 0;}
  87.                 PIN5T = 0;PIN5 = 1;
  88.                     break;
  89.             }
  90.         case 2:
  91.                 {
  92.                 if(segaf){PIN6T = 0;PIN6 = 0;}
  93.                 if(segbf){PIN5T = 0;PIN5 = 0;}
  94.                 if(segcf){PIN3T = 0;PIN3 = 0;}               
  95.                 if(Flag_Lock){PIN2T = 0;PIN2 = 0;}
  96.                       PIN4T = 0;PIN4 = 1;
  97.                     break;
  98.             }
  99.         case 3:
  100.                 {
  101.                                 if(seggf){PIN6T = 0;PIN6 = 0;}
  102.                 if(segff){PIN5T = 0;PIN5 = 0;}
  103.                 if(segef){PIN4T = 0;PIN4 = 0;}
  104.                 if(segdf){PIN2T = 0;PIN2 = 0;}
  105.                 PIN3T = 0;PIN3 = 1;
  106.                               break;
  107.             }
  108.         case 0:
  109.                 {
  110.                 if(segaf)
  111.                 {
  112.                         PIN6T = 0;
  113.                     PIN6 = 0;
  114.                 }
  115.                 if(segbf)
  116.                 {
  117.                         PIN5T = 0;
  118.                     PIN5 = 0;
  119.                 }
  120.                 if(segcf)
  121.                 {
  122.                         PIN4T = 0;
  123.                     PIN4 = 0;
  124.                 }               
  125.                       PIN2T = 0;
  126.                 PIN2 = 1;
  127.                     break;
  128.             }
  129.         case 1:
  130.                 {
  131.                    
  132.                                 if(seggf){PIN6T = 0;PIN6 = 0;}
  133.                 if(segff){PIN5T = 0;PIN5 = 0;}
  134.                 if(segef){PIN4T = 0;PIN4 = 0;}
  135.                 if(segdf){PIN3T = 0;PIN3 = 0;}
  136.                 PIN1T = 0;PIN1 = 1;
  137.                               break;
  138.             }
  139.     }
  140. }
  141. unsigned char KeyDat,Key1OpenTime;
  142. unsigned int KeyTime;
  143. void DisPlay(void)
  144. {
  145.     unsigned char KeyDatBuff;
  146.    
  147.     DispNum++;
  148.     if(DispNum>5)DispNum = 0;
  149.         TRISA = 0Xff; //全输入
  150.     TRISB = 0Xff; //全输入
  151.     TRISC = 0XEB;//C4 C2输出
  152.     if(FLAG_XS)
  153.     {
  154.                switch(DispNum)
  155.             {
  156.                     case 4:if(Sys_Open){dspbuf = SegMentCode[DispDat/100];SM();}break;
  157.                 case 5:if(Sys_Open){dspbuf = SegMentCode[DispDat/100];SM();}else{dspbuf = SegMentCode[10];SM();}break;
  158.                 case 2:if(Sys_Open){dspbuf = SegMentCode[DispDat/10%10];SM();}break;
  159.                 case 3:if(Sys_Open){dspbuf = SegMentCode[DispDat/10%10];SM();}else{dspbuf = SegMentCode[10];SM();};break;
  160.                 case 0:if(Sys_Open){dspbuf = SegMentCode[DispDat%10];SM();}break;
  161.                 case 1:if(Sys_Open){dspbuf = SegMentCode[DispDat%10];SM();}else{dspbuf = SegMentCode[10];SM();}break;
  162.             }
  163.     }
  164.            if((!Key1) || (!Key2) || (!Key3))
  165.     {
  166.             if(!Key1)KeyDat = 1;
  167.             else KeyDat = 0;
  168.             KeyTime++;
  169.              if(KeyTime==42)
  170.         {
  171.                 if(!Key2)
  172.             KeyBuff = 3;//减
  173.             if(!Key3)
  174.             KeyBuff = 4;//加
  175.         }       
  176.         if(KeyTime==1000)
  177.         {
  178.                 if(!Key1)
  179.             KeyBuff = 1;//NO/OFF
  180.         }      
  181.         if(KeyTime>=1000)
  182.         {
  183.                 KeyTime = 1000;
  184.             KeyDat = 0;
  185.         }
  186.     }
  187.     else
  188.     {
  189.             Key1OpenTime++;
  190.         if(Key1OpenTime>250)Key1OpenTime = 250;
  191.         if(KeyDat==1&&KeyTime)
  192.         {
  193.                 if(Key1OpenTime<250)
  194.             {//0.5S
  195.                     Key1OpenTime = 1000;
  196.                     KeyBuff = 2;//Key1 双击
  197.             }
  198.             else Key1OpenTime = 0;
  199.         }
  200.         KeyTime = 0;
  201.     }
  202. }


  203.        
YDCMAN 发表于 2018-7-24 18:10 | 显示全部楼层
静态显示直接用IO口点就行了,动态显示可以用595或者IO组成矩阵的方式
coody 发表于 2018-7-24 18:36 | 显示全部楼层
很简单的,3态驱动。
1、要驱动的COM输出高。
2、对应要亮的段输出低。
3、不亮的段为高阻。

如此重复扫描即可。
 楼主| LKC134 发表于 2018-7-25 11:49 | 显示全部楼层
没写过这类驱动程序,学习了
 楼主| LKC134 发表于 2018-7-25 11:58 | 显示全部楼层
zhjb1 发表于 2018-7-24 14:40
这种管子很少见,属于逻辑驱动类型的。引脚1~5都可以作为阳极,分别对应驱显段码。例如想显示1,对应的是 ...

我看别人方案是义隆单片机的,输出直接接数码管扫描驱动,不用接限流电阻的,是不是从IO口内部设置输出电流的?
zhjb1 发表于 2018-7-25 15:06 | 显示全部楼层
LKC134 发表于 2018-7-25 11:58
我看别人方案是义隆单片机的,输出直接接数码管扫描驱动,不用接限流电阻的,是不是从IO口内部设置输出电 ...

不清楚这类段码管的内部结构,如果内部有限流电路,就可以直接驱显,还有一个就是电路采用PWM控制输出脉宽达到限制电流的目的。
 楼主| LKC134 发表于 2018-7-25 18:54 | 显示全部楼层
感谢大家热心回答,thanks!
13560380305 发表于 2019-4-10 21:44 | 显示全部楼层
LKC134 发表于 2018-7-25 18:54
感谢大家热心回答,thanks!

3位一体6脚数码管如何驱动?请问楼主驱动弄好没有?我这边急需这个驱动,不知道能不能帮忙一下?
tianxj01 发表于 2019-4-12 09:43 | 显示全部楼层
LKC134 发表于 2018-7-21 20:28
下面是数码管的脚位图

每一个引脚,既做位扫描,又做段扫描,省了几个IO,程序复杂一塌糊涂,选择这种封装也是醉了,多几个引脚IO,一个系列芯片价格几乎一样,值得么?
每位显示,由2-3个位扫描完成,单独列出各位动作,编写不同的段扫描数据就成。程序code每位显示都是单独的,没有共同。
无脑达人 发表于 2019-4-15 16:35 | 显示全部楼层
tianxj01 发表于 2019-4-12 09:43
每一个引脚,既做位扫描,又做段扫描,省了几个IO,程序复杂一塌糊涂,选择这种封装也是醉了,多几个引脚 ...

这种驱动都叫复杂,不用做大程序了,用这种脚位特料焊盘少,IC的脚位也少,3分钱算一个加工焊盘,你自己算吧。 
RAYINGPX 发表于 2024-10-7 15:50 | 显示全部楼层
学习了
zhanan 发表于 2024-10-12 20:47 | 显示全部楼层
YDCMAN 发表于 2018-7-24 18:10
静态显示直接用IO口点就行了,动态显示可以用595或者IO组成矩阵的方式

这种管子595不行,必须有高阻输出才行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部