LED汉字点阵显示系统设计.docx
《LED汉字点阵显示系统设计.docx》由会员分享,可在线阅读,更多相关《LED汉字点阵显示系统设计.docx(15页珍藏版)》请在冰豆网上搜索。
LED汉字点阵显示系统设计
辽宁工业大学
电子综合设计与制作(论文)
题目:
LED汉字点阵显示系统设计
院(系):
电子与信息工程学院
专业班级:
电子092
学号:
090404031
学生姓名:
罗哲
指导教师:
教师职称:
起止时间:
课程设计(论文)任务及评语
院(系):
电子与信息工程学院教研室:
电子信息教研室
学号
090404031
学生姓名
罗哲
专业班级
电子092
题目
LED汉字点阵显示系统设计
任务和要求
任务和要求:
基本要求:
1、采用8051单片和LED点阵显示模块设计实现组合点阵信息显示。
2、设计驱动电路具备字符显示及点阵显示功能
2、提高要求:
具有显示内容自动更新的功能以完成对任意存储的信息内容进行完整的显示。
指导教师评语及成绩
平时:
论文质量:
答辩:
总成绩:
指导教师签字:
学生签字:
年月日
注:
成绩:
平时20%论文质量60%答辩20%以百分制计算
摘要
本文主要了介绍LED汉字点阵显示系统原理。
以51单片机作为控制部分的核心,分别论述了分区显示和整体逐行扫描显示的可行性及其理论依据。
从分别从硬件构成和软件驱动的方面分析了LED汉字点阵显示系统的原理,并给出了可行的方案。
同时,本文也用一定的篇幅简要介绍了较大规模的LED汉字点着显示系统,即其在实际设计中应注意的问题和解决方法。
本文所介绍的LED汉字点阵显示系统具有思路简答,易于实现的特点,所有设计参数均经过详尽的计算或查阅相关的资料,且已经在protues仿真平台上测试通过。
关键词:
单片机;点阵屏
目录
第1章绪论1
1.1LED汉字点阵显示系统的应用前景1
1.2本文研究内容1
第2章LED汉字点阵显示硬件设计2
2.1字模的提取2
2.2LED汉字点阵显示系统总体设计方案4
2.3控制核心模块设计4
第3章LED汉字点阵显示系统软件设计6
3.1基本软件功能综述6
3.2复杂软件功能6
3.3流程图设计7
3.4程序清单7
第4章系统设计与分析11
4.1系统扩展方案11
4.2系统扩展框图11
第5章设计总结13
参考文献14
绪论
LED汉字点阵显示系统的应用前景
目前,基于LED点阵屏的标牌在公共场所,市内外广告,信息发布,大型活动现场等地随处可见。
且有向大面积,多色化,以及廉价的趋势发展。
研究LED汉字点阵显示系统的意义在于可以更好的了解LED汉字点阵显示的原理和工作特点,以便于可以对现有产品进行修改和升级,使其性能更加优良,更符合大型活动和普通日常生活的需要,为人们在信息获取方面提供更多的便利。
LED汉字点阵显示屏具有醒目,低成本,性能稳定,易于安装等诸多优势。
与液晶屏幕相比虽然能好较高,但其容易实现模块化,使用时可以根据实际情况进行组装,增大了使用的方便性与灵活性。
因此,在未来相当长的一段时间内,LED汉字点阵显示屏和传统的液晶显示屏将在信息传播上发挥其各自的特点。
本文研究内容
本文以51单片机作为控制系统的主体,深入分析和介绍了LED汉字点阵显示的作用原理和控制方法。
分别从硬件构成和软件实现两个方面对LED汉字点阵显示系统进行研究。
分别从理论与实际的角度分析了单个LED汉字显示系统与多字及多像素图案显示系统在硬件结构与软件编程方面的区别。
本文设计的LED汉字显示系统可在protues软件平台上进行仿真。
但软件仿真方面,在LED点阵屏显示的完整性上表现不是很好。
如在快速扫描显示的时候,点阵屏会有一行无法显示。
LED汉字点阵显示硬件设计
字模的提取
计算机显示屏上的汉字实际上是由一组有序排列的像素构成的。
如果有笔画的像素不亮,而其周围的像素都是亮的,就能看到一个黑色笔画的汉字。
能够清楚地显示一个汉字的最小像素数是16*16=256。
这是DOS时代就定下的规矩。
现在的WINDOWS有了矢量字体,大大丰富了汉字的显示,能在屏幕上不失真地显示不同字体的汉字。
在计算机中,由8位比特(bit)组成一个字节(byte),而双字节则构成一个字。
于是可以用两个字节共16位比特来代表一行的信息,16行共32个字,用某位是0还是1来控制点亮还是熄灭对应位置的像素,就能在16*16LED点阵屏上显示汉字。
所以,首先要做的就是如何得到这256个表示汉字笔画的信息。
这里需要用到一个专门用于提取字模的软件。
如图1。
图1字模提取软件
这款软件可以实现将汉字(可以是任意字体)或任意图型转化成任意点阵组成的矩阵或数组。
我们可以以此作为汉字显示的依据。
由于每块LED模块为8*8的点阵屏,由图可见组成完整的汉字显示屏幕需要用到4块这样的显示屏。
字模分区示意
图2所示是一个“辽”字,这里将一个汉字的显示区域划分成四个8*8的子区,即A,B,C,D区。
如图2
显而易见,可以用一个字节来表示一个子区中一行的信息,32个字节就能表示4个子区。
我们只要按照某种顺序,依次将这些信息存入一个容量为32的数组就可以了。
存取的顺序可以有多种,比如A,B,C,D或A,C,B,D等,存取顺序的不同,没有大的区别,只是影响将来的编程思路。
以图为例,按A,B,C,D的顺序可以得到的数据如下:
/*--文字:
辽--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
0x40,0x00,0x27,0xFC,0x30,0x08,0x20,0x10,0x00,0xA0,0x00,0x40,0xE0,0x40,0x20,0x40,
0x20,0x40,0x20,0x40,0x20,0x40,0x23,0xC0,0x20,0x80,0x58,0x00,0x87,0xFE,0x00,0x00
如果这里只考虑A区的话,那得到的数据就是上面加下划线的部分,即:
0x40,0x27,0x30,0x20,0x00,0x00,0xe0,0x20
这里首先从8*8点阵的最高行开始点亮(0xfe),然后在点亮每行的时候,读入对应行的16进制代码。
此代码可存于一个8个元素组成的数组中。
当使用4块led模块时,共有256个像素。
以8个像素作为一组,则共需要扫描32次以完成一次显示。
LED汉字点阵显示系统总体设计方案
这里暂不考虑实际使用的布线问题,仅从理论的角度分析。
由于是使用51单片机,所以共有4个I/O口可供使用。
使这4个I/O口相互搭配,协调使用,即可实现对汉字的显示。
汉字显示框图
但由于本文设计采用的是共阴极LED点阵屏,所以对列选通的8位信号每次只需要有一个是低电平(有效),其余均是高电平(无效)。
显然这里是可以用74138之类的译码器进行简化电路结构的,简化后P0和P3作为数据口保持不变,而P1和P2作为片选仅需要6个引脚即可。
篇幅所限,此种方案暂不作重点介绍。
控制核心模块设计
CPU的选择
如题,现在市面上最常见的51单片机主要由atmel和STC公司生产。
两者除在程序烧写时有较大差异外,其他多数情况是可以兼容的。
这里选择STC89C52RC这个芯片。
复位和时钟电路设计
图4复位和时钟电路
复位和始终电路如图所示,其中晶振为12M,电容器C1,C2为33pF的陶瓷或独石电容,C3为10μF的电解电容器。
电阻阻值为10k。
LED汉字点阵显示控制核心模块原理图
图5硬件电路图
LED汉字点阵显示系统软件设计
基本软件功能综述
目前市场上的同类产品,除了硬件构成以外,还要包含上位机软件,用于将所需要显示的汉字按照字体,大小,移动方向等要求转换成相应得代码,再通过串口通讯将控制程序传送到控制部分的存储器上。
LED汉字点阵显示系统是将每个汉字分成4个区域,分别显示。
又将每个区域分成8行,依次进行扫描。
每一行由8位二进制数代表的汉字字形编码构成。
所谓程序就是数据+算法。
首先设计一个有效的数据结构,再根据硬件电路的寻址方式,有序地将数据送达正确的点位(算法),最后汉字就显示出来了。
数据准备:
从本文前述关于16*16点阵汉字信息的提取,结合实例中的硬件寻址方式,不难想象,只要将这32个字节顺序存入一个数组,然后每两个字节为一组送往P0端口和P3端口形成列地址,再通过P1和P2给出行地址,对应行的LED将被选中,位于P0和P3中高电平的LED被点亮,其他的不亮,该行的点阵就形成了。
如此动作16次,将32个字节依次送出,一帧(16*16)的图案就先试试出来了。
只要以小于1ms的时间间隔循环做这组动作,一个汉字(或图案)就能稳定地显示在点阵屏上。
复杂软件功能
由于LED点阵屏本身结构简单,所以所谓的复杂显示也只是文字的上下滚动和左右移动等“动态”的显示操作。
这两种操作本质上都是对字模数组或点亮LED的行信息进行有规律的修改,比如将程序3.4中的字模数组整体每秒左移一位,我们就可以看到“辽”在LED点阵屏上从由向左就行滚动。
流程图设计
程序清单
#include
#include//此为自定义函数集,定义了常用延时函数和简化语句等
//intone[8]={0x00,0x20,0x13,0x00,0x00,0x30,0x50,0x10};//辽A
intzimo[32]={0x00,0x00,0x67,0xFC,0x37,0xFC,0x10,0x18,0x00,0x70,0x00,0x60,0xF0,0x60,0xF0,0x60,
0x30,0x60,0x30,0x60,0x31,0xE0,0x30,0xC0,0x78,0x00,0xCF,0xFE,0x47,0xFE,0x00,0x00};
inti=0;
charstatus;//存储A,B,C,D用于指示4个区域的显示状态
voidshowA(void);
voidshowB(void);
voidshowC(void);
voidshowD(void);
voidshowA(void)
{
P0=0;
P1=0;
P2=0XFF;
P3=0;
P1=0X7f;
for(i=0;i<16;i=i+2)
{
P0=zimo[i];
delay_n40us(3);
P1=P1>>1;
P1=P1+0x80;
}
status='B';
}
voidshowB(void)
{
P0=0;
P1=0;
P2=0XFF;
P3=0;
P1=0X7f;
for(i=0;i<16;i=i+2)
{
P3=zimo[i+1];
delay_n40us(3);
P1=P1>>1;
P1=P1+0x80;
}
status='C';
}
voidshowC(void)
{
P0=0;
P1=0XFF;
P2=0;
P3=0;
P2=0X7f;
for(i=16;i<32;i=i+2)
{
P0=zimo[i];
delay_n40us(3);
P2=P2>>1;
P2=P2+0x80;
}
status='D';
}
voidshowD(void)
{
P0=0;
P1=0XFF;
P2=0;
P3=0;
P2=0X7f;
for(i=16;i<32;i=i+2)
{
P3=zimo[i+1];
delay_n40us(3);
P2=P2>>1;
P2=P2+0x80;
}
status='A';
}
void