⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.v

📁 Verilog 经典实例
💻 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 + -