8个7segment循环显示hello,给个思路,谢谢。
我的方法:1.先做一个8进制的计数器。
2.每个7segment对应一个译码包(因为同样的8进制计数器的输出对应不同的译码)。
3.8个segment就要8个译码包。
貌似方法笨了些。 楼主所指译码包是?三线-八线译码器?
我也有个笨办法,
如果用动态扫描的办法的话那就把8个数码管的7个段并联,每个数码管的公共脚接出, 这样就类似抽象成一个8行7列的点阵, 扫描即可, 想实现什么效果在软件里都成
优点:硬件成本相对较低
缺点:单片机需要不断刷新显示,需要根据数码管接线取模
如果静态的话倒不如用8个595, 每个595带一个数码管,小数点也有了,8个数码管公共脚接一起,串入并出还带锁存,这样单片机只需3个脚即可,
优点:节省单片机资源, 只需在更新画面的时候操作, 其它时候单片机什么都不用干
缺点:硬件成本高 回复【1楼】wowbanui
-----------------------------------------------------------------------
谢谢,我这儿板子上的数码管使能端固定了,不能动态扫描显示。要求就是在8个数码管上按从右到左的顺序循环显示hello。我的笨代码如下:
//top-level file
module hello(HEX7,HEX6,HEX5,HEX4,
HEX3,HEX2,HEX1,HEX0,
CLOCK_50,KEY);
input CLOCK_50;
input KEY;
output HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,
HEX1,HEX0;
wire clk_1hz;
reg cnt;
div u0(.o_clk(clk_1hz),
.rst_n(KEY),
.i_clk(CLOCK_50)
);
always @(posedge clk_1hz or negedge KEY)
begin
if(!KEY)
cnt<=4'b0;
else
begin
if(cnt==4'b0111)
cnt<=4'b0;
else
cnt<=cnt+1'b1;
end
end
seg7_h0 h0(.oseg(HEX0),
.idig(cnt)
);
seg7_h1 h1(.oseg(HEX1),
.idig(cnt)
);
seg7_h2 h2(.oseg(HEX2),
.idig(cnt)
);
seg7_h3 h3(.oseg(HEX3),
.idig(cnt)
);
seg7_h4 h4(.oseg(HEX4),
.idig(cnt)
);
seg7_h5 h5(.oseg(HEX5),
.idig(cnt)
);
seg7_h6 h6(.oseg(HEX6),
.idig(cnt)
);
seg7_h7 h7(.oseg(HEX7),
.idig(cnt)
);
endmodule
//divider
module div(
output reg o_clk,
input rst_n,
input i_clk
);
parameter N=50_000_000;
parameter M=24_999_999;
reg cnt;
always @(posedge i_clk or negedge rst_n)
begin
if(!rst_n)
cnt<=26'b0;
else
begin
if(cnt==N-1)
cnt<=26'b0;
else
cnt<=cnt+26'b1;
end
end
always @(posedge i_clk or negedge rst_n)
begin
if(!rst_n)
o_clk<=0;
else
begin
if(cnt<=M)
o_clk<=1;
else
o_clk<=0;
end
end
endmodule
//seg7_lut
module seg7_h0
(
output reg oseg,
input idig
);
always @ (idig)
begin
case (idig)
4'h0: oseg = 7'b1000000; //O
//4'h1: oseg = 7'b1111001;
//4'h2: oseg = 7'b0100100;
//4'h3: oseg = 7'b0110000;
4'h4: oseg = 7'b0001001;//H
4'h5: oseg = 7'b0000110;//E
4'h6: oseg = 7'b1000111;//L
4'h7: oseg = 7'b1000111;//L
default: oseg = 7'b1111111;
endcase
end
endmodule
。。。。。。
//seg7_lut
module seg7_h7
(
output reg oseg,
input idig
);
always @ (idig)
begin
case (idig)
4'h7: oseg = 7'b1000000; //O
//4'h1: oseg = 7'b1111001;
//4'h2: oseg = 7'b0100100;
//4'h3: oseg = 7'b0110000;
4'h3: oseg = 7'b0001001;//H
4'h4: oseg = 7'b0000110;//E
4'h5: oseg = 7'b1000111;//L
4'h6: oseg = 7'b1000111;//L
default: oseg = 7'b1111111;
endcase
end
endmodule 在每个左移脉冲的时候 给当前位的字型码加一就可以了!
比如 字型码顺序0-H 1-E 2-L 3-L 4-O
假如当前是H 下一次显示就是E
当前是E 下一次显示就是L
当前是L 下一次显示就是L
当前是L 下一次显示就是O
当前是O 下一次显示就是H
这样一次循环就可以了 不要考虑左右移的问题,只要每个位的字型码都这样处理 就自动左移 如果向右移则反向处理送出字型码 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITYLED IS
PORT(
clk : IN STD_LOGIC;
leddrv :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
segint: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
segset :OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
ENDLED;
ARCHITECTURE maxii_lamp2 OF LED IS
SIGNAL reg : STD_LOGIC_VECTOR(3 DOWNTO 0) :="0000";
signal clkd:STD_LOGIC;
signal clkv:STD_LOGIC;
signal oseg: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL seg1 : STD_LOGIC_VECTOR(2 DOWNTO 0) :="000";
signal segv :STD_LOGIC_VECTOR(2 DOWNTO 0):="000";
BEGIN
leddrv <= reg;
segint <= oseg;
PROCESS(clk)
VARIABLE cnt : INTEGER RANGE 0 TO 2400000 :=0;
BEGIN
IF clk'EVENT AND clk='1' THEN
cnt := cnt+1;
IF cnt= 2400000 THEN
cnt := 0;
clkd<=not clkd; --------左移时钟
reg <= reg+"0001"; -----led显示
END IF;
END IF;
END PROCESS;
-------------------------------------
PROCESS(clk)
VARIABLE cnt1 : INTEGER RANGE 0 TO 24000 :=0;
BEGIN
IF clk'EVENT AND clk='1' THEN
cnt1 := cnt1+1;
IF cnt1= 24000 THEN
cnt1 := 0;
clkv<=not clkv;-----动态扫描时钟
END IF;
END IF;
END PROCESS;
-------------------------------------
PROCESS(clkv)
BEGIN
IF clkv'EVENT AND clkv='1' THEN
segv<=segv+"001";
if segv="011" then
segv<="000";
END IF;
END IF;
END PROCESS;
----------------------------------------
process(clk,clkd)
begin
IF clkd'EVENT AND clkd='1' THEN
seg1<=seg1+"001";
if seg1="100"then
seg1<="000";
end if;
end if;
end process;
---------------------------------------
process(clkv,clk)
begin
IF clk'EVENT AND clk='1' THEN
if segv="000"then
segset<="1110";
case seg1 is
when"100"=>oseg <="11000000";--o
when"000"=>oseg <="10001001";--h
when"001"=>oseg <="10000110";--e
when"010"=>oseg <="11000111";--l
when"011"=>oseg <="11000111";--l
when others=> oseg <="11111111";--8
end case;
end if;
---------------------------------------------------
if segv="001"then
segset<="1101";
case seg1 is
when"100"=>oseg <="10001001";--h
when"000"=>oseg <="10000110";--e
when"001"=>oseg <="11000111";--l
when"010"=>oseg <="11000111";--l
when"011"=>oseg <="11000000";--o
when others=> oseg <="11111111";--8
end case;
end if;
----------------------------------------------------
if segv="010"then
segset<="1011";
case seg1 is
when"011"=>oseg <="10001001";--h
when"100"=>oseg <="10000110";--e
when"000"=>oseg <="11000111";--l
when"001"=>oseg <="11000111";--l
when"010"=>oseg <="11000000";--o
when others=> oseg <="11111111";--8
end case;
end if;
---------------------------------------------------------
if segv="011"then
segset<="0111";
case seg1 is
when"010"=>oseg <="10001001";--h
when"011"=>oseg <="10000110";--e
when"100"=>oseg <="11000111";--l
when"000"=>oseg <="11000111";--l
when"001"=>oseg <="11000000";--o
when others=> oseg <="11111111";--8
end case;
end if ;
end if;
---------------------------------------------------------
end process;
END maxii_lamp2;
说明 :我的板子上只有4个数码管 所以只能写四位了!附带4个led自加流动0000--》1111 HELLO滚动视频ourdev_559502.rar(文件大小:1.89M) (原文件名:100_3680.rar) 回复【5楼】281229961小朱
-----------------------------------------------------------------------
tks 小朱指导。
页:
[1]