
LED点阵汉字显示.doc
34页EDA技术课程设计报告题目: LED点阵汉字显示 姓 名 学 号 班 级 指导教师 2012年 1 月 12 日要求:1.指导教师按照课程设计大纲要求完成学生课程设计指导工作2.课程设计任务书由指导教师照大纲要求填写,内容要全面3.课程设计报告由参加本学生填写课程设计结束时交指导教师4.指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩5.课程设计任务书和报告要语言流畅,图表正确规范课程设计任务书课程设计内容与要求 要求:1 及格:在实验箱上16*16点阵模块上显示汉字“电”; 2 中:设置不同的清屏方式; 3 良:滚动显示汉字“电”; 4 优:滚动显示“电子信息工程”; 2011 年12月26日一、设计原理与技术方法:1.电路工作原理分析与原理图1.1.LED点阵屏原理实验室用的是一个16*16的点阵,是用四个8*8点阵组合而成,点阵内部结构及外形如图1,点阵共由256个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮。
图1 内部连接后效果图 图2 内部连接图 图3 实物图 如要将第一个点点亮,则行的1脚接高电平,列的1脚接低电平,则第一个点就亮了;如果要将第一行点亮,则行的1脚要接高电平,而16列引脚全接低电平,那么第一行就会点亮;如要将第一列点亮,则列的1脚接低电平,行全接高电平,那么第一列就会点亮.实验箱的接法是:通过一个四十六译码电路(译码器)选中列,再给行赋值十六个位数据,所以如要将第一列点亮,只需译码电路的输入是“0000”选中第一列,送数据“0000000000000000”,通过对软件设置,取阴码后,送数据“1111111111111111”效果一样软件的使用在下面说明)1.2.点阵LED扫描法介绍:点阵LED一般采用扫描式显示,实际运用分为三种方式: (1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
1.3 汉字的显示一般我们使用点阵显示汉字是用的16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的如图四所示,要显示“电”则相应的点就要点亮, 所以要显示“电”字的话, 第一时刻选中第一列, 列送数据“0000000000000000” x"0000"(十六进制表示)第二时刻选中第一列, 列送数据“0000000000000000” x"0000"第三时刻选中第一列, 列送数据“00001111111111000” x"0FF8";第四时刻选中第一列, 列送数据“0000010001001000” x"0448"第五时刻选中第一列, 列送数据“0000010001001000” x"0448"第六时刻选中第一列, 列送数据“0000010001001000” x"0448"第七时刻选中第一列, 列送数据“0000010001001000” x"0448"第八时刻选中第一列, 列送数据“00111111111111111” x"3FFF"第九时刻选中第一列, 列送数据“0100010001001000” x"4448"第十时刻选中第一列, 列送数据“0100010001001000” x"4448"第十一时刻选中第一列,列送数据“0100010001001000” x"4448"第十二时刻选中第一列,列送数据“0100010001001000” x"4448"第十三时刻选中第一列,列送数据“01001111111111000” x"4FF8"第十四时刻选中第一列,列送数据“0100000000000000” x"4000"第十五时刻选中第一列,列送数据“0111000000000000” x"7000"第十六时刻选中第一列,列送数据“0000000000000000” x"0000"单独显示:当送数据的频率够大时(每秒大于二十四次),肉眼看到的效果就是一个静态显示的“电”字;左右清屏:在第一个16个时钟送电的十六列代码,下一个16个时钟送电的后十五列代码,在下一个16个时钟送电的后14列代码,第十五个16个时钟只送电的最后一列代码,就是电的左清屏显示。
上下清屏:在第一个16个时钟送电的十六列代码,下一个16个时钟送抹掉第一行的电的后十六列代码,在下一个16个时钟送抹掉前两行的电的十六列代码,第十五个16个时钟只送抹掉前十五行的电的十六列代码,就是电的上清屏显示左右滚动:下一个十六个时钟,每列数据前移一次,后一列补零……即是滚动显示滚动六个字:同单个字的滚动显示,只不过是每列数据前移一次,后一列补下一个字的第一列,以此类推,即是六个字的滚动显示推荐一款汉字取模的软件:图4 取模软件界面图1.4.程序源代码(1)电单独显示编程思路:每一个时钟沿,列计数器加一,选中下一列,通过CASE语句,送入相应的列数据library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dian isport(clk0,clr:in std_logic; sel:out std_logic_vector(3 downto 0); --列选信号 line:out std_logic_vector(15 downto 0)); -- 行选信号end dian;architecture rtl of dian issignal q: std_logic_vector(3 downto 0); --内部计数器(16进制) beginp1:process(clk0,clr) beginif(clr='1')then q<="0000";elsif(clk0'event and clk0='1') thenif(q>"1111")then q<="0000";else q<=q+'1'; --计数器加一end if;end if;end process p1;p2:process(q)begincase q is --CASE语句显示电字when "0000"=>line<="0000000100000000";when "0001"=>line<="0000000100000000";when "0010"=>line<="0000000100000000";when "0011"=>line<="0011111111111000";when "0100"=>line<="0010000100001000";when "0101"=>line<="0010000100001000";when "0110"=>line<="0011111111111000";when "0111"=>line<="0010000100001000";when "1000"=>line<="0010000100001000";when "1001"=>line<="0010000100001000";when "1010"=>line<="0011111111111000";when "1011"=>line<="0010000100001000";when "1100"=>line<="0000000100000010";when "1101"=>line<="0000000100000010";when "1110"=>line<="0000000011111110";when "1111"=>line<="0000000000000000";when others=>null;end case;end process p2;sel<=q;end rtl;(2)电左右清屏编程思路:每一个时钟沿,列计数器加一,选中下一列,列计数器加16次时,状态计数器加一,切换到下一个状态,当状态值大于列值时,不送数据(或送零),小于等于时,正常送数据,达到右清屏的效果2-1左清屏:library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity zuoqing is port( clk:in std_logic; sel:out std_logic_vector(3 downto 0); line:out std_logic_vector(15 downto 0) );end zuoqing;architecture behavior of zuoqing issignal counter:integer range 0 to 15; signal q:std_logic_vector(3 downto 0); beginprocess(clk,q) begin if(clk'event and clk='1') then if q="1111" then q<="0000"; if counter=15 then counter<=0; else counter<=counter+1; end if; else q<=q+1; end if; case q is when"0000"=> if counter>=0 then line<="0000000000000000"; else line<= "0000000100000000"; end if; when"0001"=> if counter>=1 then line<="0000000000000000"; -- 判断状态值是否大于列值 else line<="000000010000。












