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