LED点阵屏发光亮度强,指示作用好,能够制造运动的发光图文,更简略吸引人的注意力,信息量大,随时更新,有着非常好的广告和告示作用。笔者此处就LED点阵屏动态扫描显现作一个简略的介绍。
1. LED点阵屏显现原理概述
图1-1为一种8×8的LED点阵单色行共阳模块的内部等效电路图,关于红光LED其作业正向电压约为1.8v,其继续作业的正向电流一般10ma左右,峰值电流能够更大。如下图,当某一行线为高电平而某一列线为低时,其队伍穿插的点就被点亮,当某一行线为低电平时,无论列线怎么,对应的这一行的点悉数为暗。LED点阵屏显现便是经过必定的频率进行逐行扫描,数据端不断输入数据显现,只需扫描频率足够高,因为人眼的视觉残留效应,就能够看到完好的文字或图画信息。一般有4、8、16线扫描方法,扫描行数越少,点阵的显现亮度越好,但相应硬件数据寄存器需求也越多。
图1-1 点阵内部原理图
2. 硬件规划
微操控器的IO口均不能流过过大的电流,LED点亮时有约10ms的电流,因而LED点阵引脚不要直接接单片机IO口,应先经过一个缓冲器74HC573。单片机IO口只需很小的电流操控74HC573即可直接的操控LED点阵某一行(或某一列),而74HC573输出也能负载约10ms的电流。设置LED每点驱动电流为ID=15ma,这个电流点亮度好,而且有必定的裕度,即便电源输出电压偏高也不会焚毁LED,限流电阻值R = (VCC- VCE– VOL– VLED) / IDVCC为5v供电,VCE为三极管C、E间饱满电压,估为0.2v, VOL为74hc573输出低电平时电压,不同灌电流,此值不一样,估为0.2v,详细检查规格书,VLED为红光驱动电压,估为1.7v,依据上式可算出限流电阻为R = 200R。
LED点阵屏需接纳逐一扫描信号,扫描到相应列(或行),对应的列(或行)数据有用,即显现这一列(或行)的信息。一般发生扫描信号是需求选用专门的译码器,如三线八线译码器74HC138,这样可硬件确保恣意时刻只要一列(或一行)正在扫描,而且可削减微操控器的IO口占用。市面上的51开发板关于LED点阵屏的规划根本都没有选用译码器,直接用单片机IO发生扫描信号,为兼容软件,笔者此处也不加译码器,软件确保IO口发生相应的扫描信号。
当某一列(或一行)LED点均点亮时,电流约15max8=90ma流过这一列(或一行)公共端,微操控器IO口无法直接驱动这个电流,需加三极管驱动,因为51单片机低电平灌电流较大,因而适宜选用PNP三极管作为驱动。三极管基极电流设为2ma即可让三极管饱满,最大驱动电流远大于90ma。基极偏置电阻阻值Rb=(VCC- VEB– VOL) / IBVCC为5v供电,VEB为三极管E、B间的导通电压0.7v,VOL为单片机IO口输出低电平时电压,可依据规格书估为0.2v,故Rb= 2k即可。
图2-1 8X8共阴LED点阵原理图
3. 驱动完成
LED点阵数据口接P0口,扫描挑选线接P2口的0~7位。关于动态扫描,都是有一个扫描频率的,LED屏扫描频率下限为50HZ,低于必定的扫描频率,显现会闪耀。频率过高,则亮度较差且占用cpu资源。一般整个屏扫描一遍时刻为约10ms较适宜(即扫描频率100HZ),咱们选用的是8线扫描方法,每一行点亮时刻为1.5ms,扫描一遍为12ms。为确保这个改写频率,一般是经过定时器来周期性进行点阵屏改写。
显现屏显现往往会涉及到画点、画线、画图等杂乱的运算,改动屏幕的信息,只需处理显存中的数据,因而关于显现屏,是需求拓荒出一块内存空间作为显存运用的。8X8点阵每个点可用1 bit表明,一行1字节,显存8字节即可。因为点阵屏像素点太少,没有必要完成画线、画图等杂乱操作,笔者此处仅对点阵屏画点、文字上下左右移动进行代码完成。
点阵屏动态显现功能模块文件Matrix.c内容如下:
#include“reg52.h”
#include“Matrix.h”
// 每个LED点需1位保存,8X8点阵需8字节显存
staTIc unsigned char FrameBuffer[8];
// 外部模块经过该函数取得显存内存方位进行处理
unsigned char *MatrixGetBuffer()
{
return FrameBuffer;
}
// 点阵改写,确保以必定周期调用改写
void MatrixScan()
{
staTIc unsigned char Select =0; // 记载扫描的挑选线
// 列数据输出到点阵数据端口
MatrixOutputData(FrameBuffer[Select]);
// 扫描信号输出到点阵扫描挑选端口
MatrixOutputSelect(Select);
Select++; // 进入到下一行扫描
if (Select 》= 8) {
Select= 0; // 一切行已扫描,回到榜首行再次开端扫描
}
}
// LED点阵屏打点函数,对(x, y)方位进行亮,灭,状况取反
voidMatrixSetPoint(unsigned char x, unsigned char y, unsigned char OperaTIon)
{
if (x》7 “| y》7) { // 方位确保在点阵屏区域内
return;
}
switch (OperaTIon) {
case SET: // (x, y)方方位位,灯灭
FrameBuffer[x] |= 1《《 y;
break;
case CLEAR: // (x, y)方位清零,灯亮
FrameBuffer[x] &= ~(1《《 y);
break;
case NEGATE: // (x, y)方位取反,灯状况改动
FrameBuffer[x] ^= 1《《 y;
break;
default:
break;
}
}
// LED点阵屏清屏,显存对应1的方位,灯灭,0相应的灯才点亮
voidMatrixClearScreen()
{
unsigned char i;
for (i=0; i《8; i++) {
FrameBuffer[i] = 0xff;
}
}
// 点阵平移,上下左右四个方向平移1,平移空缺方位用数据Filling填充
void MatrixMove(unsignedchar Direction, unsigned char Filling)
{
unsigned char i;
switch (Direction) { // 判别平衡的方向
case MOVE_UP: // 向上平移1,每列数据第7位移到第6位,如此类推
for (i=0; i《8; i++) {
FrameBuffer[i] =(FrameBuffer[i]》》1) | ((Filling《《(7-i))&0x80);
}
break;
case MOVE_DOWN: // 向下平移1,每列数据第0位移到第1位,如此类推
for (i=0; i《8; i++) {
FrameBuffer[i]= (FrameBuffer[i]《《1) | ((Filling》》i)&0x01);
}
break;
case MOVE_LEFT: // 向左平移1,右一列的数据移到当前列中,如此类推
for (i=0; i《7; i++) {
FrameBuffer[i] = FrameBuffer[i+1];
}
FrameBuffer[i] = Filling;
break;
case MOVE_RIGHT: // 向右平移1,左一列的数据移到当前列中,如此类推
for (i=7; i》=1; i–) {
FrameBuffer[i] = FrameBuffer[i-1];
}
FrameBuffer[i] = Filling;
break;
default:
break;
}
}
咱们在点阵屏模块头文件Matrix.h中完成模块的宏界说及接口拜访宏完成,使之便利移植及修正接口装备。模块头文件一起也引出模块的接口函数,如MatrixScan()为点阵屏改写函数,需周期性调用改写点阵屏显现。点阵屏动态显现功能模块文件Matrix.h内容如下:
#ifndef__Matrix_H__
#define__Matrix_H__
#ifdef__cplusplus
extern”C“ {
#endif
#define SET 0x1 //置1操作
#define CLEAR 0x2 // 清0操作
#define NEGATE 0x3 //取反操作
#defineMOVE_UP 0x1 // 向上平移1
#defineMOVE_DOWN 0x2 // 向下平移1
#defineMOVE_LEFT 0x3 // 向左平移1
#defineMOVE_RIGHT 0x4 // 向右平移1
// 列数据输出到P0口
#defineMatrixOutputData(Dat) {P0 = (Dat);}
// P2口输出对应列的扫描挑选线,低有用
#defineMatrixOutputSelect(Select) {P2 = ~(1《《(Select));}
voidMatrixClearScreen(void);
voidMatrixMove(unsigned char Direction, unsigned char Filling);
unsigned char*MatrixGetBuffer(void);
voidMatrixScan(void);
voidMatrixSetPoint(unsigned char x, unsigned char y, unsigned char Operation);
#ifdef__cplusplus
}
#endif
#endif/*__Matrix_H__*/
外部使用经过引进点阵屏的模块头文件Matrix.h来完成调用点阵屏驱动函数,简略测验调用(心形在点阵屏内随机平移)完成如下:
#include”reg52.h“
#include”Matrix.h“
// 心形坐标数据
static unsigned charcode HeartShape[][2] = {
{3, 3}, {4, 2}, {5,3}, {5, 4}, {4, 5},
{3, 6}
来历;21ic