下面是数码管的脚位图
这种管子很少见,属于逻辑驱动类型的。引脚1~5都可以作为阳极,分别对应驱显段码。例如想显示1,对应的是BC接电,看下5个接线图上中满足:2接正,1,3接地;上右也可:3接正,2,4接地;下游也可以:5接正,2,3接地。其他的依葫芦画瓢,都需要串联电阻限流的。 曾经买了个LED点阵电子胸牌,并他他驱动了,里面也是这种电路结构,只不过数量更多 用了个跟你差不多的,就是个三态驱动,没啥高深的
#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=
{
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;SM();}break;
case 5:if(Sys_Open){dspbuf = SegMentCode;SM();}else{dspbuf = SegMentCode;SM();}break;
case 2:if(Sys_Open){dspbuf = SegMentCode;SM();}break;
case 3:if(Sys_Open){dspbuf = SegMentCode;SM();}else{dspbuf = SegMentCode;SM();};break;
case 0:if(Sys_Open){dspbuf = SegMentCode;SM();}break;
case 1:if(Sys_Open){dspbuf = SegMentCode;SM();}else{dspbuf = SegMentCode;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;
}
}
静态显示直接用IO口点就行了,动态显示可以用595或者IO组成矩阵的方式 很简单的,3态驱动。
1、要驱动的COM输出高。
2、对应要亮的段输出低。
3、不亮的段为高阻。
如此重复扫描即可。 没写过这类驱动程序,学习了{:lol:} zhjb1 发表于 2018-7-24 14:40
这种管子很少见,属于逻辑驱动类型的。引脚1~5都可以作为阳极,分别对应驱显段码。例如想显示1,对应的是 ...
我看别人方案是义隆单片机的,输出直接接数码管扫描驱动,不用接限流电阻的,是不是从IO口内部设置输出电流的? LKC134 发表于 2018-7-25 11:58
我看别人方案是义隆单片机的,输出直接接数码管扫描驱动,不用接限流电阻的,是不是从IO口内部设置输出电 ...
不清楚这类段码管的内部结构,如果内部有限流电路,就可以直接驱显,还有一个就是电路采用PWM控制输出脉宽达到限制电流的目的。 感谢大家热心回答,thanks! LKC134 发表于 2018-7-25 18:54
感谢大家热心回答,thanks!
3位一体6脚数码管如何驱动?请问楼主驱动弄好没有?我这边急需这个驱动,不知道能不能帮忙一下? LKC134 发表于 2018-7-21 20:28
下面是数码管的脚位图
每一个引脚,既做位扫描,又做段扫描,省了几个IO,程序复杂一塌糊涂,选择这种封装也是醉了,多几个引脚IO,一个系列芯片价格几乎一样,值得么?
每位显示,由2-3个位扫描完成,单独列出各位动作,编写不同的段扫描数据就成。程序code每位显示都是单独的,没有共同。 tianxj01 发表于 2019-4-12 09:43
每一个引脚,既做位扫描,又做段扫描,省了几个IO,程序复杂一塌糊涂,选择这种封装也是醉了,多几个引脚 ...
这种驱动都叫复杂,不用做大程序了,用这种脚位特料焊盘少,IC的脚位也少,3分钱算一个加工焊盘,你自己算吧。 学习了 YDCMAN 发表于 2018-7-24 18:10
静态显示直接用IO口点就行了,动态显示可以用595或者IO组成矩阵的方式
这种管子595不行,必须有高阻输出才行
页:
1
[2]