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

📄 lcd.v.bak

📁 采用FPGA控制LCD。程序中用了两个状态机
💻 BAK
字号:
/************************************************************/
/*************************2008.08.03*************************/
/*******************Created by Shi Hailong*******************/
/**********************WuHan University**********************/
/************************************************************/
module LCD(clk,din,wr,cs,a0,reset,dout,addr);

input clk;
input[7:0] din;
output wr,cs,a0,reset;
output[7:0] dout;
output[5:0] addr;

reg wr,cs,a0,reset;
reg[7:0] dout;
reg[5:0] addr;

reg[7:0] char;

reg com_flag;

reg[7:0] datetemp;
reg[15:0] delay_cnt;
reg[7:0] Byte_cnt,hanzi_cnt;
reg[15:0] Clear_cnt;

reg[7:0] state,breakpoint,sub_state,Interupt;
reg[15:0] Cursor_addr,Cursor_addr0;

parameter 	Reset_LCD=8'd0,		Init_LCD=8'd10,		WR_Clear=8'd20,	
			WR_hanzi=8'd30,		WR_ABC=8'd40,		WR_hanzi0=8'd50,
			WR_ABC0=8'd60,		WR_hanzi_over=8'd70,	
			
			WR_Begin=8'd200,	WR_LOW=8'd201,		WR_CS_LOW=8'd202,
			WR_Delay1=8'd203,	WR_Delay2=8'd204,	WR_Delay3=8'd205,	
			WR_HIGH=8'd206,		WR_CS_HIGH=8'd207,	WR_OVER=8'd208,
			
			WR_Date=8'd100,		Clear_LCD=8'd101,	WR_String=8'd102;

