FPGA ——LCD12864 _verilog程序

1、

LCD12864 是一种单片机常用显示屏,按照其字库共可显示164个英文字母 或者 84个汉字,按数据传输方式具有很多分类。以下为较为常见的8数据线接口的显示教程。

2、

其工作原理是通过驱动RW,RS,E 、8位数据口 来写命令和写数据。在
RW表读“1”、写“0”操作。本次只进行读操作,故RW设为“0”。
E为使能端:高电平写入,故可与clock时钟相同。
RS在写入数据是为“1”。
PSB接高电平
BLK接GND
BLA与接电位器以控制lcd背光亮度
按照单片机使用它的一般工作顺序:指令初始化---->写数据。

3、

首先是指令初始化:下面是其指令表:
这里写图片描述
首先通过状态机写指令(注意虽然12864指令具有默认值,但还是需要进行配置,否则非正常显示)。首先设置对其功能进行设定,这儿有个坑,刚开始看数据手册没有注意到这点,导致浪费很多时间,此坑如下:
这里写图片描述
就是对此指令设置,必须要进行两次。一次设置选用的指令集,一次设置控制接口宽度。
随后就是按照指令表内容,设置光标、进入点等。很简单,详见代码

4、

写入数据。
写数据是应将RS设“1”。在写入数据时应注意其行数的选择,其不能自动换行,应进行指令操控换行。本里程使用ST7920字库。其英文字库可以直接使用英文字母如“A”。注意如果现实数值需要加0'd48.
(没有数据手册可以点击后面链接下载,PDF支持Ctr+F查找汉字很是方便:
下载链接:https://download.csdn.net/download/szsfate/10526436)。
使用汉字可以在数据手册自行查找如下:
这里写图片描述

5、

注意其时钟频率的设定,经实测3KHz左右基本为其最大时钟频率,5k会在指令和数据转换之间出现错误。

6、

以下为其代码:具有详细备注说明。为演示,程序中将data_buf接口注释掉。

/*
* Title:    <话机屏幕显示>
* description:
* @author:  fateszs
* @data:    2018.7.06
*
*/
module lcd_12864(
	input	clk_50M, 
	input	rst,
//	input [511:0]data_buf,							//使用时去掉注释。
	output lcd
  • 13
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是FPGA控制LCD12864显示屏显示图片实验Verilog逻辑源码示例: ```verilog module LCD12864_display_picture( input clk, //时钟信号 input rst, //重置信号 output reg [7:0] LCD_data, //LCD数据信号 output reg LCD_RS, //LCD RS信号 output reg LCD_RW, //LCD RW信号 output reg LCD_EN //LCD EN信号 ); //定义显示的图片数据 reg [7:0] picture[0:7] = {8'h1C, 8'h3E, 8'h7F, 8'hE7, 8'hC3, 8'hC3, 8'hE7, 8'h7F}; //定义控制LCD显示的状态 reg [2:0] state = 3'b000; //定义计数器,用于控制LCD显示的速度 reg [7:0] count = 8'd0; always @(posedge clk or posedge rst) begin if(rst) begin state <= 3'b000; count <= 8'd0; LCD_RS <= 1'b0; LCD_RW <= 1'b0; LCD_EN <= 1'b0; LCD_data <= 8'h00; end else begin case(state) 3'b000: begin //初始化 if(count < 8'd10) begin //延时一段时间,等待LCD初始化完成 count <= count + 1; LCD_RS <= 1'b0; LCD_RW <= 1'b0; LCD_EN <= 1'b1; LCD_data <= 8'h38; end else begin count <= 8'd0; state <= 3'b001; end end 3'b001: begin //清屏 if(count < 8'd10) begin //延时一段时间,等待清屏完成 count <= count + 1; LCD_RS <= 1'b0; LCD_RW <= 1'b0; LCD_EN <= 1'b1; LCD_data <= 8'h01; end else begin count <= 8'd0; state <= 3'b010; end end 3'b010: begin //设置显示模式 if(count < 8'd10) begin //延时一段时间,等待设置完成 count <= count + 1; LCD_RS <= 1'b0; LCD_RW <= 1'b0; LCD_EN <= 1'b1; LCD_data <= 8'h0C; end else begin count <= 8'd0; state <= 3'b011; end end 3'b011: begin //显示图片 if(count < 8'd100) begin //延时一段时间,控制显示速度 count <= count + 1; LCD_RS <= 1'b1; LCD_RW <= 1'b0; LCD_EN <= 1'b1; LCD_data <= picture[count%8]; end else begin count <= 8'd0; state <= 3'b100; end end 3'b100: begin //结束 LCD_RS <= 1'b0; LCD_RW <= 1'b0; LCD_EN <= 1'b0; LCD_data <= 8'h00; end endcase end end endmodule ``` 这个程序实现了FPGA控制LCD12864显示屏显示图片的功能。当时钟信号上升沿到来时,会根据状态寄存器的状态来进行不同的操作。初始状态为初始化,会等待一段时间后发送指令给LCD进行初始化操作。然后进入清屏状态,同样是在等待一段时间后发送指令给LCD进行清屏。接着进入设置显示模式状态,同样是在等待一段时间后发送指令给LCD进行设置。最后进入显示图片状态,通过计数器控制显示速度,每次发送一个字节的图片数据给LCD进行显示。最后进入结束状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值