lcd1602如何自定义汉字(verilog)
今天一鼓作气,再研究了一下如何用LCD1602自定义汉字
1、用字模软件获取汉字所对应的数据(因为嫌麻烦所以直接用了网上一个帖子里有关“电”的数据,如下:04,1f,15,1f,15,15,1f,04,07)帖子链接:http://www.51hei.com/mcu/3696.html
2、主要知识点
(1)lcd1602的11个指令集与lcd1602的基本显示,前两篇文章已经详细说过,链接如下
http://www.cnblogs.com/aslmer/p/5801363.html
http://www.cnblogs.com/aslmer/p/5819422.html
(2)DDRAM 与 CGRAM 的区别,根据数据手册知道我们可以定义8个汉字,具体更多知识点请自己百度。
(3)主要的两个指令 Set CGRAM Address 、 Write data to RAM 。
module lcd_1602_driver(
clk ,
rst_n ,
lcd_en ,
lcd_rw ,
lcd_rs ,
lcd_data );
input clk ;
input rst_n ; output lcd_en ;
output lcd_rw ;
output lcd_rs ;
output [:] lcd_data;
wire clk ;
wire rst_n ;
wire lcd_en ;
wire lcd_rw;
reg [:] lcd_data;
reg lcd_rs ;
reg [:] c_state ;
reg [:] n_state ;
wire [:] row_1;
wire write_flag;
//wire [127:0] row_2;
assign row_1 ="i am liu xiao yi" ;
//assign row_2 ="happy everyday !";
//----------------------------------------------------------------------
//initialize
//first step is waitng more than 20 ms.
parameter TIME_20MS = 1000_000 ; //20000000/20=1000_000
//parameter TIME_15MS = 9'h100 ; //just for test
parameter TIME_500HZ= 100_000 ; //
//parameter TIME_500HZ= 4'hf; //just for test
//use gray code 这里本来用的是格雷码,但是由于增添了两个状态,就随机写了f1,f2这两个数字。
parameter IDLE= 'h00 ;
parameter SET_FUNCTION= 'h01 ;
parameter DISP_OFF= 'h03 ;
parameter DISP_CLEAR= 'h02 ;
parameter ENTRY_MODE= 'h06 ;
parameter DISP_ON = 'h07 ;
parameter ROW1_ADDR= 'h05 ;
//----------------------修改1,增添这两个状态
parameter CGRAM_ADDR = 'hf1;
parameter CGRAM_DATA = 'hf2;
//-----------------------
parameter ROW1_0= 'h04 ;
parameter ROW1_1= 'h0C ;
parameter ROW1_2= 'h0D ;
parameter ROW1_3= 'h0F ;
parameter ROW1_4= 'h0E ;
parameter ROW1_5= 'h0A ;
parameter ROW1_6= 'h0B ;
parameter ROW1_7= 'h09 ;
parameter ROW1_8= 'h08 ;
parameter ROW1_9= 'h18 ;
parameter ROW1_A= 'h19 ;
parameter ROW1_B= 'h1B ;
parameter ROW1_C= 'h1A ;
parameter ROW1_D= 'h1E ;
parameter ROW1_E= 'h1F ;
parameter ROW1_F= 'h1D ; parameter ROW2_ADDR= 'h1C ;
parameter ROW2_0= 'h14 ;
parameter ROW2_1= 'h15 ;
parameter ROW2_2= 'h17 ;
parameter ROW2_3= 'h16 ;
parameter ROW2_4= 'h12 ;
parameter ROW2_5= 'h13 ;
parameter ROW2_6= 'h11 ;
parameter ROW2_7= 'h10 ;
parameter ROW2_8= 'h30 ;
parameter ROW2_9= 'h31 ;
parameter ROW2_A= 'h33 ;
parameter ROW2_B= 'h32 ;
parameter ROW2_C= 'h36 ;
parameter ROW2_D= 'h37 ;
parameter ROW2_E= 'h35 ;
parameter ROW2_F= 'h34 ; reg [:] cnt_20ms ;
always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
cnt_20ms<=;
end
else if(cnt_20ms == TIME_20MS -)begin
cnt_20ms<=cnt_20ms;
end
else
cnt_20ms<=cnt_20ms + ;
end
wire delay_done = (cnt_20ms==TIME_20MS-)? 'b1 : 1'b0 ;
//----------------------------------------------------------------------
//500ns lcd1602工作在500HZ,因此此处要分频
reg [:] cnt_500hz;
always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
cnt_500hz <= ;
end
else if(delay_done==)begin
if(cnt_500hz== TIME_500HZ - )
cnt_500hz<=;
else
cnt_500hz<=cnt_500hz + ;
end
else
cnt_500hz<=;
end assign lcd_en = (cnt_500hz>(TIME_500HZ-)/)? 'b0 : 1'b1; //下降沿
assign write_flag = (cnt_500hz==TIME_500HZ - ) ? 'b1 : 1'b0 ; //set_function ,display off ,display clear ,entry mode set
//----------------------------------------------------------------------
always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
c_state <= IDLE ;
end
else if(write_flag==) begin
c_state<= n_state ;
end
else
c_state<=c_state ;
end //-------------------------修改2 因为自定义一个汉字需要写8次地址并且给8次数据,所以用num和num1来控制。
reg [:]num,num1;
always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
num<=;
end
else if(c_state== CGRAM_ADDR&&write_flag) begin
if(num==)
num<=;
else
num<=num+'b1;
end
else
num<=num;
end always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
num1<=;
end
else if(c_state== CGRAM_DATA&&write_flag) begin
if(num1==)
num1<=;
else
num1<=num1+'b1;
end
else
num1<=num1;
end //------------------------------------------------------------ always @(*)begin
case (c_state)
IDLE: n_state = SET_FUNCTION ;
SET_FUNCTION: n_state = DISP_OFF ;
DISP_OFF: n_state = DISP_CLEAR ;
DISP_CLEAR: n_state = ENTRY_MODE ;
ENTRY_MODE: n_state = DISP_ON ;
DISP_ON : n_state = CGRAM_ADDR ;
//------------------------------------------------ 修改3 当8个数据都写进相应地址里的时候,状态机才跳到ROW1_ADDR状态
CGRAM_ADDR: n_state = CGRAM_DATA ; // 8'hfe;
CGRAM_DATA: if(num1==)
n_state = ROW1_ADDR;
else
n_state= CGRAM_ADDR;
//------------------------------------------------
ROW1_ADDR: n_state = ROW1_0 ;
ROW1_0: n_state = ROW1_1 ;
ROW1_1: n_state = ROW1_2 ;
ROW1_2: n_state = ROW1_3 ;
ROW1_3: n_state = ROW1_4 ;
ROW1_4: n_state = ROW1_5 ;
ROW1_5: n_state = ROW1_6 ;
ROW1_6: n_state = ROW1_7 ;
ROW1_7: n_state = ROW1_8 ;
ROW1_8: n_state = ROW1_9 ;
ROW1_9: n_state = ROW1_A ;
ROW1_A: n_state = ROW1_B ;
ROW1_B: n_state = ROW1_C ;
ROW1_C: n_state = ROW1_D ;
ROW1_D: n_state = ROW1_E ;
ROW1_E: n_state = ROW1_F ;
ROW1_F: n_state = ROW2_ADDR ; ROW2_ADDR: n_state = ROW2_0 ;
ROW2_0: n_state = ROW2_1 ;
ROW2_1: n_state = ROW2_2 ;
ROW2_2: n_state = ROW2_3 ;
ROW2_3: n_state = ROW2_4 ;
ROW2_4: n_state = ROW2_5 ;
ROW2_5: n_state = ROW2_6 ;
ROW2_6: n_state = ROW2_7 ;
ROW2_7: n_state = ROW2_8 ;
ROW2_8: n_state = ROW2_9 ;
ROW2_9: n_state = ROW2_A ;
ROW2_A: n_state = ROW2_B ;
ROW2_B: n_state = ROW2_C ;
ROW2_C: n_state = ROW2_D ;
ROW2_D: n_state = ROW2_E ;
ROW2_E: n_state = ROW2_F ;
ROW2_F: n_state = ROW1_ADDR ;
default: n_state = n_state ;
endcase
end assign lcd_rw = ;
always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
lcd_rs <= ; //order or data 0: order 1:data
end
else if(write_flag == )begin
if((n_state==SET_FUNCTION)||(n_state==DISP_OFF)||
(n_state==DISP_CLEAR)||(n_state==ENTRY_MODE)||
(n_state==DISP_ON ) ||(n_state==ROW1_ADDR)||
(n_state==ROW2_ADDR)||(n_state==CGRAM_ADDR))begin //修改4
lcd_rs<= ;
end
else begin
lcd_rs<= ;
end
end
else begin
lcd_rs<=lcd_rs;
end
end always @(posedge clk or negedge rst_n)begin
if(rst_n=='b0)begin
lcd_data<= ;
end
else if(write_flag)begin
case(n_state) IDLE: lcd_data <= 'hxx;
SET_FUNCTION: lcd_data <= 'h38; //2*16 5*8 8位数据
DISP_OFF: lcd_data <= 'h08;
DISP_CLEAR: lcd_data <= 'h01;
ENTRY_MODE: lcd_data <= 'h06;
DISP_ON : lcd_data <= 'h0c; //显示功能开,没有光标,且不闪烁,
// ------------------------------------修改5
CGRAM_ADDR: begin
case(num)
: lcd_data <= 'h40;
: lcd_data <= 'h41;
: lcd_data <= 'h42;
: lcd_data <= 'h43;
: lcd_data <= 'h44;
: lcd_data <= 'h45;
: lcd_data <= 'h46;
: lcd_data <= 'h47;
endcase
end CGRAM_DATA: begin
case(num1)
: lcd_data <= 'h04;
: lcd_data <= 'h1f;
: lcd_data <= 'h15;
: lcd_data <= 'h1f;
: lcd_data <= 'h15;
: lcd_data <= 'h1f;
: lcd_data <= 'h04;
: lcd_data <= 'h07;
endcase
end
//-------------------------------------修改6第一行显示 i am liu xiao yi 第二行全部显示汉字电
ROW1_ADDR: lcd_data <= 'h80; //00+80
ROW1_0: lcd_data <= row_1 [:];
ROW1_1: lcd_data <= row_1 [:];
ROW1_2: lcd_data <= row_1 [:];
ROW1_3: lcd_data <= row_1 [: ];
ROW1_4: lcd_data <= row_1 [ : ];
ROW1_5: lcd_data <= row_1 [ : ];
ROW1_6: lcd_data <= row_1 [ : ];
ROW1_7: lcd_data <= row_1 [ : ];
ROW1_8: lcd_data <= row_1 [ : ];
ROW1_9: lcd_data <= row_1 [ : ];
ROW1_A: lcd_data <= row_1 [ : ];
ROW1_B: lcd_data <= row_1 [ : ];
ROW1_C: lcd_data <= row_1 [ : ];
ROW1_D: lcd_data <= row_1 [ : ];
ROW1_E: lcd_data <= row_1 [ : ];
ROW1_F: lcd_data <= row_1 [ : ]; ROW2_ADDR: lcd_data <= 'hc0; //40+80
ROW2_0: lcd_data <='h00; //电
ROW2_1: lcd_data <='h00;
ROW2_2: lcd_data <='h00;
ROW2_3: lcd_data <='h00;
ROW2_4: lcd_data <='h00;
ROW2_5: lcd_data <='h00;
ROW2_6: lcd_data <='h00;
ROW2_7: lcd_data <='h00;
ROW2_8: lcd_data <='h00;
ROW2_9: lcd_data <='h00;
ROW2_A: lcd_data <='h00;
ROW2_B: lcd_data <='h00;
ROW2_C: lcd_data <='h00;
ROW2_D: lcd_data <='h00;
ROW2_E: lcd_data <='h00;
ROW2_F: lcd_data <='h00;
endcase
end
else
lcd_data<=lcd_data ;
end endmodule
4、显示结果

转载请注明出处:http://www.cnblogs.com/aslmer/p/5819868.html
lcd1602如何自定义汉字(verilog)的更多相关文章
- LCD1602显示中文汉字
小子在西藏 2011-11-25编写 特别说明笔者是上面的作者,感谢那些原意分享知识的人.时隔5年我又看到了笔者当年写的东西,我想这期间还有许许多多的人 今天写在博客上,愿更多后来者可以学习. LCD ...
- LCD1602写自定义字符的Verilog源码
开发工具:Quartus II 9.1: 仿真软件:Questa Sim 10.0c: 硬件平台:Terasic DE2-115(EP2C35F672C6): 外设:hd44780控制器lcd1602 ...
- [FPGA]浅谈LCD1602字符型液晶显示器(Verilog)
目录 概述 LCD1602 LCD1602是什么? LCD1602的管脚 RS_数据/命令选择 E_使能 D0-D7 LCD1602有个DDRAM LCD1602还有个CGROM 指令集 清屏 进入模 ...
- verilog写的LCD1602 显示
在读本文之前,请先阅读 LCD1602 的 datasheet(百度到处都是) ,熟悉有关的11条指令集. LCD1602的11个指令集链接 http://www.cnblogs.com/aslmer ...
- [FPGA] Verilog 燃气灶控制器的设计与实现
燃气灶控制器的设计与实现 一.引述 本次实验所用可编程器件型号为MAXII EPM1270T144C5(其引脚表见本人另一博文:可编程实验板EPM1270T144C5使用说明),通过可编程实验板实现一 ...
- Atiti attilax主要成果与解决方案与案例rsm版 v4
Atiti attilax主要成果与解决方案与案例rsm版 v4 版本历史记录1 1. ##----------主要成果与解决方案与 参与项目1 ###开发流程与培训系列1 #-----组织运营与文 ...
- Atiti attilax主要成果与解决方案与案例rsm版 v2
Atiti attilax主要成果与解决方案与案例rsm版 v2 1. ##----------主要成果与解决方案与 参与项目1 ###开发流程与培训系列1 #-----组织运营与文化建设系列1 # ...
- Atiti attilax主要成果与解决方案与案例rsm版
Atiti attilax主要成果与解决方案与案例rsm版 1. ##----------主要成果与解决方案与 参与项目1 ###开发流程系列1 ###架构系列 (au1 ###编程语言系列与架构系 ...
- iOS-高仿通讯录之商品索引排序搜索
概述 TableView添加右侧索引, 将数据按照索引分组排序, 并添加搜索功能且在搜索界面复用当前页面. 详细 代码下载:http://www.demodashi.com/demo/10696.ht ...
随机推荐
- Git 推送和删除标签
事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:re ...
- SSH中懒加载异常--could not initialize proxy - no Session
SSH进行关联的表进行显示时出现的问题,老是显示你的OGNL表达式错误,但是找了很久确实没错,在网上找了一下,下面的这个方法本人认为是最有效的方法(已经测试可以使用) 在web.xml中加入 程序代码 ...
- python_33_文件操作2
f=open('yesterday',encoding='utf-8') #print(f.readline())#读一行,并且是第一行 #读前5行 for i in range(5):#range( ...
- http 调用错误处理
1. http code 在使用Nginx时,经常会碰到502 Bad Gateway和504 Gateway Time-out错误,下面以Nginx+PHP-FPM来分析下这两种常见错误的原因和解决 ...
- windows下sorl安装
1. JDK要求 Solr 4.10 要求JDK版本必须是1.7或更高. 2. 下载 下载地址: http://www.apache.org/dyn/closer.cgi/lucene/solr/ 下 ...
- SAP 各模块常用的BAPI
MM模块 1. BAPI_MATERIAL_SAVEDATA 创建物料主数据 注意参数EXTENSIONIN的使用,可以创建自定义字段 例如:WA_BAPI_TE_MARA-MATERIAL = IT ...
- Linux下 tomcat 的开机自启动设置
每次开机都要启动tomcat,非常麻烦:通过直接修改系统文件,实现tomcat自启动: 1. 修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动 ...
- mount: no medium found on /dev/sr0 找不到介质
在VMware虚拟机中配置yum源时,执行 mount /dev/cdrom /mnt/cdrom 出现 mount: no medium found on /dev/sr0. 首先在/mnt 目录下 ...
- mybatis的环境搭建
mybatis是一个持久层框架,其主要思想就是想将程序中大量的SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置. 使得SQL与程序代码分离,即在不修改程序代码的情况下,直接在配置文件中修改S ...
- iframe子元素相对于父页面滚动条固定(iframe无滚动条,iframe固定高度有滚动条,两种情况)
一.当iframe自适应高度,无滚动条时候: 例如这样: //随着父页面滚动条滚动定位“#qn-quc”他的位置固定在顶部 $(parent.window).scroll(function() { v ...