当前位置:首页 > 单片机 > 单片机
[导读]LED点阵屏发光亮度强,指示效果好,可以制作运动的发光图文,更容易吸引人的注意力,信息量大,随时更新,有着非常好的广告和告示效果。笔者此处就LED点阵屏动态扫描显示作一个简单的介绍。1. LED点阵屏显示原理概述

LED点阵屏发光亮度强,指示效果好,可以制作运动的发光图文,更容易吸引人的注意力,信息量大,随时更新,有着非常好的广告和告示效果。笔者此处就LED点阵屏动态扫描显示作一个简单的介绍。

1. LED点阵屏显示原理概述

图1-1为一种8x8的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) / ID

VCC为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) / IB

VCC为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}, {2,

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