基于AT89S52单片机的8×8 LED点阵显示屏的设计
2019-07-23孙陈英
孙陈英
(江苏省江阴中等专业学校,江苏 江阴 214400)
0 引 言
LED点阵显示屏因具有色彩鲜艳、功耗低、工作稳定及亮度高等优点,被广泛应用与商场、公交站台、银行及车站等公共场所,可以动态流水显示各种各样的字符、数字及汉字。本文选用8×8 LED点阵(1588BS)设计一块可以显示“Happy Birthday!”的显示屏来取代蛋糕上的纸质贺卡,实现由静态到动态,由无光到有光的感官效果。
1 8×8 LED点阵的电路原理图设计和字符取码
1.1 8×8 LED点阵电路原理图设计
8×8 LED点阵是由64只发光二极管以8行、8列的形式呈现,根据发光颜色可分为单色、双色及三色。本文选用的1588BS是单色8×8 LED点阵,根据其内部结构可知,为使某一个LED点亮,只需让其对应的列送低电平,对应的行送高电平即可。当需要多个LED同时被点亮时,只需让其对应的行列根据LED点亮情况送相应的高低电平。
点阵行列高低电平的输入通过编写程序来控制,程序的编写要和电路原理图相结合。对于单个8×8 LED点阵,其驱动电路比较简单,选用单片机最小系统电路,包括单片机芯片、晶振、复位及电源电路,同时用单片机的P0口加上拉电阻直接驱动点阵的行,P2口直接驱动点阵的列。为了便于仿真和调试,用PROTEUS仿真软件绘制电路原理图[1]。
1.2 8×8 LED点阵的字符取码
分析字符在LED点阵的显示原理,首先要分析字符的显示代码。字符的显示通过动态扫描显示方式来实现,扫描方式有行扫描和列扫描两种。本文采用列扫描来分析显示字符“H”的动态扫描过程,字符H的点阵示意图如图1所示。
图1 字符H的点阵示意图
扫描第一列,只需给第一列送低电平,列输入数据为01111111;根据字符“H”的字形,需要第一行至第七行的LED点亮;根据LED的显示原理,行输入数据让需要点亮的LED所在行送高电平,无需点亮的送低电平,可以得出二进制数据编码为11111110;结合电路原理图得知P0.0连接的是点阵第一行,而P0.7连接的是点阵第八行,所以将二进制编码转换为十六进制编码为0x7F[2]。
按照此方法依次扫描其余几列,可以得出字符H的数据编码如表1所示。单片机反复重复扫描第一列至第八列,虽然是逐列扫描,逐列显示,但是可以合理控制循环扫描的时间,利用人眼的视觉滞留效应,看到的是各列同时点亮,出现一个完整的字符H。
按照此方法可以分析得出所有字符的数据编码,但是一般在多个字符取码中,为了提高效率,常采用取模软件来进行取码。经取模软件取码得出“Happy Birthday!”中所有字符的编码。
表1 H字符点阵数据编码
2 8×8 LED点阵动态显示“Happy Birthday!”程序设计
在分析得出各个字符数据编码的基础上,点阵行列高低电平的输入需要通过编写程序来实现[3],下面是动态流水显示“Happy Birthday!”的程序编写。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar time,yw,i;
uchar code dat[]={
0x7F,0x08,0x08,0x08,0x7F, // -H-
0x24,0x54,0x54,0x38,0x40, // -a-
0xFC,0x24,0x24,0x24,0x18, // -p-
0xFC,0x24,0x24,0x24,0x18, // -p-
0x9C,0xA0,0xA0,0x90,0x7C, // -y-
0x00,0x00,0x00,0x00,0x00, // - -
0x7F,0x49,0x49,0x49,0x36, // -B-
0x00,0x00,0x79,0x00,0x00, // -i-
0x04,0x78,0x04,0x04,0x08, // -r-
0x04,0x3F,0x44,0x44,0x24, // -t-
0x7F,0x08,0x04,0x04,0x78, // -h-
0x38,0x44,0x44,0x28,0x7F, // -d-
0x24,0x54,0x54,0x38,0x40, // -a-
0x9C,0xA0,0xA0,0x90,0x7C, // -y-
0x00,0x00,0x5F,0x00,0x00, // -!-
0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0x00,0x00,0x00, // - -
};
void delay(uint x)// 延迟函数结束
{
uint i,j; // 声明变量
for(i=0;i<x;i++) // 外循环 xms
for(j=0;j<10;j++); // 内循环 1ms
}
void INit()
{
TMOD|=0x01;//定时器0 模式1 16位定时模式
TH0=(65536-10000)/256;//定时10.000ms
TL0=(65536-10000)%256;
ET0=TR0=EA=1;//定时器开始计数
}
main () // 主程序开始
{ // 声明变量
INit();
while(1) // 无穷循环
{
for(i=0;i<8;i++) // 扫描 8 列
{
P2=~(0x01<<i);// 扫描第一列
P0=dat [i+yw];// 输出行数据
delay(1); // 延迟 1ms
P0=0x00;//清影
} // 扫描8列 (i循环)结束
}
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;//10.000ms 进入一次中断
TL0=(65536-10000)%256;
time++;
if(time==10)//到100.000ms时间加以实现移动 用于控制移动速度
{
time=0;
yw++;
if(yw>80)yw=0;
}
}
将程序编译完成后生成HEX文件,下载至单片机,打开PROTEUS仿真软件运行后即可以看到动态流水显示“Happy Birthday!”。
3 结 论
文中以AT89S52芯片为硬件基础,完成了8×8 LED点阵显示字符的的硬件和软件设计。仿真效果表明,该方案有效可行。其中编写单片机驱动点阵程序来显示字符是学习8×8 LED点阵的要点。