当某一列(或一行)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即可。

51单片机实现LED点阵屏动态扫描显示的设计

图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) { // 位置保证在点阵屏区域内