关于led显示的一点粗浅经验之谈
一: LED显示器件的基础
LED发光器件一般常用的有2类、数码管和点阵
1:数码管
a,数码管常用的一般8字型,分为A B C D E F G P段,其中P位小数点
b,数码管常用的有10根管脚(单位),每段一根管脚,另外两根管脚为公共端,2根是通的
c,从尺寸上分的话种类很多, 常用的有0.3 0.5 0.8 1.0 1.2 1.5 1.8 2.3 3.0 4.0 5.0 等等
d,一般小于1.0的为单管芯,(1.0有单有双),1.2~~1.5为双管芯,1.8以上为3个以上的管芯, 因而他们的供电电压要求不同,
一般每个关芯的压降为2.1v左右, 我的经验是0.8以下5v供电,1.0~2.3为12v,3.0以上更高
e,数码管分共阴和共阳两种
2:点阵
a,点阵常用的为8*8,以前还有5*8(现在不大用了)
b,点阵都是单管芯,分(行)共阴和(行)共阳,一般都用5v供电
c,8*8点阵为16根管脚(单色, 也有24根的, 可能是作废的双色点阵或者为了能在同一种线路板上实现单色双色都可用而设计
的, 也比较常见)8根行8根绿,双色为24根管脚, 8根行, 8根列红, 8根列绿。
二: 显示基本原理
分为静态(只有数码管能实现)和动态
1:静态的比较好实现,在此不多讲了
2:数码管动态
a,硬件连接
数码管一般为1/13 能扫描, 再高的话亮度损失比较大,在此假设为列为13列, 行为16行, 共阳管, 每行数码管的各段连在
一起,每列数码管的公共段连在一起. 列开关用tip127, 他可以直接用154驱动, 达林顿管5安培, 注意127输出不要加电阻
行用595(164不建议)+2803或者2003+一个9013, 在2003的输出要加上限流电阻,一般为56~330欧姆(如果是<1.0的数码管,
可以直接用595加电阻驱动)
b,软件
采用89c51为cpu, 存储器可采用24c系列, 或者28c系列, 注意他们的写入速度都不是很快, 不过一般数码管的输入设备为
键盘或遥控器, 速度足够了, 还有24c系列的读出速度也比较慢, 我发现每次读出的数据大概只有20以内才不会影响更新显
示显示采用时钟中断1, 中断时间不能超过1.5ms, 最好为1.2ms左右, 可以在中断服务程序中读24c02, 也可以在中断的间
隙中读取, 但必须保证能够读出所有的一列数据! 读出的数据放到一块显示区中, (在内存中定义一个数组buf[16]), 在中
断子程序中把数据发送的595中即可, 最好采用串口发送, 编程最简单.
发送完毕后,关掉控制行的154, 给595的RCLK(12脚)一个脉冲, 把数据从移位寄存器传输到锁存器, 而后打开154并输入列
信号即可
3: 点阵
a,点阵一般采用1/16扫描,控制原理和数码管差不多
b,硬件: 行用154+tip127,列用595加电阻(0~56欧姆)直接驱动
c,软件: 方案比较多,见下面
三: 先说说信息的存储
分为2种,
1:一种为固化的汉字, 汉字点阵信息存于27c256 中, 最多存1024个16*16 点阵汉字, 要修改只能重新写27c256, 优点是不丢
失, 一般我们为银行做的都是这种, 他很少修改显示能容, 而且以后每次修改可以收费(哈哈~~~),缺点是不灵活
2: 另一种是可以用户自己修改的, 修改方式又分为2种, 早期一般用键盘或者遥控器修改, 那样必须在主办上固化有汉字字
库, 可用27c040固化ucdos的hzk16全角字库和asc16半角字库, 用户输入区位吗进行修改, 用户需要显示的汉字以区位码的
方式存到一片E2POM中, 显示的时候程序根据区位吗读取点阵信息送到屏上显示, 还有一种近年来常用的方式就是利用微机
串口进行修改,这里面还分为两种
A,控制板上没有字库, 微机发送的是显示的点阵信息, 控制板接受后把信息存到带电池的RAM中(也可用E2PROM,但速度
很慢), 这种的缺点是掉电池的RAM不太可靠, 常常丢失信息
B,控制板上带字库, 微机发送汉字的机器码(内码)即可, 其他同上
四: 显示的控制
信息的发送可以有好多方式, 根据采用器件的不同而不同, 有的厂家采用374控制而不采用595, 那样的话直接写一个外部端口
即可, 374级连方式, (如果用1 排374 的话在传输中必须关掉显示, 显示字较多的话影响亮度, 用2 排374 不必关掉显示但增加硬
件成本), 目前用得较少了,595的很常见。 发送可以用传口, 很简单, 也可以用别的口模拟串口发送 (因为传口还有可能随时接
受微机的信号), 也可以采用串口复用 (不过我不会,:)~~)
我采用的是用 374+165 向595 发送数据, 硬件比较复杂, 但是在以后的显示花样中很好用! 特别是左右移位, 爽极了!
提示一下: 最近用双龙的90S8515发现很好, 因为他还有一个SPI口, 用来送595信号更爽! 速度可到3M,(12M晶体), 强烈建议
大家用这种芯片(靠, 也不知到双龙看到了会不会给点奖励....)
五: 一些注意事项:
1: 显示时间,每行<1.5MS
2: 根据经验,89C51 12M晶体最大控制48个16*16点阵,再大的话可以提高晶体频率和优化程序,(就是发送程序的时间最短)
3: 在显示的字比较多时, 一定要注意发送子程序的代码效率, 因为发送是一个循环, 所以循环体内的处理越快越好, 大家现在
大都用C51, 更得注意, 我可是吃过亏的。
大家看下面的例子:
if(hangno==0x10)hangno=0; //hangno为显示的行序号
for(i=0;i<32;i++)
{
PORT1=*(addr+hangno*0x600+i); //我的汉字信息是0~600为第一行信息
//600~0c00为第二行信息...
PORT2=0x0ff;
}
每次发送32个字节(16个字), 程序编译通过, 没有问题, 可是当显示64个汉字时(假设)显示就乱了, 后来改为
if(hangno==0x10)hangno=0; //hangno为显示的行序号
w=hangno*0x600;
for(i=0;i<128;i++)
{
PORT1=*(addr+w+i); //我的汉字信息是0~600为第一行信息
//600~0c00为第二行信息...
PORT2=0x0ff;
}
就没有问题了, 大家自己看看, 就知道原因了, 对吧?
|