TAOBAO上,我是按照原装富满TC5020E买的SM16306并外带74HC595D。原装是什么样子我不知道,但想必SM16306和TC5020E功能是相同的,查了一下SM16306资料确实和5020完全一样,至于谁是山上来的已不重要,毕竟价格便宜,还要啥自行车。而595应该大差不差吧。
SM16306是一款通用低功耗16通道LED恒流驱动芯片,恒流拐点低,支持4.2V电压节能屏应用,内建CMOS移位寄存器与锁存功能,可以将串行的输入数据转换成并行输出数据格式。
16通道恒流源输出
工作电压:3.3V~5.0V
输出电流外部Rext电阻可调
输出电流:3—32mA@VDD=5.0V,3—22mA@VDD=3.3V
内置低拐点节能功能,满足4.2V电压应用
恒流拐点:VDS=0.25V @IOUT=20mA,VDD=5.0V
VDS=0.25V @IOUT=20mA,VDD=3.3V
恒流精度:片内<±3.0%,片间<±3.5%
快速的输出电流响应, 最小OE值:35ns
高达25MHz时钟频率
封装形式:QSOP24
通常驱动LED只用595就可以了。但595输出电流太大,为避免LED损坏要外接限流电阻,8个脚每个脚一个,就要8个电阻,当然可以用排阻来替代。但如果用SM16306配合595就完全可以省去限流电阻,因为SM16306是恒流源,可以20mA直接驱动LED。并且SM16306有16通道恒流源输出,姑且叫输出吧,16通道相当于2个595的输出能力了,电路设计上又可以减少一个芯片。还有SM16306也是串行输入并行输出,可以和595级联,程序上只要做好串行控制就好了。
再说下“恒流源输出”,不知道为什么所有的5020厂家都管OUT脚叫恒流输出。输出不是应该电流从OUT脚向外流吗?但是试图这样设计电路一定会发现无论怎么编程,都无法点亮LED。不要问我怎么知道的,都是血泪史。
真相是OUT脚要接LED的阴极。稍微有良心的厂家会在OUT上加一条横线,意思大概是OUT负电位有效,也就是电流要在这个引脚流入芯片。这种词汇上的弯弯绕,应该和”负增长“有一拼,如果下降也是一种增长,那么流入也算一种流出。
还有被驱动的对象:7*11点阵,电梯口常见。还是懂得都懂。
1个SM16306和3个595级联,595接7*11LED点阵阳级22个引脚,SM16306接LED点阵阴极14个引脚,一共驱动了4个7*11 LED点阵屏。
SM16306的R-EXT引脚接了一个电阻,设定所有通道电流为20mA左右。
多加的数码管是为了利用SM16306和595的剩余引脚,后来感觉完全没有必要,画蛇添足。
因为4个7*11点阵组合后是14*22的点阵,所以定义了14*3个字节来做显示缓存。
u8 DISPBUF[14][3]={0x00}; //显存14*3字节,一行3字节,
595部分
void p595Shift(u8 c)
{
u8 i;
for(i=0;i<8;i++){
SER = (c>>i) & 0x01; //先低位
SRCLK = 0;
SRCLK = 1; // 上升沿进行一次数据移入
}
}
在缓存里画点和写文字(实际是数字):
unsigned char code NUM4x7[]=
{
/* 4*7数字字模,上下顶到头,空左边一列*/
0x06,0x09,0x09,0x09,0x09,0x09,0x06,/*0*/
0x02,0x06,0x02,0x02,0x02,0x02,0x07,/*1*/
0x06,0x09,0x09,0x02,0x04,0x08,0x0F,/*2*/
0X06,0X09,0X01,0X06,0X01,0X09,0X06,/*3*/
0X09,0X09,0X09,0X0F,0X01,0X01,0X01,/*4*/
0X0F,0x08,0X0E,0X01,0X01,0X09,0X06,/*5*/
0x06,0x09,0x08,0X0E,0x09,0x09,0x06,/*6*/
0x0F,0X01,0x02,0x02,0x02,0x02,0x02,/*7*/
0x06,0x09,0x09,0x06,0x09,0x09,0x06,/*8*/
0x06,0x09,0x09,0x07,0x01,0x09,0x06,/*9*/
0x00,0x02,0x00,0x00,0x00,0x02,0x00,/*:*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*空,补位*/
};
void pointXY(int x,int y)
{
u8 iBufInx=0;
iBufInx=x/8;
DISPBUF[y][iBufInx]|=0x01<<(x%8);
}
void drawText(int x,int y,u8 d,u8 t)
{
u8 i,j;
u8 numPos=0;
u8 *p;
numPos=d*7;
switch(t){ //字模
case 1:
p=smallNUM;
break;
case 2:
p=bigNUM;
break;
case 3:
p=NUM4x7;
break;
}
for(i=0;i<7;i++)
{
for(j=0;j<4;j++)
{
if((*(p+numPos+i)>>j)&0x01) pointXY(x+j,y+i); //4位,从低到高
}
}
}
显示函数
u8 showBuff(u8 iStep,int speed)
{
u8 t=task;
u8 i,k,j,l,m;
u8 brightness;
for(j=0;j<20;j++){
for(m=0;m=2){
/*说是恒流其实亮度不均,还是自已调节亮度吧*/
brightness=1;
for(k=0;k<3;k++)
{
for(l=0;l<8;l++){
if((DISPBUF[(i-2+iStep)%14][k]>>l)&0x01) brightness+=2;
}
}
for(k=0;k
1、开始没注意SM16306支持"高达25MHz时钟频率",尝试用两个模块级联时,发现什么都不显示。后来将MCU的主频从35Mhz降到24Mhz就OK了。不级联时SM16306还是可以超频支持35Mhz的。当然本人对高频电路设计知识一无所知,35Mhz应该也不是高频。从来都是本着电路能联通就好的原则画板子,级联能调通能亮已是万幸。
2、为什么显示不均匀呢,想了一下应该是天然缺陷,无法改变,除非不用SM16306。因为SM16306是恒流输入的,姑且假设是20mA,并且接的是COM,那n个595流出的电流并联最后通过一个SM16306 OUT口输入,那每一led只能分到20/n的电流了。除非SM16306可以接SEG,但SM16306只能接COM,否则不工作。所以最后的结论是SM16306不适合LED点阵。当然可以通过程序调节改善一下,但天然的缺陷还是无法完全避免的。
开始显示不均匀
背面接线,留有级联接口。上下再留级联口就好了,还是没经验。
老四
还是老五