LED变身记二——LED点阵初解!
我们讲了几节的LED,这节讲什么呢,缘缘感觉还是再说说LED吧,听到这里,估计亲们会喷的,说:“你到底会不会啊,天天拿个LED来说事”,对不起啊,因为缘缘喜欢玩LED的,缘缘在这里发誓,以后再不说LED,如果后面再说LED,那么缘缘……,还没想好呢,等想好了再说吧!
跟着缘缘看了这么多的LED,是不是有点喜欢LED了呢,我们看看我们的LED在前面是怎么变形的:
我们看到,一个LED变成了多个LED,多个LED经过重新的排列变成数码管,数码管再加几个,就变成了8位数码管,这一系列的变化,操作的方法就是把一个LED点亮或关闭的过程,那么,如果我们用8列这样的LED,关把它们整整齐齐地排列到一起,这样成了啥样子了?
这就是LED点阵了,看起来是不是有点像前面说过的8位数码管的原理呢,其实,它们是排列不一样了,但显示原理是一样的,只不过变样了而已:
那么它是怎么工作的呢,比如,让它显示一个固定的字母或是形状,这时,我们发现,决定这个的显示是行和列两种端口决定的,这种显示原理我们可以参照数码显示的原理,我们上节有个人视觉残留效应,如果我们利用这个效应,让它显示的速度足够快,这样是不是就能达到我们要显示的要求呢,我们一步步来看吧:
我们看到,当我们把所有的列都选通上电的时候,它们的每一行都显示的不一样,但所有的行不可能是同时显示的,这里,我们在人视觉残留效应的时间内先让第一行亮,依次地显示第二行——第8行,这样,就会达到我们的要求,显示出一个我们要求的字母来或是文字、图形来:
是不是很好玩啊,那么我们如何去实现上述显示过程呢,那么就跟着缘缘一起来做个这样的实验块子,我们弄几个程序玩玩,在这之前,先了解一下它的显示处理,也称扫描方法:
点阵LED一般采用扫描式显示,实际运用分为三种方式:即点扫描、行扫描和列扫描了。
若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。
若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
看了这些,是不是想和缘缘一起玩玩LED点阵了,那就跟着缘缘DIY吧:
准备的材料:8针的排针2组,1针的一个(电源正极接口),LED点阵一块,电阻8个,三极管8个,单排插口一条(为了方便,转接LED点阵)。
先用以前说过的方法找到LED点阵的行与列的针脚端口,(列是正极,行是负极):
这是通过找到的LED点阵的针脚定义:
在合适的地方放置好其它的元件并焊接,LED点阵的接脚要与LED点阵去测量的,按上面的针脚定义,在所有列的端口上面把电阻串连上,缘的LED点阵是大块子,所以缘选的电阻小一些,只有75欧。
把三极管也焊接到上面,所集电极全部接到一起,最后接到单独的那一根针上,发射极按到电阻上基极按上面的针脚定义,接到左边的那一组排针上,把剩下的没有接电阻的管脚依据上图的针脚定义,接到右边的排针上:
焊接完成后,把LED插上,如下图,开始我们的激情实验吧:
好了,我们的实验板算是做好了,我们先看看我们的实验板能正常工作不,我们就把它所有的行与列全部打开,这里,我们定义P0为列,P2为行,我们写一个这样的测试程序:
结果发现我们的LED点阵全亮了:
为了验证是不是有错误,我们先把行定义为全开,把列逐条显示,怎么去显示这个列呢,我们记得以前用过数码管的位选代码,就用它吧:(延时中有个错误,后面是加号,缘缘写成了减号了)
再把列固定全开了,让行逐条显示,只是把两个P口换一下,其它的保持不变哦:
当我们同时进行列与行的扫描时,我们发现,变成了一个个的点了,为了直观的感觉,我们就原用上面的代码:
当我们把延时弄的很小的时候,这些点就连成一条线了:
现在我们基本上明白了LED的三种工作方式,即行扫描,列扫描和点扫描,那么如何让它显示一个固定的形状呢,缘缘为了方便大家理解,我们就用其中的一种——行扫描来说明:
前面我们固定了列的显示,即不管那一行显示,列的显示是一个数值,在列全开的情况下,我们看到的是一行行地显示:
如果我们减小延时,加快显示的速度,我们就看到了显示的是全部的LED,即整块的点阵全亮了:
明白了这点,那么我们看看之前的这个N是怎么显示的,我们用的是逐行扫描的方式,即第一行(1111 1110)打开的时候,我们让列的第一列全部显示(0000 0000)打开,换算成编码是:
列为:0x00;行为0xfe,这样,通过8次,就会把8条列与行配合显示完,扫描速度过快的话就变成了N的图形了,为了方便编码,我们找个这样的软件来——8*8点阵取模软件(软件上传到网盘了,地址在后面),如下图所示,因为行的编码我们用以前固定的,这里我们就用列的编码就行了:
为了达到视觉残留效应,我们把延时做到了500US显示一次,显示效果如下图:
通这这种方法,我们就会显示更多的东西来,如这个笑脸:
如A:
这样,我们就学会用LED点阵显示图形与字母或是数字了,亲们,你们懂了吗,那么下面的例程就交给亲们完成吧,很好弄的哦。
实验一:让LED点阵显示0—9这几个数字和26个英文字母
实验二:让LED点阵显示汉字
实验三:让LED点阵显示图形
综合实例:送给情人节的礼物
做这个例子,我们要弄个动态显示的,那么如何实现动太显示呢,我们要做一个表格函数,在表格函数的里面再做个子表格函数,方法如下:
这里我们看到有两个号,其中前面一个是指在这个表格函数下有多少个子函数,而后面的一个是指每个子函数有多少个值,如这个表格就是有18个了表格函数,每个子函数包含8个值,为了显示动态,我们让一个时间去定这个显示的东西,用另一个时间去定这个显示时的扫描值,这样就做成了动态的效果了,为了方便使用,不用延时函数,用的是列扫描哦,其程序如下:
#include< reg51.h >
unsigned char code tab={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,}; //列选通控制
unsigned char code digittab={
{0xFF,0xC3,0xBD,0x7E,0x7E,0xBD,0xC3,0xFF},//0
{0xFF,0xFE,0xBE,0x7E,0x00,0xFE,0xFE,0xFF},//1
{0xFF,0xCC,0xBA,0x7A,0x76,0x76,0x8E,0xFF},//2
{0xFF,0xD9,0xBE,0xB6,0xB6,0xC9,0xFF,0xFF},//3
{0xFF,0xC7,0xB7,0x77,0x00,0xF7,0xF7,0xFF},//4
{0xFF,0x0D,0x6E,0x5E,0x5E,0x5D,0x63,0xFF},//5
{0xFF,0xC1,0xB6,0x6E,0x6E,0x76,0x99,0xFF},//6
{0xFF,0xBF,0xBF,0xB0,0xAF,0x9F,0xBF,0xFF},//7
{0xFF,0xC9,0xB6,0xB6,0xB6,0xC9,0xFF,0xFF},//8
{0xFF,0x9D,0x6E,0x6E,0x6E,0x81,0xFF,0xFF},//9
{0xC7,0x83,0x81,0xC0,0xC0,0x81,0x83,0xC7},//实心
{0xDF,0xBB,0xBD,0xDE,0xDE,0xBD,0xBB,0xDF},//笑脸
{0xDF,0xBB,0xBD,0xDE,0xDE,0xBD,0xBB,0xDF},//空心
{0xFF,0xC3,0xDB,0xDB,0x00,0xDB,0xDB,0xC3},//中
{0x00,0x7E,0x54,0x40,0x54,0x54,0x7A,0x00},//国
{0xFF,0x80,0xB6,0xB6,0xB6,0xB6,0x80,0xFF},//日
{0xFE,0xFD,0x03,0x57,0x55,0x56,0x01,0xFF},//月
{0xDD,0x88,0xD5,0xE3,0xD5,0x88,0xDD,0xFF},//图案
};
unsigned int timecount1 , timecount2; //定义的变量
unsigned char cntx , cnty ; //cntx列控制数的变量 cnty用来控制 字符与字符之间的切换
void main(void)
{
cnty=0;
while(1)
{
if(cnty<18)
{
P2=tab; // 列线
P0=digittab; // 行线
}
//用于控制动态扫描的速度
if(++timecount1>=50)
{
timecount1=0;
if(++cntx>=8) cntx=0;
}
//用于控制动字符间的切换速度
if(++timecount2>=60000)
{
timecount2=0;
if(++cnty>=36)cnty=0;
}
}
}
下载试试吧,程序很简单的,也是别人家的程序,我改了下自己处理的图形,完了想显示什么,就把那些子函数变了就行了,一定要记得在大括号后面加个小豆号哦,现在,用这个加上以前我们弄过的那个流水灯,用两块单片做个情人节的礼物肯定是不错的哦 ,如果谁现在做一个送给缘缘,缘缘决定嫁给他,但时间是下辈子……
为了方便大家使用,缘缘将一些有关的单片机软件上传到网盘中,有需要的就去下载哦:http://pan.baidu.com/share/link?shareid=2202576570&uk=2248845538
对于LED基本上算是说完了,亲们,不知道你们会了没有,其实LED更大的延伸是光立方和LED点阵的屏幕广告或点阵墙,但不管怎么变化,它们都是以8*8的点阵为基础的,这里只要熟悉8*8的点阵就行了,以后的需要借助芯片才能完成,所以有机会再去讲解更复杂的运用,下一节我们看看两个常用的芯片吧。