完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 CaelumINshell 于 2017-5-2 18:35 编辑 是这样的,我写的数字时钟显示模块里面,always块里面的触发沿频率为800Hz,可是在动态显示的时候却出现了显示字迹一直闪烁并且显示逐渐不清晰的情况,具体如下图,纠结了很久却找不到原因,自己之前试着修改显示模块扫描的频率,但是武乱是增加还是减小,显示效果总是达不到理想的显示而不闪烁的情况,这到底是怎么回事呢?是因为我没有设置延时或者是扫描频率太小导致的吗?请各位大神帮我解答,我的扫描频率是800HZ,时钟为1Hz,百分秒为100Hz. |
|
相关推荐
3个回答
|
|
回帖奖励 +1 分积分
是不是调节延时时间呢
|
|
|
|
我也在想这个问题,但是由于我有显示百分秒(ms)的数据,所以不知道延时多少合适,也不知道在那个位置进行延时,,求大神解答啊,我贴上我的程序。 |
|
|
|
//lcd显示模块
module lcd_ip(clk,rst,data_buf,lcd_e,lcd_rw,lcd_rs,lcd_data); input clk; input rst; input [255:0]data_buf; //数据接口 output lcd_e; output lcd_rw; output lcd_rs; output [7:0]lcd_data; //--------------------------------------------------------------- //分频得到clk_800Hz reg [16:0]cnt; reg clk_lcd; always @(posedge clk or negedge rst) if(!rst) cnt <= 1'b0; else begin cnt <= cnt + 1'b1; if( cnt == 17'd31249) begin cnt <= 1'b0; clk_lcd <= ~clk_lcd; end end //--------------------------------------------------------------- reg [2:0]func; //状态机func reg [3:0]com_cnt; //com_buf_bit的计数模块 reg [5:0]data_cnt; //data_buf_bit计数模块 reg [47:0]com_buf_bit; //6条lcd屏幕指令 每条8bit,6条就需要 6x8=48bit reg [255:0]data_buf_bit;//lcd 每行16个字符,一共两行,总共32个字符,一个字符需要8bit显示,所以32x8=256bit 参考LCD1602液晶显示控制部分 parameter set0=4'd1,set1=4'd2,dat1=4'd3,set2=4'd4,dat2=4'd5,done=4'd6; parameter com_buf={ 8'h02, 8'h06, 8'h0C, 8'h38, 8'h80, 8'h00, };//LCD1602指令,对屏幕初始化 //--------------------------------------------------------------- reg [7:0]lcd_data; reg lcd_rs; reg en; reg [255:0]data; //因为封装成ip核所以采用一个寄存器把data_buf值存起来,用于对比 always @(posedge clk_lcd or negedge rst) begin if(!rst) com_buf_bit <= 8'h01; //清屏指令 else begin en <= 0; //写指令 case(func) //液晶屏初始化 set0: begin com_buf_bit <= com_buf; data_buf_bit <= data_buf; data <= data_buf; //data_buf存到寄存器data里面 com_cnt <= 1'b0; data_cnt <= 1'b0; func <= set1; end //--------------------------------------------------------------- set1: begin lcd_rs <= 0; //写指令 lcd_data <= com_buf_bit[47:40]; com_buf_bit <= (com_buf_bit<<8); com_cnt <= com_cnt + 1'b1; if(com_cnt <= 5) //共6次,6条lcd指令 func <= set1; else begin func <= dat1; com_cnt <= 1'b0; end end //--------------------------------------------------------------- dat1: begin lcd_rs <= 1; //写数据 lcd_data <= data_buf_bit[255:248]; data_buf_bit <= (data_buf_bit<<8); data_cnt <= data_cnt + 1'b1; if(data_cnt < 15) //共16次 液晶屏第一行显示的内容 func <= dat1; else func <= set2; end //--------------------------------------------------------------- set2: begin lcd_rs <= 0; //写指令 lcd_data <= 8'hC0; //表示第二行第一位 func <= dat2; end //--------------------------------------------------------------- dat2: begin lcd_rs <= 1; //写数据 lcd_data <= data_buf_bit[255:248]; data_buf_bit <= (data_buf_bit<<8); data_cnt <= data_cnt + 1'b1; if(data_cnt < 31) //共32次 把第二行的内容显示在屏幕上 func <= dat2; //不能把第一行字符显示出来,所以采用分两次写数据 else begin func <= done; data_cnt <= 1'b0; end end //--------------------------------------------------------------- done: begin if(data_buf!==data ) //判断有没有新送进来的数据,对比法 func <= set0; //有就回液晶屏初始化 else begin func <= done; //没有就结束 en <= 1; end end default:func <= set1; endcase end end //--------------------------------------------------------------- assign lcd_e = clk_lcd | en; assign lcd_rw = 0; endmodule |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1403 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1053 浏览 0 评论
2474 浏览 1 评论
2177 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2445 浏览 0 评论
1908 浏览 50 评论
6019 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 11:38 , Processed in 0.685148 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号