怎么用FPGA控制1602液晶,求高手指导一下(已解决)

2019-07-16 01:54发布

本帖最后由 hughqfb 于 2013-2-20 11:05 编辑

我自己有简单的verilog-HDL代码,可以显示简单的字符数字,但是我想要实时显示传感器的数据该怎么写呢?封装成一个模块,然后实例化?

大家有资料的可以上传上来,我东西做完了到时也会给大家分享的。嘿嘿。第四层楼我给出了代码。

祝大家新年快乐,万事如意哦!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
hughqfb
1楼-- · 2019-07-16 02:19
 精彩回答 2  元偷偷看……
hughqfb
2楼-- · 2019-07-16 07:27
关于变量在液晶中的显示方法?单片机中可以用C语言的数组,VerilogHDL中怎么办呢?用case语句的话代码量显得太大了,有没有相对好点的方法呢?
hughqfb
3楼-- · 2019-07-16 12:20
下面是Verilog的1602显示代码,其中的变量是从别的模块传递过来的。有没有方法直接可以显示字符呢?
  1. /************************************************************************************/
  2. //LCD1602的显示
  3. //
  4. /************************************************************************************/
  5. module lcd1602(clk,rst,lcd_rs,lcd_en,lcd_rw,lcd_data,back_light,ps_datain);
  6. input clk,rst;//时钟、复位
  7. input [7:0] ps_datain;//PS2数据输入
  8. output lcd_rs,lcd_en,lcd_rw,back_light;//指令/数据控制、片选、读写控制、背光控制
  9. output [7:0] lcd_data;//数据线

  10. reg lcd_rs;//指令/数据控制
  11. reg [7:0] lcd_data;//数据线
  12. reg [7:0] current_state;//当前状态
  13. reg [1:0] state_counter;//状态计数
  14. reg en_temp;//使能标志
  15. reg [15:0] clk_counter;//时钟计数
  16. reg clk_en;//时钟使能
  17. //reg [7:0] ps_datain_temp;

  18. assign back_light=1'b1;//一直设置为高电平
  19. assign lcd_rw=1'b0;//一直为写状态
  20. /********************状态编码******************************/
  21. parameter set0=8'b0000_0000,
  22.           set1=8'b0000_0001,
  23.           set2=8'b0000_0011,
  24.           set3=8'b0000_0100,
  25.           set4=8'b0000_0101,
  26.           data1=8'b0000_1000,
  27.           data2=8'b0000_1001,
  28.           data3=8'b0000_1010,
  29.           data4=8'b0000_1011,
  30.           data5=8'b0000_1100,
  31.           data6=8'b0000_1101,
  32.           data7=8'b0000_1110,
  33.           data8=8'b0000_1111,
  34.           data9=8'b0001_0000,
  35.           stop=8'b1111_1111;
  36. /**************状态转换时钟***********************/

  37. always @(posedge clk)
  38. begin
  39.   if(clk_counter==16'h8000)
  40.     begin
  41.      clk_counter<=16'h0;
  42.      clk_en<=~clk_en;
  43.     end
  44.   else
  45.     clk_counter<=clk_counter+1'b1;
  46. end
  47. /**************状态转换**************************///

  48. always @(posedge clk_en or negedge rst)
  49. begin
  50.    if(!rst)
  51.      begin
  52.       current_state<=set0;
  53.      end
  54.    else
  55.      begin
  56.        case (current_state)
  57.        /*********************************************************************************/
  58.         set0:begin lcd_rs<=1'b0;lcd_data<=8'h38;current_state<=set1; end//显示模式设置
  59.         set1:begin lcd_rs<=1'b0;lcd_data<=8'h0c;current_state<=set2; end//显示开及光标设置
  60.         set2:begin lcd_rs<=1'b0;lcd_data<=8'h06;current_state<=set3; end//显示光标移动设置
  61.         set3:begin lcd_rs<=1'b0;lcd_data<=8'h01;current_state<=set4; end//显示清屏
  62.         set4:begin lcd_rs<=1'b0;lcd_data<=8'h80;current_state<=data1; end//设置第一行地址
  63.        /***********************************************************************************/
  64.         data1:begin lcd_rs<=1'b1;lcd_data<="K";current_state<=data2; end//显示第一个字符
  65.         data2:begin lcd_rs<=1'b1;lcd_data<="e";current_state<=data3; end//显示第二个字符
  66.         data3:begin lcd_rs<=1'b1;lcd_data<="y";current_state<=data4; end//显示第四个字符
  67.         data4:begin lcd_rs<=1'b1;lcd_data<="_";current_state<=data5; end//显示第五个字符
  68.         data5:begin lcd_rs<=1'b1;lcd_data<="P";current_state<=data6; end//显示第六个字符
  69.         data6:begin lcd_rs<=1'b1;lcd_data<="u";current_state<=data7; end//显示第七个字符
  70.         data7:begin lcd_rs<=1'b1;lcd_data<="t";current_state<=data8; end//显示第八个字符
  71.         data8:begin lcd_rs<=1'b1;lcd_data<=":";current_state<=data9; end//显示第九个字符
  72.         data9:begin lcd_rs<=1'b1;lcd_data<=ps_datain;current_state<=stop; end//显示获取的数据
  73.        /*********************************************************************************/
  74.         stop:begin //控制指令与数据写入的次数
  75.                    lcd_rs<=1'b0;
  76.                    lcd_data<=8'b0000_0000;
  77.                    if(state_counter!=2'b10)
  78.                      begin
  79.                        en_temp<=1'b0;
  80.                        current_state<=set0;
  81.                        state_counter<=state_counter+1'b1;
  82.                      end
  83.                    else
  84.                       begin
  85.                         current_state<=set0;
  86.                         en_temp<=1'b0;//最后数据写入完成后将lcd_en线拉高
  87.                       end
  88.              end
  89.         default:  current_state<=set0;
  90.        endcase   
  91.      end
  92. end
  93. assign lcd_en=clk_en|en_temp;//lcd_en为‘1’有效

  94. endmodule
复制代码
hughqfb
4楼-- · 2019-07-16 14:07
大家都忙着过年啊!桑心啊!
hughqfb
5楼-- · 2019-07-16 15:56
总的来说,1602液晶时序要求并不高,所以只要写好状态机在每个状态写入对应的代码即可!网上的很多1602的verilogHDL代码都是写入静态的字符,如果要求动态显示字符那就要把1602的接口驱完善。写好了我便上传资料,以便后来人参考。
qq274822790
6楼-- · 2019-07-16 18:25
 精彩回答 2  元偷偷看……

一周热门 更多>