发新帖我要提问
12
返回列表
[程序源码]

3位一体6脚数码管如何驱动

[复制链接]
楼主: LKC134
手机看帖
扫描二维码
随时随地手机跟帖
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 | 显示全部楼层
用了个跟你差不多的,就是个三态驱动,没啥高深的
#include        "User.h"

#define PIN1 PB1
#define PIN2 PA5
#define PIN3 PA4
#define PIN4 PA2
#define PIN5 PC0
#define PIN6 PC1

#define PIN1T TRISB1
#define PIN2T TRISA5
#define PIN3T TRISA4
#define PIN4T TRISA2
#define PIN5T TRISC0
#define PIN6T TRISC1

#define Key1 PC3
#define Key2 PA6
#define Key3 PA1

#define sega 1
#define segb (1<<1)
#define segc (1<<2)
#define segd (1<<3)
#define sege (1<<4)
#define segf (1<<5)
#define segg (1<<6)
unsigned char const SegMentCode[11]=
{
        sega|segb|segc|segd|sege|segf,//0
        segb|segc,//1
        sega|segb|segd|sege|segg,//2
        sega|segb|segc|segd|segg,//3
        segb|segc|segf|segg,//4
        sega|segc|segd|segf|segg,//5
        sega|segc|segd|sege|segf|segg,//6
        sega|segb|segc,//7
        sega|segb|segc|segd|sege|segf|segg,//8
        sega|segb|segc|segd|segf|segg, //9
    segg
};


typedef struct {
        unsigned int b0 : 1;
        unsigned int b1 : 1;
        unsigned int b2 : 1;
        unsigned int b3 : 1;
        unsigned int b4 : 1;
        unsigned int b5 : 1;
        unsigned int b6 : 1;
        unsigned int b7 : 1;
}_bits;
typedef union  
{
        unsigned int byte;           //便于储存
        _bits bits;
}data_union;
data_union segbufunion;
#define segaf segbufunion.bits.b0
#define segbf segbufunion.bits.b1
#define segcf segbufunion.bits.b2
#define segdf segbufunion.bits.b3
#define segef segbufunion.bits.b4
#define segff segbufunion.bits.b5
#define seggf segbufunion.bits.b6
#define dspbuf segbufunion.byte       

unsigned int DispDat;
unsigned char DispNum,KeyBuff;
bit Flag_Lock;
void SM(void)
{
        switch(DispNum)
    {
            case 4:
                {
                if(segaf)
                {PIN5T = 0;PIN5 = 0;}
                if(segbf)
                {PIN4T = 0;PIN4 = 0;}
                if(segcf)
                {PIN3T = 0;PIN3 = 0;}               
                PIN2T = 0;PIN2 = 0;
                PIN6T = 0;PIN6 = 1;
                break;
             }
        case 5:
                {
                                if(seggf){PIN6T = 0;PIN6 = 0;}
                if(segff){PIN4T = 0;PIN4 = 0;}
                if(segef){PIN3T = 0;PIN3 = 0;}
                if(segdf){PIN2T = 0;PIN2 = 0;}
                PIN5T = 0;PIN5 = 1;
                    break;
            }
        case 2:
                {
                if(segaf){PIN6T = 0;PIN6 = 0;}
                if(segbf){PIN5T = 0;PIN5 = 0;}
                if(segcf){PIN3T = 0;PIN3 = 0;}               
                if(Flag_Lock){PIN2T = 0;PIN2 = 0;}
                      PIN4T = 0;PIN4 = 1;
                    break;
            }
        case 3:
                {
                                if(seggf){PIN6T = 0;PIN6 = 0;}
                if(segff){PIN5T = 0;PIN5 = 0;}
                if(segef){PIN4T = 0;PIN4 = 0;}
                if(segdf){PIN2T = 0;PIN2 = 0;}
                PIN3T = 0;PIN3 = 1;
                              break;
            }
        case 0:
                {
                if(segaf)
                {
                        PIN6T = 0;
                    PIN6 = 0;
                }
                if(segbf)
                {
                        PIN5T = 0;
                    PIN5 = 0;
                }
                if(segcf)
                {
                        PIN4T = 0;
                    PIN4 = 0;
                }               
                      PIN2T = 0;
                PIN2 = 1;
                    break;
            }
        case 1:
                {
                   
                                if(seggf){PIN6T = 0;PIN6 = 0;}
                if(segff){PIN5T = 0;PIN5 = 0;}
                if(segef){PIN4T = 0;PIN4 = 0;}
                if(segdf){PIN3T = 0;PIN3 = 0;}
                PIN1T = 0;PIN1 = 1;
                              break;
            }
    }
}
unsigned char KeyDat,Key1OpenTime;
unsigned int KeyTime;
void DisPlay(void)
{
    unsigned char KeyDatBuff;
   
    DispNum++;
    if(DispNum>5)DispNum = 0;
        TRISA = 0Xff; //全输入
    TRISB = 0Xff; //全输入
    TRISC = 0XEB;//C4 C2输出
    if(FLAG_XS)
    {
               switch(DispNum)
            {
                    case 4:if(Sys_Open){dspbuf = SegMentCode[DispDat/100];SM();}break;
                case 5:if(Sys_Open){dspbuf = SegMentCode[DispDat/100];SM();}else{dspbuf = SegMentCode[10];SM();}break;
                case 2:if(Sys_Open){dspbuf = SegMentCode[DispDat/10%10];SM();}break;
                case 3:if(Sys_Open){dspbuf = SegMentCode[DispDat/10%10];SM();}else{dspbuf = SegMentCode[10];SM();};break;
                case 0:if(Sys_Open){dspbuf = SegMentCode[DispDat%10];SM();}break;
                case 1:if(Sys_Open){dspbuf = SegMentCode[DispDat%10];SM();}else{dspbuf = SegMentCode[10];SM();}break;
            }
    }
           if((!Key1) || (!Key2) || (!Key3))
    {
            if(!Key1)KeyDat = 1;
            else KeyDat = 0;
            KeyTime++;
             if(KeyTime==42)
        {
                if(!Key2)
            KeyBuff = 3;//减
            if(!Key3)
            KeyBuff = 4;//加
        }       
        if(KeyTime==1000)
        {
                if(!Key1)
            KeyBuff = 1;//NO/OFF
        }      
        if(KeyTime>=1000)
        {
                KeyTime = 1000;
            KeyDat = 0;
        }
    }
    else
    {
            Key1OpenTime++;
        if(Key1OpenTime>250)Key1OpenTime = 250;
        if(KeyDat==1&&KeyTime)
        {
                if(Key1OpenTime<250)
            {//0.5S
                    Key1OpenTime = 1000;
                    KeyBuff = 2;//Key1 双击
            }
            else Key1OpenTime = 0;
        }
        KeyTime = 0;
    }
}


       

使用特权

评论回复
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分钱算一个加工焊盘,你自己算吧。 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则