always@(posedge clk)
	begin
	case(state)
	Reset_LCD:begin
		case(sub_state)
		8'd0:begin
			if(delay_cnt<=16'hfff0) begin wr<=1;cs<=1;reset<=0;delay_cnt<=delay_cnt+1'b1;end
			else begin delay_cnt<=16'd0;sub_state<=sub_state+1'b1;end
			end
		8'd1:begin
			if(delay_cnt<=16'hfff0) begin wr<=1;cs<=1;reset<=1;delay_cnt<=delay_cnt+1'b1;end
			else begin delay_cnt<=16'd0;sub_state<=sub_state+1'b1;end
			end
		8'd2:begin
			sub_state<=8'd0;
			state<=Init_LCD;
			end
		endcase
		end
	Init_LCD:begin
		case(sub_state)
		8'd0:begin
			com_flag<=1'b1;
			datetemp<=8'h40;//Init_LCD COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd1:begin
			com_flag<=1'b0;
			datetemp<=8'h30;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd2:begin
			com_flag<=1'b0;
			datetemp<=8'h87;//P2
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd3:begin
			com_flag<=1'b0;
			datetemp<=8'h07;//P3
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd4:begin
			com_flag<=1'b0;
			datetemp<=8'd39;//P4
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd5:begin
			com_flag<=1'b0;
			datetemp<=8'h44;//P5
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd6:begin
			com_flag<=1'b0;
			datetemp<=8'd239;//P6
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd7:begin
			com_flag<=1'b0;
			datetemp<=8'd40;//P7
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd8:begin
			com_flag<=1'b0;
			datetemp<=8'd0;//P8
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd9:begin
			com_flag<=1'b1;
			datetemp<=8'h59;//Start Display COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd10:begin
			com_flag<=1'b0;
			datetemp<=8'h17;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd11:begin
			com_flag<=1'b1;
			datetemp<=8'h46;//Cursor Address COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd12:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd13:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P2
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd14:begin
			com_flag<=1'b1;
			datetemp<=8'h5d;//Cursor Type COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd15:begin
			com_flag<=1'b0;
			datetemp<=8'h07;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd16:begin
			com_flag<=1'b0;
			datetemp<=8'h87;//P2
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd17:begin
			com_flag<=1'b1;
			datetemp<=8'h4c;//Cursor Move Right COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end		
		8'd18:begin
			com_flag<=1'b1;
			datetemp<=8'h44;//Set Display Area COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd19:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd20:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P2
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd21:begin
			com_flag<=1'b0;
			datetemp<=8'd240;//P3
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd22:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P4
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd23:begin
			com_flag<=1'b0;
			datetemp<=8'h40;//P5
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd24:begin
			com_flag<=1'b0;
			datetemp<=8'd240;//P6
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd25:begin
			com_flag<=1'b1;
			datetemp<=8'h5b;//Set Add Type COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd26:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd27:begin
			com_flag<=1'b1;
			datetemp<=8'h5a;//Set Dot Move COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd28:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Init_LCD;
			state<=WR_Begin;
			end
		8'd29:begin
			sub_state<=8'd0;
			Cursor_addr<=16'h4000;
			Cursor_addr0<=16'd80;
			state<=WR_Clear;
			end
		endcase
		end
/***********************************************************/
	WR_Clear:begin
		Interupt<=WR_hanzi;
		state<=Clear_LCD;
		end
	WR_hanzi:begin
		if(hanzi_cnt<=8'd19)begin Interupt<=WR_hanzi;hanzi_cnt<=hanzi_cnt+1'b1;state<=WR_Date;end
		else begin hanzi_cnt<=8'd0;state<=WR_ABC;Cursor_addr<=Cursor_addr+11'd1920;end
		end
	WR_ABC:begin
		Interupt<=WR_hanzi0;
		state<=WR_String;
		end
	WR_hanzi0:begin
		if(hanzi_cnt<=8'd19)begin Interupt<=WR_hanzi0;hanzi_cnt<=hanzi_cnt+1'b1;state<=WR_Date;end
		else begin hanzi_cnt<=8'd0;state<=WR_ABC0;Cursor_addr<=Cursor_addr+11'd1920;end
		end	
	WR_ABC0:begin
		Interupt<=WR_hanzi_over;
		state<=WR_String;
		Cursor_addr0<=Cursor_addr0+8'd120;
		end
	WR_hanzi_over:state<=WR_hanzi_over;
/*************************************************************/
	WR_Begin:begin
			state<=WR_LOW;
			cs<=1'b0;
			wr<=1'b1;
			if(com_flag) a0<=1'b1;//Write a COM
			else a0<=1'b0;//Write a Date
			end
	WR_LOW:begin
			state<=WR_CS_LOW;
			cs<=1'b0;
			wr<=1'b0;
			end
	WR_CS_LOW:begin
			state<=WR_Delay1;
			cs<=1'b0;
			wr<=1'b0;
			dout<=datetemp;
			end
	WR_Delay1:begin
			state<=WR_Delay2;
			end
	WR_Delay2:begin
			state<=WR_Delay3;
			end
	WR_Delay3:begin
			state<=WR_HIGH;
			end
	WR_HIGH:begin
			state<=WR_CS_HIGH;
			cs<=1'b0;
			wr<=1'b1;
			end
	WR_CS_HIGH:begin
			state<=WR_OVER;
			cs<=1'b1;
			wr<=1'b1;
			end
	WR_OVER:begin
			if(delay_cnt<=16'h00ff) delay_cnt<=delay_cnt+1'b1;//Delay 
			else begin delay_cnt<=16'd0;state<=breakpoint;end
			end
/******************************************************/
	WR_Date:begin
		case(sub_state)
		8'd0:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=8'h46;
			com_flag<=1'b1;
			end
		8'd1:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=Cursor_addr[7:0];
			com_flag<=1'b0;
			end
		8'd2:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=Cursor_addr[15:8];
			com_flag<=1'b0;
			end
		8'd3:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=8'h4f;
			com_flag<=1'b1;
			end
		8'd4:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=8'h42;
			com_flag<=1'b1;
			end
		8'd5:begin
			if(Byte_cnt<=8'd15)
				begin
				Byte_cnt<=Byte_cnt+1'b1;
				sub_state<=8'd5;
				state<=WR_Begin;
				breakpoint<=WR_Date;
				datetemp<=din;
				addr<=addr+1'b1;
				com_flag<=1'b0;
				end
			else begin
				Byte_cnt<=8'd0;
				sub_state<=sub_state+1'b1;
				Cursor_addr<=Cursor_addr+1'b1;
				end
			end
		8'd6:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=8'h46;
			com_flag<=1'b1;
			end
		8'd7:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=Cursor_addr[7:0];
			com_flag<=1'b0;
			end
		8'd8:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=Cursor_addr[15:8];
			com_flag<=1'b0;
			end
		8'd9:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=8'h4f;
			com_flag<=1'b1;
			end
		8'd10:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_Date;
			datetemp<=8'h42;
			com_flag<=1'b1;
			end
		8'd11:begin
			if(Byte_cnt<=8'd15)
				begin
				Byte_cnt<=Byte_cnt+1'b1;
				sub_state<=8'd11;
				state<=WR_Begin;
				breakpoint<=WR_Date;
				datetemp<=din;
				addr<=addr+1'b1;
				com_flag<=1'b0;
				end
			else begin
				Byte_cnt<=8'd0;
				sub_state<=sub_state+1'b1;
				Cursor_addr<=Cursor_addr+1'b1;
				end
			end
		8'd12:begin
			state<=Interupt;
			sub_state<=8'd0;
			end
		endcase
		end
/************************************************************/
	Clear_LCD:begin
		case(sub_state)
		8'd0:begin
			sub_state<=sub_state+1'b1;
			state<=Clear_LCD;
			end
		8'd1:begin
			com_flag<=1'b1;
			datetemp<=8'h4c;//Cursor Move Right COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end	
		8'd2:begin
			com_flag<=1'b1;
			datetemp<=8'h46;//Cursor Address COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd3:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd4:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P2
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd5:begin
			com_flag<=1'b1;
			datetemp<=8'h42;//Start Write Date COM
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd6:begin
			if(Clear_cnt<16'd1200)
				begin
				Clear_cnt<=Clear_cnt+1'b1;
				sub_state<=8'd6;
				state<=WR_Begin;
				breakpoint<=Clear_LCD;
				datetemp<=8'h20;
				com_flag<=1'b0;
				end
			else begin
				Clear_cnt<=8'd0;
				sub_state<=sub_state+1'b1;
				end
			end
		8'd7:begin
			com_flag<=1'b1;
			datetemp<=8'h46;//Cursor Address COM;
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd8:begin
			com_flag<=1'b0;
			datetemp<=8'h00;//P1
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd9:begin
			com_flag<=1'b0;
			datetemp<=8'h40;//P2
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd10:begin
			com_flag<=1'b1;
			datetemp<=8'h42;//Start Write Date COM
			sub_state<=sub_state+1'b1;
			breakpoint<=Clear_LCD;
			state<=WR_Begin;
			end
		8'd11:begin
			if(Clear_cnt<16'd9600)
				begin
				Clear_cnt<=Clear_cnt+1'b1;
				sub_state<=8'd11;
				state<=WR_Begin;
				breakpoint<=Clear_LCD;
				datetemp<=8'h00;
				com_flag<=1'b0;
				end
			else begin
				Clear_cnt<=8'd0;
				sub_state<=sub_state+1'b1;
				end
			end
		8'd12:begin
			sub_state<=8'd0;
			state<=Interupt;
			end
		endcase
		end
/*************************************************************/
	WR_String:begin
		case(sub_state)
		8'd0:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_String;
			datetemp<=8'h46;
			com_flag<=1'b1;
			end
		8'd1:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_String;
			datetemp<=Cursor_addr0[7:0];
			com_flag<=1'b0;
			end
		8'd2:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_String;
			datetemp<=Cursor_addr0[15:8];
			com_flag<=1'b0;
			end
		8'd3:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_String;
			datetemp<=8'h4c;
			com_flag<=1'b1;
			end
		8'd4:begin
			sub_state<=sub_state+1'b1;
			state<=WR_Begin;
			breakpoint<=WR_String;
			datetemp<=8'h42;
			com_flag<=1'b1;
			char<=8'h20;
			end
		8'd5:begin
			if(Byte_cnt<8'd96)
				begin
				Byte_cnt<=Byte_cnt+1'b1;
				sub_state<=8'd5;
				state<=WR_Begin;
				breakpoint<=WR_String;
				datetemp<=char;
				char<=char+1'b1;
				com_flag<=1'b0;
				end
			else begin
				Byte_cnt<=8'd0;
				char<=8'h20;
				sub_state<=sub_state+1'b1;
				end
			end
		8'd6:begin
			state<=Interupt;
			sub_state<=8'd0;
			end
		endcase
		end
/*********************************************************/
	default:state<=Reset_LCD;
	endcase
	end
endmodule
	
	
	
	
	
	
	
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -