数码管led显示器控制电路
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态显示电路框图
sysclk 分频器
50Mhz
clk1khz 计数器
1khz
qcnt[2..0] 位码数据设置 SCAN[7..0]
段码数据设置
SEG[6..0]
50MHz
Parameter Value Type N 50000 Signed Integer
1KHz
f div
cnt clkin clkout clk qcnt[2..0]
dispdec qcnt[2..0] d0[3..0] d1[3..0] seg[6..0] scan[7..0]
OUTPUT
OUTPUT
sy sclk
INPUT VCC
SEG[6..0] SCAN[7..0]
inst
inst1
d2[3..0] d3[3..0] d4[3..0] d5[3..0] d6[3..0] d7[3..0] inst13
分频模块
inst
inst13
ctrl debounce clk10hz clk dout key 1 key 2 key 3 key 4 seg[6..0]
OUTPUT
SEG[6..0]
reset
key 1
INPUT VCC INPUT VCC
reset din inst2
key 2
INPUT VCC
architecture a of keyscan is begin process(clk10hz) --100ms begin if(clk10hz'event 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;
ctrl clk10hz key 1 key 2 key 3 key 4 inst seg[6..0]
--输出’1’的段 码 --输出’2’的段 码 --输出’3’的段 码 --输出’4’的段 码 --数码管灯灭
键盘扫描译码模块程序(2)
ctrl clk10hz key 1 key 2 key 3 key 4 inst seg[6..0]
(2)LED动态显示控制电路
在显示的数据较多时,会用到多个数码管,如果 用静态显示方式会占用很多IO(8×N),这时可 以采用动态扫描方式来实现。 动态扫描方式的硬件连接是: 将每个数码管的段码引脚并联接到CPLD/FPGA 的IO端口上,每个数码管的公共端是独立的,通 过控制公共端来控制相应数码管的亮、灭。
d0[3..0] d1[3..0]
d2[3..0]
d3[3..0] d4[3..0] d5[3..0] d6[3..0] d7[3..0]
如上图所示,为LED动态显示顶层原理图。由fdiv分频模块,cnt计数模块和dispdec显 示译码模块三个模块组成。 输入为: sysclk:50MHz系统时钟。 d0~d7:8个显示数据,分别显示在8个数码管上。 display 输出为: sysclk SEG【6..0】:7位段码输出。 d0[3..0] d1[3..0] SCAN【7..0】:8位位码输出,每一位分别控制一个数码管的点亮。
architecture a of display is begin process(data) begin case data is --gfedcba when "0000" => seg <= "0111111"; --0 when "0001" => seg <= "0000110"; --1 when "0010" => seg <= "1011011"; --2 when "0011" => seg <= "1001111"; --3 when "0100" => seg <= "1100110"; --4 when "0101" => seg <= "1101101"; --5 when "0110" => seg <= "1111101"; --6 when "0111" => seg <= "0000111"; --7 when "1000" => seg <= "1111111"; --8 when "1001" => seg <= "1100111"; --9 when "1010" => seg <= "1110111"; --A when "1011" => seg <= "1111100"; --b when "1100" => seg <= "0111001"; --c when "1101" => seg <= "1011110"; --d when "1110" => seg <= "1111001"; --E when "1111" => seg <= "1110001"; --F when others => seg <= "0000000"; --全灭 end case; end process; end a;
专题二. 经典模块设计
——LED数码管显示控制 电路设计
数码管显示原理
数码管的组成:LED数码管是 由发光二极管构成的,常用的 有8段。 数码管的分类:有共阴和共阳 极两种。多个LED的阴极连在 一起的为共阴极数码管,阳极 连在一起的为共阳极数码管。 共阴极数码管的公共端接地, 阳极(a到h)接高电平,数码 管点亮。 共阳极数码管的公共端接电源, 阴极(a到h)接低,数码管点 亮。
段码共用,位码独立
N个LED数码管以动态方式显示时,需要 8+N个IO口线。其中8个IO口线用作输出段 码,N个IO口线输出位码。
动态显示方式
G1
G2
G3
G4
G5
G6
G7
G8
ab...h
实现方法是依次点亮各个LED数码管,轮流向各个数码管送出段码 和位码,循环进行显示。一个数码管显示之后下一个数码管马上显 示,利用人眼的视觉暂留特性,得到多个数码管同时显示的效果。 采用数码管的动态显示方式,数码管的扫描频率的快慢控制相当重 要。扫描频率太慢,会产生数码管逐个显示的效果。扫描频率太快 也不好,会造成数码管的亮度不够,因为数码管需要一定的时间才 能达到一定的亮度。通常扫描频率为1KHz(即数码管显示1ms)可 以达到满意的效果。
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 is begin process(data) begin case data is --gfedcba when 1 => seg <= "0000110"; --1 when 2 => seg <= "1011011"; --2 when 3 => seg <= "1001111"; --3 when 4 => seg <= "1100110"; --4 when others => seg <= "0000000"; --全灭 end case; end process; end a;
去 抖 动 模 块
debounce clk reset din inst3 dout
ห้องสมุดไป่ตู้
键盘扫描 译码模块
inst6
debounce clk reset dout
key 3
INPUT VCC
din inst4
debounce clk reset dout
key 4
INPUT VCC
din
键盘扫描译码模块程序(1)
数码管的段码和位码
数码管的位码就是提供给公共端的电平。位码的 作用是控制数码管的亮灭。 数码管的段码就是提供给a,b,c,d,e,f,g,h的电平。 段码的作用是控制数码管显示什么字符。 单个数码管需要9个端口来控制。
段码
位码
举例:位码和段码
例1:显示字符“1”。(共阴极数码管) 位码应该接低电平。 段码按照hgfedcba的顺序, 应该为“00000110”。
电路模块
输入信号: clk:时钟,50MHz;
ledapp clk reset key1 key2 key3 key4
inst
reset:复位信号;
SEG[6..0]
key1, key2, key3, key4:按键信号 输入;
输出信号:
SEG[6..0]:静态LED数码管的段 码信号。
CPLD/FPGA
8×N
……
数码管静态显示方式的优点是连线简单, 软件编程简单。 缺点是需要耗费大量的IO端口资源。
静态显示 的方式
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;
例2:显示字符“A”。(共阳极数码管) 位码应该接高电平。 段码按照hgfedcba的顺序, 应该为“10001000”。
LED数码管显示控制电路
静态显示方式 动态显示方式
(1)LED静态显示控制电路
静态显示方式将每一个数码管的段码端a~h 连接到CPLD/FPGA的IO端口上,公共端接 地(对于共阴极LED)。每个数码管需要8 个IO口线,N个数码管共需要N×8条IO口 线。 当CPLD/FPGA有相当多的IO端口资源,并 且显示的位数较少时(通常为1~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;
50MHz
clk
INPUT VCC
Param eter Value Type n 250000 Signed Integer
f div 200hz clkin clkout
Param eter Value Type n 5000000 Signed Integer
f div 10hz clkin clkout
仿真结果
将要显示的数据译成段码在数码管上显示 出来。
静态显示应用举例:
设计一个4路独立键盘输入电路,读取键盘 的键值,并将键值在一位静态共阴极LED数 码管中显示出来。 输入为时钟信号CLK(50MHz),按键状 态KEY1,KEY2,KEY3,KEY4。 输出为LED数码管的段码SEG[6..0]。