logo资料库

led点阵控制原理(显示汉字).docx

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
LED 点阵研究 [中文摘要] 随着 lcd 以及 led 显示技术的成熟,lcd 以及 led 在市场上占得份额也显得越来越重。 对于其的深入认识与研究,便成为了我们必不可缺的工作。本文首先针对应用型号为 EPM7128SLC 的 cpld 以及 AT89S52 芯片来控制一个 16x64 的 led 点阵,显示相应的 4 个 16x16 的汉字。其中,可以通过 verilog 硬件描述语言来编程 cpld 控制器,通过 c 语言或 是汇编语言来编程 AT89S52 作为 cpu 来控制所有的信号。在本次实验中,我们是通过 c 语 言来实现该功能的。通过对 led 的信号的调节,对其输入输出的理解,可以深入地知道 led 点阵显示管的显示原理,为对其以后相关产品的研究奠定基础。 关键字:lcd,led 点阵,色彩调节。 blue_bright:117。 一、 LED 点阵显示控制 本次实验用到的芯片有如下:EPM7128SLC(cpld),EPROM27C020 (汉字库),AT89S52(52 单片机),62256(数据存储器),HC245-1, HC245-2,HC573 等。在本次实验中,通过编程 cpld 以及 52 单片机,从 汉字库中提取出汉字,然后输送到 led 点阵中显示。整个程序可以分为 两个部分,字库提取以及处理,数据输送到 led 显示。 (一)实验原理 如下图所示:
(1)汉字库提取以及处理部分 根据已经输入的汉字的区位码 0xMN,我们知道区位码的每个区是 94 个位, 而每个汉字在汉字库中储存的容量是 32 个字节,为了要能在汉字库中提取 出汉字来,需要作以下处理: Address=((M-0xA0)*94+N)*32 得出的 address 就是汉字库中所给定汉字的首位地址,之后只要设定加一计 数器,自加 32 次,便能够输出整个汉字的地址码。由于芯片 27c020 的输出 是 8 位的,即每次输出一个字节。其中在单片机中要设定的端口控制有如下 几个: P1.5 与 P1.7 是分别控制 EPROM27C020 与 62256 的/CE,由于这两个端口中间 接有反相器,故两者信号反向。故只能从汉字库提字或是只能把数据存入 ram 中或取出 ram,而不能同时进行。他们均为低电平控制有效。 P3.6 与 P3.7 分别控制数据 ram 的/WR,/RD,控制 ram 的写入与读出,低电平 有效,当需要往 ram 中写入数据时,控制 P3.6 输出低电平,当需要从 ram 中读取数据时,置 P3.7 低电平。 接下来就是数据线跟地址线了。 P2.0~P2.7 为地址的高 8 位,选通 P0.0~P0.7 暂时作为地址线的低 8 位,需 要作为数据线时,将其转化成数据线,即 P0.0~P0.7 作为数据线与地址线不 同时使用。 整个流程如下:
首先输入汉字区位码,P3.6 置低,通过 P0.0~P0.7 输入 ram 中缓存,然后 P3.7 置低,从 ram 中读取首位地址,将其通过公式 Address=((M- 0xA0)*94+N)*32 转化成为可从 27C020 读取的地址码,直接从 27C020 中读 取,通过加一计数器,不断从 27C020 中通过 P0.0~P0.7 将数据读出,输出 到 cpld 的 D0~D7 中,为下一步显示作准备。 (2)Led 点阵显示程序 用到的管脚如下: P1.5,P1.6,P1.7 三个使能,led 行地址计数器清零操作时,要对这三个管 脚置高电平,选通清零译码器。 当清零操作完成后,需要让 P1.7 置低电平,选通颜色选择译码器。 P1.0,P1.1,P1.4 则是颜色选择译码器的输入端,也是清零译码器的输入 端,当 P1.4,P1.1,P1.0 的值为 101 时,选择红色,为 011 时,选择绿色, 为 110 时,选择清零功能,功能的实现,需要靠 P1.5,P1.6,P1.7 三个使 能共同协调实现。 接下来介绍 led 点阵的 I/O 口: LA、LB、LC、LD: 行驱动信号。由两个 HC138 将这四个信号译码成 16 位 信号,译码后的 16 位信号分别控制 16 行 LED(每行 64 个 LED)。 EN: 行信号输出控制。EN 为高电平时行信号输出有效。 SK: HC595 的移位寄存器时钟信号。两组 8 个串行在一起的 HC595 的移位 时钟信号并接在一起。 LT: HC595 的输出锁存信号。每次在 HC595 的移位寄存器移送 64 位数据后 (也就是一行数据),就要发出一个锁存信号(LT),将移位寄存器中的 64 位数据锁存入 HC595 的输出寄存器。 R1、G1: R1—红色 LED 数据,G1—绿色 LED 数据 显示流程如下: 通过 D0~D7 来的数据,通过译码器选通 green 或是 red 的并行转串行芯片, 对数据进行锁存,然后通过 srclk 端口输入时钟脉冲,将数据串行输出。串 行输出的端口接着 led 点阵的 64 位移位寄存器的输入端口,通过脉冲从 rclk 输入来控制,每进入一个脉冲,则移位寄存器向前移动一位,直到移 动 64 位满,通过 TL 端口输入一个正脉冲(上升沿触发),将移位寄存器的 值移入 led 点阵中进行显示,整个过程可以保持 EN 使能为高电平。TL 信号 还有另外一个作用就是,作为 led 点阵的行地址选通口的计数器的计数脉冲, 每当 TL 来一个上升沿时,计数器加一,导致地址口地址加一,从而选通下
一行。每次 16 行选择前,先对计数器进行清零操作,以保证行选择不会错 乱。 该过程的 c 语言程序在实验报告结尾的附录中,主要是 jumpfunction()里 的程序。字库的数据主要储存在一个二维数组中,作为外部 ram,然后就从 外部 ram 中提取数据便可。所给的程序中,是默认汉字的数据是储存在一个 二维数组中的。 (二)实验过程 实验主要分为三天。 第一天是实验原理的介绍,包括所有硬件措施的认识。剩下的两天就是 实验的主要过程。 (1) 首先理解整个提取汉字,送往 led 显示的流程,明白他的工作原理,其 次是了解附图的 cpld 的各个端口以及各个芯片的意义。 (2) 将转载 cpld 与 52 单片机的芯片板与 led 点阵的芯片板连接起来,注意 各个管脚的对应,具体对应可以参考原理介绍中的连接。然后连接稳压 电源。 (3) 编程 c 语言,验证程序的正确性,通过烧录器,将 c 语言程序烧入 52 单 片机中,将 cpld 的原理图烧录进 EPM7128SLC 中。 (4) 通电,验证编程的正确性,如果不正确,反复修改 c 语言程序,并进行 烧录。直到最后 led 点阵显示正确无误。 二、 实验心得与体会 关于奇美那个显示屏的色彩调节,得到的体会就是,第一是比较深 入地明白 LCD 液晶显示屏的显示原理,其次是,原本是以为显示屏出厂 就可以投入市场了,现在是知道至少还有色彩调节的这一环节,虽然只 是花了一个下午去调试一个显示屏,但是却也明白显示屏色彩调节的重 要性。对于没有调节过的显示屏,显示出来的图片,第一眼感觉上就很 突兀,要不就是对比度过高,要不就是颜色太过鲜艳,用观众的眼光来 看,就是颜色太假了。所以需要调节。而调节后的视频图像则明显使得 眼睛的舒适度提高了很多。 至于 led 点阵的显示控制的实验,最让我明白到的一点是,如果控 制显示的行列。对于弄过 lcd 图像显示,或是 vga 插口的来说,控制一 副图像的二维数据,无非是控制图像的 x,y 轴,即是二维的点阵控制, 其当是地址口都会有超过 16 位的输入,而且有 2 维的。而对于 led 这种 小器件显示而言,需要 x,y 轴去控制地址,则显得累赘。也就是说,如 何通过一根地址线就可以控制一个平面显示,则是个需要深入研究的问
题。首先是之前 pld 编程器给出了我们一个答案,而 led 的点阵显示则 是采用了同样的方法。首先需要一个行地址,而列地址不可控制。选通 每一行后,通过与列同等数目位数的移位寄存器来实现,输入时钟脉冲 来控制移位,然后通过控制该移位寄存器来进行列写入。这种方法相对 于二维地址控制来说简单多了,而且需要用到的资源也相对少很多,虽 然容差调错的功能会逊色一点。 另外一点就是控制器的应用。对于这个实验的电路,有个深入的体 会。那就是输入与控制的分工很明显。整个电路有两个 cpu,但是他们 的功能却没有重叠。首先是靠 52 单片机来产生输入信号,无论是控制使 能,还是控制数据所需要的输入信号都是由 52 单片机芯片来产生的。也 就是说,我们甚至可以不用去管 cpld 的芯片,只要控制好 52 芯片就可 以了,因为 52 产生的任何值,都是会有已经设计好得控制来产生输出。 那个控制器就是 cpld 的控制器。里面编程好得各种译码器,并转串控制 器以及各种门电路控制,他的任何输入口都是 52 单片机的输入口,他的 任何输出口都是外部电路。他不产生任何信号,如果没有 52 单片机的控 制。而一旦有信号来,他便能很快地产生输出,这对于电路来说是反应 相当快得。如果在控制器中嵌入输入,而在输入中嵌入控制器,则会最 终导致电路相当繁杂,而也最后会导致后期的修改或是程序的模块化改 进造成一定程度上的麻烦。 [附录 1 ] C 语言程序: #include #include sbit srclk=P1^3; sbit i_sel0=P1^0; sbit i_sel1=P1^1; sbit i_sel2=P1^4; sbit en_gray=P3^4; sbit tl=P3^5; sbit rclk=P3^7; sbit RCK1=P1^6; sbit RAM1=P1^7; sbit CTR=P1^5; sbit pl=P0^1; sbit ps=P0^0; void delay(); void jumpfunction();
void clks(); void delays(); int a[16][8]; char iu; void main() { RCK1=1; RAM1=1; CTR=1; rclk=0; tl=0; srclk=0; en_gray=0; while(1) { jumpfunction(); } } void jumpfunction() { char i,j; counts=0; en_gray=0; RCK1=1; RAM1=1; CTR=1; i_sel0=0; i_sel1=1; i_sel2=1; rclk=0; i_sel0=1; i_sel1=1; i_sel2=1; rclk=1; for (j=0;j<=15;j++) { for (i=0;i<=7;i++) { RAM1=0; i_sel0=1; i_sel1=0; i_sel2=1; P0=a[j][i]; i_sel0=1; i_sel1=1; i_sel2=0; P0=a[j][i]; clks(); } en_gray=1; tl=1;
tl=0; delay(); en_gray=0; } } void clks() { for (iu=0;iu<=7;iu++) { srclk=1; delays(); srclk=0; delays(); } } void delay() { int ms; for (ms=0;ms<=50;ms++); } void delays() { ;;;; } [附录 2 ] Cpld 原理图:
分享到:
收藏