📄 lcd12864.v
字号:
//LCD12864在时序上与LCD1602差不多。只需要LCD1602上做些少量的修改即可
//此程序只适应于带字库LCD12864屏。
module lcd12864(clk,rst,lcd_e,lcd_rw,lcd_rs,data);
input clk,rst;
output lcd_e,lcd_rw,lcd_rs;
output [7:0] data;
reg lcd_e,lcd_rw,lcd_rs;
reg [7:0] datain;
reg [7:0] data;
reg [10:0] state;
reg flag;
reg [5:0] address;
reg [6:0] counter;
reg [3:0] divcounter;
parameter IDLE =11'b00000000000;
parameter CLEAR =11'b00000000001; //清屏
parameter SETMODE =11'b00000000100;
//输入方式设置,读写数据后ram地址增/减1;画面动/不动
parameter SETMODE1 =11'b00000001000;
parameter SETMODE2 =11'b00000010000;
parameter SETMODE3 =11'b00000100000;
parameter SETDDRAM1 =11'b00010000000; //设置DDRAM
parameter SETDDRAM2 =11'b00011000000; //设置DDRAM
parameter READFLAG =11'b00100000000; //
parameter WRITERAM =11'b01000000000; //写RAM
parameter READRAM =11'b10000000000; //读RAM
function [7:0] ddram; //汉字编码查找函数,汉字的编码请在12864LCD文档中查找
input [5:0] n;
begin
case(n)
6'b000_000:ddram=8'hCE; //"我",高位
6'b000_001:ddram=8'hD2; //低位
6'b000_010:ddram=8'hB0; //"爱"
6'b000_011:ddram=8'hAE; //low
6'b000_100:ddram=8'hC7; //"嵌"
6'b000_101:ddram=8'hB6; //low
6'b000_110:ddram=8'hC8; //"入"
6'b000_111:ddram=8'hEB; //low
6'b001_000:ddram=8'hCA; //"式"
6'b001_001:ddram=8'hBD; //low
endcase
end
endfunction
reg [20:0] clkcnt;
always @ (posedge clk)
if(!rst)
clkcnt<=21'b00000_0000_0000_0000_0000;
else
begin
if(clkcnt==21'b01001_1100_0100_0000_0000)
clkcnt<=21'b00000_0000_0000_0000_0000;
else
clkcnt<=clkcnt+1;
end
wire tc_clkcnt;
assign tc_clkcnt=(clkcnt==21'b01001_1100_0100_0000_0000)?1:0;
reg clkdiv;
always @ (posedge tc_clkcnt)
if(!rst)
clkdiv<=0;
else
clkdiv<=~clkdiv;
reg clk_int;
always @ (posedge clkdiv)
if(rst==0)
clk_int<=0;
else
clk_int<=~clk_int;
always @ (negedge clkdiv)//下降沿lcd_e输出
if(!rst)
lcd_e<=0;
else
lcd_e<=~lcd_e;
always @ (posedge clk_int or negedge rst)
begin
if(!rst)
begin
state<=IDLE;
flag<=0;
counter<=0;
divcounter<=0;
address<=0;
end
else
begin
case(state)
IDLE :begin
if(!flag)
begin
state<=CLEAR;
flag<=1'b1;
counter<=0;
divcounter<=0;
end
else if(divcounter<4'd8)//改变速度
begin
divcounter<=divcounter+1;
state<=IDLE;
lcd_rw <=1'b1;
end
else
begin
divcounter<=0;
counter<=0;
address<=0;
state<=CLEAR;
end
end
CLEAR :begin lcd_rs<=0;lcd_rw<=0;data<=8'b0000_0001;
state<=SETMODE;end
SETMODE :begin lcd_rs<=0;lcd_rw<=0;data[7:0]<=8'b0000_0011;
state<=SETMODE1;end
SETMODE1 :begin lcd_rs<=0;lcd_rw<=0;data[7:0]<=8'b0000_1100;
state<=SETMODE2;end
SETMODE2 :begin lcd_rs<=0;lcd_rw<=0;data[7:0]<=8'b0000_0001;
state<=SETMODE3;end
SETMODE3 :begin lcd_rs<=0;lcd_rw<=0;data[7:0]<=8'b0000_0110;
state<=SETDDRAM1;end
SETDDRAM1 :begin
lcd_rs<=0;
lcd_rw<=0;
state<=WRITERAM;
if(counter==0)
data<=8'b1000_0000;
end
SETDDRAM2 :begin lcd_rs<=0;lcd_rw<=0;data<=8'b10010000;state<=WRITERAM;end//0x80显示在第一行
WRITERAM :begin
lcd_rs<=1;
lcd_rw<=0;
data<=datain;
if(counter<7'h1b)
begin
address = counter+1;
counter=counter+1;
state<=WRITERAM;
end
else if(counter==7'h1b)//显示完英文字符号开始显示汉字
begin
state<=SETDDRAM2;//汉字显示在第二行,重新设置DDRAM
address<=0;
counter=counter+1;
end
else if(counter<7'h1b+'h0B)
begin
data<=ddram(address);//调用函数显示汉字
address<=address+1;
counter=counter+1;
state<= WRITERAM;
end
else
begin
state<=IDLE;
end
end
endcase
end
end
char_ram charram(.address(address),.data(datain));//查找英文字符ASCII表
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -