数码管led显示器控制电路.ppt
专题二.经典模块设计,LED数码管显示控制 电路设计,数码管显示原理,数码管的组成:LED数码管是由发光二极管构成的,常用的有8段。,数码管的分类:有共阴和共阳极两种。多个LED的阴极连在一起的为共阴极数码管,阳极连在一起的为共阳极数码管。共阴极数码管的公共端接地,阳极(a到h)接高电平,数码管点亮。共阳极数码管的公共端接电源,阴极(a到h)接低,数码管点亮。,数码管的段码和位码,数码管的位码就是提供给公共端的电平。位码的作用是控制数码管的亮灭。数码管的段码就是提供给a,b,c,d,e,f,g,h的电平。段码的作用是控制数码管显示什么字符。单个数码管需要9个端口来控制。,举例:位码和段码,例1:显示字符“1”。(共阴极数码管)位码应该接低电平。段码按照hgfedcba的顺序,应该为“00000110”。,例2:显示字符“A”。(共阳极数码管)位码应该接高电平。段码按照hgfedcba的顺序,应该为“10001000”。,LED数码管显示控制电路,静态显示方式动态显示方式,(1)LED静态显示控制电路,静态显示方式将每一个数码管的段码端ah连接到CPLD/FPGA的IO端口上,公共端接地(对于共阴极LED)。每个数码管需要8个IO口线,N个数码管共需要N8条IO口线。当CPLD/FPGA有相当多的IO端口资源,并且显示的位数较少时(通常为12位),可以直接使用静态显示的方式。,数码管静态显示方式的优点是连线简单,软件编程简单。缺点是需要耗费大量的IO端口资源。,8N,静态显示的方式,CPLD/FPGA驱动LED静态显示译码程序,Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Use ieee.std_logic_arith.all;Entity display is-共阴极数码管段码译码 port(data:IN std_logic_vector(3 downto 0);seg:OUT std_logic_vector(6 downto 0)-gfedcba);End display;,architecture a of display isbegin process(data)begin case data is-gfedcba when 0000=seg seg seg seg seg seg seg seg seg seg seg seg seg seg seg seg seg=0000000;-全灭 end case;end process;end a;,仿真结果,将要显示的数据译成段码在数码管上显示出来。,静态显示应用举例:,设计一个4路独立键盘输入电路,读取键盘的键值,并将键值在一位静态共阴极LED数码管中显示出来。输入为时钟信号CLK(50MHz),按键状态KEY1,KEY2,KEY3,KEY4。输出为LED数码管的段码SEG6.0。,电路模块,输入信号:clk:时钟,50MHz;reset:复位信号;key1,key2,key3,key4:按键信号输入;输出信号:SEG6.0:静态LED数码管的段码信号。,分频模块,去抖动模块,键盘扫描译码模块,50MHz,键盘扫描译码模块程序(1),-输出1的段码,-输出2的段码,-输出3的段码,-输出4的段码,-数码管灯灭,键盘扫描译码模块程序(2),keyscan程序:,library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity keyscan is port(clk10hz:IN std_logic;key1,key2,key3,key4:IN std_logic;keyvalue:OUT integer range 0 to 4);end keyscan;,architecture a of keyscan isbegin process(clk10hz)-100ms begin if(clk10hzevent and clk10hz=1)then if(key1=0)then keyvalue=1;-输出键值1 elsif(key2=0)then keyvalue=2;-输出键值2 elsif(key3=0)then keyvalue=3;-输出键值3 elsif(key4=0)then keyvalue=4;-输出键值4 else keyvalue=0;-输出键值0 end if;end if;end process;end a;,display程序:,Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Use ieee.std_logic_arith.all;Entity display is port(data:IN integer range 0 to 4;seg:OUT std_logic_vector(6 downto 0)-gfedcba);End display;architecture a of display isbegin process(data)begin case data is-gfedcba when 1=seg seg seg seg seg=0000000;-全灭 end case;end process;end a;,(2)LED动态显示控制电路,在显示的数据较多时,会用到多个数码管,如果用静态显示方式会占用很多IO(8N),这时可以采用动态扫描方式来实现。动态扫描方式的硬件连接是:将每个数码管的段码引脚并联接到CPLD/FPGA的IO端口上,每个数码管的公共端是独立的,通过控制公共端来控制相应数码管的亮、灭。,N个LED数码管以动态方式显示时,需要8+N个IO口线。其中8个IO口线用作输出段码,N个IO口线输出位码。,段码共用,位码独立,动态显示方式,实现方法是依次点亮各个LED数码管,轮流向各个数码管送出段码和位码,循环进行显示。一个数码管显示之后下一个数码管马上显示,利用人眼的视觉暂留特性,得到多个数码管同时显示的效果。采用数码管的动态显示方式,数码管的扫描频率的快慢控制相当重要。扫描频率太慢,会产生数码管逐个显示的效果。扫描频率太快也不好,会造成数码管的亮度不够,因为数码管需要一定的时间才能达到一定的亮度。通常扫描频率为1KHz(即数码管显示1ms)可以达到满意的效果。,动态显示电路框图,SCAN7.0,SEG6.0,如上图所示,为LED动态显示顶层原理图。由fdiv分频模块,cnt计数模块和dispdec显示译码模块三个模块组成。输入为:sysclk:50MHz系统时钟。d0d7:8个显示数据,分别显示在8个数码管上。输出为:SEG【6.0】:7位段码输出。SCAN【7.0】:8位位码输出,每一位分别控制一个数码管的点亮。,50MHz,1KHz,CPLD/FPGA驱动LED动态显示程序,显示译码模块dispdecLibrary ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Use ieee.std_logic_arith.all;entity dispdec is port(qcnt:IN integer range 0 to 7;-计数值输入 d0,d1,d2,d3,d4,d5,d6,d7:IN std_logic_vector(3 downto 0);-显示数据 seg:OUT std_logic_vector(6 downto 0);-7位段码输出 scan:OUT std_logic_vector(7 downto 0)-8位位码输出);end dispdec;,architecture a of dispdec is signal data:std_logic_vector(3 downto 0);begin process(qcnt,d0,d1,d2,d3,d4,d5,d6,d7)begin case qcnt is-根据计数值,输出相应的位码,并设置要显示的数据 when 0=scan scan scan scan scan scan scan scan scan=11111111;data=d0;end case;end process;,process(data)-对显示数据译码 begin case data is when 0000=seg seg seg seg seg seg seg seg seg seg seg seg seg seg seg seg seg=0000000;end case;end process;end a;,仿真结果,以1KHz频率动态扫描显示,依次输出8个数码管的段码和位码。,1,2,3,4,5,6,LED动态显示分位译码电路,设计要求:采用动态显示方式,将一个两位数用两个数码管显示出来。一个数码管显示个位,另一个显示十位。,顶层原理图,如上图所示,为LED分位译码显示顶层原理图。由fdiv分频模块,cnt计数模块,fenwei分位模块和dispdec显示译码模块四个模块组成。输入为:sysclk:50MHz系统时钟。num6.0:一个要显示的两位数,099。输出为:SEG【6.0】:7位段码输出。SCAN【7.0】:8位位码输出,每一位分别控制一个数码管的点亮。,50MHz,1KHz,分位模块,LED动态显示分位译码电路程序,1.fenwei分位模块Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Use ieee.std_logic_arith.all;entity fenwei is port(num:IN integer range 0 to 99;numshi:OUT integer range 0 to 9;numge:OUT integer range 0 to 9);end fenwei;architecture a of fenwei isbegin numge=num MOD 10;numshi=num/10;end a;,2.显示译码模块dispdecLibrary ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Use ieee.std_logic_arith.all;entity dispdec is port(qcnt:IN integer range 0 to 1;-计数值输入 d0,d1:IN integer range 0 to 9;-分位得到的十位数和个位数 seg:OUT std_logic_vector(6 downto 0);-7位段码输出 scan:OUT std_logic_vector(7 downto 0)-8为位码输出);end dispdec;architecture a of dispdec is signal data:integer range 0 to 9;begin process(qcnt,d0,d1)begin case qcnt is when 0=scan scan scan=11111111;data=d0;end case;end process;,process(data)begin case data is when 0=seg seg seg seg seg seg seg seg seg seg seg=0000000;end case;end process;end a;,仿真结果,以动态显示的方式,在数码管上分位显示两位数。,1,2,5,6,