SM16306+74HC595D驱动4个7*11电梯点阵屏

一、器件说明

        TAOBAO上,我是按照原装富满TC5020E买的SM16306并外带74HC595D。原装是什么样子我不知道,但想必SM16306和TC5020E功能是相同的,查了一下SM16306资料确实和5020完全一样,至于谁是山上来的已不重要,毕竟价格便宜,还要啥自行车。而595应该大差不差吧。

SM16306+74HC595D驱动4个7*11电梯点阵屏_第1张图片

         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点阵,电梯口常见。还是懂得都懂。

三、电路图

SM16306+74HC595D驱动4个7*11电梯点阵屏_第2张图片

         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点阵。当然可以通过程序调节改善一下,但天然的缺陷还是无法完全避免的。

 开始显示不均匀

SM16306+74HC595D驱动4个7*11电梯点阵屏_第3张图片

 背面接线,留有级联接口。上下再留级联口就好了,还是没经验。

SM16306+74HC595D驱动4个7*11电梯点阵屏_第4张图片

 老三 SM16306+74HC595D驱动4个7*11电梯点阵屏_第5张图片

 老四

SM16306+74HC595D驱动4个7*11电梯点阵屏_第6张图片

 还是老五

SM16306+74HC595D驱动4个7*11电梯点阵屏_第7张图片

  后来均匀方面好多了SM16306+74HC595D驱动4个7*11电梯点阵屏_第8张图片

你可能感兴趣的:(单片机,嵌入式硬件)