完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近学习数码管显示的代码编写,出现了一个问题有些绕,望大家细细听我到来;
是这样的小弟有一块学习板,然后呢上面的数码管有八个,很普通的需要先进行位选然后才是段选, 然后我有个代码里面需要完成的是同时选中四个数码管然后在一个状态下让这四个数码管同时工作,但是他们又要显示不一样的数字出来, 想问问这个功能实现起来要如何做,能否简单的写一下: 比如现在我定义了一个reg [7:0] sig;reg[7:0] dig;其中sig信号是用来位选的也就是这儿需要选择前面四个数码管,低电位工作; 然后dig信号用于段选,这儿我们需要让前两个数码管显示0.5,后两个数码管显示1.0; 这儿我想强调一下,主要是显示这样的一个状态是在同一个状态或者说时刻下显示的,希望有大大能帮忙讲解一下,在此谢过啦~ |
|
相关推荐
8个回答
|
|
没大神帮助吗?
|
|
|
|
现在有八个数码管,我想让前两个数码管显示0.5,最后两个数码管显示3.0,而且是在同一个时候哦,而且这个是在很多状态下的一个状态这样显示,就是我外面写了一个状态机的,下一个状态又让前两个数码管显示1.0,最后两个数码管显示0.5,所以现在这个地方卡住了没有办法继续了,就想请问一下这个要如何编写代码实现
|
|
|
|
代码根据动态显示的方式写了一下,麻烦给看一下,谢谢啦~
module sell(reset,clk,seg,dig); input reset,clk; output[7:0] seg; output[7:0] dig; reg[2:0] D; //状态 reg temp1,temp2; //引入临时变量主要是为了强调下降沿判断为激励有效信号,是其安全可靠 reg[7:0] seg_r; //定义数码管输出寄存器 reg[7:0] dig_r; //定义数码管选择输出寄存器 reg[3:0] disp_dat; //定义数码管显示数据寄存器 reg[1:0] count; //定义计数寄存器 parameter idle=0,half=1,one=2,two=3,three=4; // idle,one,half,two,three为中间状态变量 assign dig = dig_r; //输出数码管选择 assign seg = seg_r; //输出数码管译码结果 always@(posedge clk) //数码管动态扫描显示计数 begin count <= count+1'b1; end always@(posedge clk or negedge reset) begin if(!reset) //下降沿复位信号有效 begin D <= idle; temp1 <= 0; temp2 <= 0; case(count) //使八个数码管首位四个数码管显示0.0 0.0 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h0; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h0; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase end case(D) idle: if(temp1) begin case(count) //使八个数码管首位四个数码管显示0.5 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h0; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= half; end else if(temp2) begin case(count) //使八个数码管首位四个数码管显示1.0 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= one; end half: if(temp1) begin case(count) //使八个数码管首位四个数码管显示1.0 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= one; end else if(temp2) begin case(count) //使八个数码管首位四个数码管显示1.5 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= two; end one: if(temp1) begin case(count) //使八个数码管首位四个数码管显示1.5 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h1; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= two; end else if(temp2) begin case(count) //使八个数码管首位四个数码管显示2.0 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= three; end two: if(temp1) begin case(count) //使八个数码管首位四个数码管显示2.0 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= three; end else if(temp2) begin case(count) //使八个数码管首位四个数码管显示2.5 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= idle; end three: if(temp1) begin D <= idle; case(count) //使八个数码管首位四个数码管显示2.5 00 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h2; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h5; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h9; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase end else if({temp2,one_dollar}==2'b10) begin case(count) //使八个数码管首位四个数码管显示3.0 0.5 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h3; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h0; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h5; end endcase D <= idle; end default: begin case(count) //使八个数码管首位四个数码管显示0.0 0.0 2'b00 : begin dig_r <= 8'b0111_1111; disp_dat <= 8'h0; end 2'b01 : begin dig_r <= 8'b1011_1111; disp_dat <= 8'h9; end 2'b10 : begin dig_r <= 8'b1111_1101; disp_dat <= 8'h0; end 2'b11 : begin dig_r <= 8'b1111_1110; disp_dat <= 8'h9; end endcase D <= idle; end endcase end always@(disp_dat) begin case(disp_dat) //八段译码 4'h0: seg_r = 8'h40; //显示0. 4'h1: seg_r = 8'h79; //显示1. 4'h2: seg_r = 8'h24; //显示2. 4'h3: seg_r = 8'h30; //显示3. 4'h4: seg_r = 8'h12; //显示5. 4'h5: seg_r = 8'h92; //显示5 4'h6: seg_r = 8'hb0; //显示3 4'h7: seg_r = 8'ha4; //显示2 4'h8: seg_r = 8'hf9; //显示1 4'h9: seg_r = 8'hc0; //显示0 default: seg_r = 8'hff; //不做显示 endcase end endmodule |
|
|
|
|
|
居然还是没人懂?不要啊~~~~给位大虾花点儿时间给个提示啊~~~~
|
|
|
|
还是没人给个回应?
|
|
|
|
首先,你要多花点时间搞懂什么是数码管的动态显示和静态显示。而你需要的是动态显示。给你打个比方,台下有八个评委,从左到右依次举牌,依次举得是ABCDEFGH,但是,你一次只看到了一个评委举牌,因为那是他们举牌的时间间隔大。如果让每个评委依次以20ms的间隔举牌,你的眼睛就会反映不过来,看到的就是全部都在举牌。。。懂了吧
而你要显示的内容就事先“分发”给各个评委,等你下达指令再举牌,这下清楚了吧。。。 回帖第一次打这么多字、 |
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
618 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
929 浏览 0 评论
858 浏览 0 评论
1807 浏览 0 评论
468 浏览 0 评论
1260 浏览 26 评论
5461 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 12:24 , Processed in 0.813497 second(s), Total 85, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号