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

📄 lcd_test_initial.v

📁 用状态机实现密码锁State machine used to achieve code lock
💻 V
字号:
//`include "F:\jeffie\quartus\lcdfinal\LCD_Controller.v"

module	LCD_TEST_initial(	//	Host Side
					iCLK,iRST_N,
					LEDR,
					LEDG,
					//	LCD Side
					LCD_DATA,LCD_RW,LCD_EN,LCD_RS,LCD_XX,led_ctrl,password,try_count	);
//	Host Side
input	  iCLK;//	输入时钟为50M
input 	  iRST_N;//
input     [4:0]LCD_XX;
input 	  [1:0]try_count;
input     [4:0]led_ctrl;
output    [17:0]LEDR;
output    [8:0]LEDG;
input     [15:0]password;
//	LCD Side
output	[7:0]	LCD_DATA;
output			LCD_RW,LCD_EN,LCD_RS;
//	Internal Wires/Registers
reg	[5:0]	LUT_INDEX;
reg	[8:0]	LUT_DATA;
reg	[5:0]	mLCD_ST;			//LCD state register
reg	[17:0]	mDLY;				//delay register
reg[17:0]LEDR;
reg[8:0]LEDG;
//reg	[1:0]	mDLY;	
reg			mLCD_Start;
reg	[7:0]	mLCD_DATA;
reg			mLCD_RS;
wire		mLCD_Done;

parameter	LCD_INTIAL	=	0;
parameter	LCD_LINE1	=	5;							//前5个LUT的数据用于初始化,
																			//故第一行的数据从LUT_INDEX=5开始
parameter	LCD_CH_LINE	=	LCD_LINE1+16;	//换行索引
parameter	LCD_LINE2	=	LCD_LINE1+16+1;	//第二行的起始索引
parameter	LUT_SIZE	=	LCD_LINE1+32+1;//查找表的大小


always@(posedge iCLK or negedge iRST_N )
begin
	if(!iRST_N)				//reset
	begin
		LUT_INDEX	<=	0;
		mLCD_ST		<=	0;
		mDLY		<=	0;
		mLCD_Start	<=	0;
		mLCD_DATA	<=	0;
		mLCD_RS		<=	0;

	end
	else
	begin
		if(LUT_INDEX<LUT_SIZE)		//LUT_SIZE	=	LCD_LINE1+32+1;	LCD_LINE1	=	5;
		begin
			case(mLCD_ST)
			0:	begin
					mLCD_DATA	<=	LUT_DATA[7:0];
					mLCD_RS		<=	LUT_DATA[8];
					mLCD_Start	<=	1;
					mLCD_ST		<=	1;
				end
			1:	begin
					if(mLCD_Done)
					begin
						mLCD_Start	<=	0;
						mLCD_ST		<=	2;					
					end
				end
			2:	begin
					if(mDLY<18'h3FFFE)		//显示延时5.24ms
					//if(mDLY<2'h3f)		
					mDLY	<=	mDLY+1;
					else
					begin
						mDLY	<=	0;
						mLCD_ST	<=	3;
					end
				end
			3:	begin
					LUT_INDEX	<=	LUT_INDEX+1;	//访问下一个查找表(的数据)
					mLCD_ST	<=	0;
				end
			endcase
		end
		
		else 
		
		if(led_ctrl)
		   begin
	         LUT_INDEX<=LCD_INTIAL+0;
	         mLCD_ST	<=	0;
     	    end
	    
	    
end
end

//reg [4:0]LUT_DATAX;

always @(LUT_INDEX)//@(posedge iCLK )
begin
case(LCD_XX)

   5'b00001:
      begin
       LEDG[8]<='b1;
	    case(LUT_INDEX)
	     //	Initial
		    LCD_INTIAL+0:	LUT_DATA	<=	9'h038;		//Function Set:
																				/*9'h038=9'b0_0011_1000:
																					位4:1,显示数据长度为:8 bit;
																					位3:1,显示2行
																					位2:0,显示点阵为5*8
																					位1、位0:无关位*/
		    LCD_INTIAL+1:	LUT_DATA	<=	9'h00C;		//Display ON/OFF Control
																				/*9'h00C=9'b0_0000_1100:
																					位2:1,打开显示
																					位1:1,显示光标
																					位0:0,光标不闪烁*/
		    LCD_INTIAL+2:	LUT_DATA	<=	9'h001;		//Clear Display
		    LCD_INTIAL+3:	LUT_DATA	<=	9'h006;		//Entry Mode Set
																				/*9'h006=9'b0_0000_0110:
																					TOTEST*/
		    LCD_INTIAL+4:	LUT_DATA	<=	9'h080;		//Set DDRAM Address
																				/*设置DDRAM 的地址:AC(address counter)=0*/
		    //	Line 1   //	Welcome!
		    LCD_LINE1+0:	LUT_DATA	<=	9'h120;	   //" " blank
		    LCD_LINE1+1:	LUT_DATA	<=	9'h120;	   //" " blank
		    LCD_LINE1+2:	LUT_DATA	<=	9'h120;	   //" " blank
		    LCD_LINE1+3:	LUT_DATA	<=	9'h120;	   //" " blank
		    LCD_LINE1+4:	LUT_DATA	<=	9'h157;   //W
	    	LCD_LINE1+5:	LUT_DATA	<=	9'h165;   //e
		    LCD_LINE1+6:	LUT_DATA	<=	9'h16C;   //l
	    	LCD_LINE1+7:	LUT_DATA	<=	9'h163;   //c
		    LCD_LINE1+8:	LUT_DATA	<=	9'h16F;   //o
		    LCD_LINE1+9:	LUT_DATA	<=	9'h16D;   //m
		    LCD_LINE1+10:	LUT_DATA	<=	9'h165;   //e
		    LCD_LINE1+11:	LUT_DATA	<=	9'h121;   //!
		    LCD_LINE1+12:	LUT_DATA	<=	9'h120;   //" "
		    LCD_LINE1+13:	LUT_DATA	<=	9'h120;   //" "
		    LCD_LINE1+14:	LUT_DATA	<=	9'h120;   //" "
		    LCD_LINE1+15:	LUT_DATA	<=	9'h120;   //" "
		    //	Change Line
		    LCD_CH_LINE:	LUT_DATA	<=	9'h0C0;   //change line instruction
		    //	Line 2
		    LCD_LINE2+0:	LUT_DATA	<=	9'h17F;	//	
		    LCD_LINE2+1:	LUT_DATA	<=	9'h17F;//
		    LCD_LINE2+2:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+3:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+4:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+5:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+6:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+7:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+8:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+9:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+10:	LUT_DATA	<=	9'h120; //
		    LCD_LINE2+11:	LUT_DATA	<=	9'h120;//
		    LCD_LINE2+12:	LUT_DATA	<=	9'h130+password[15:12];//
		    LCD_LINE2+13:	LUT_DATA	<=	9'h130+password[11:8];//
		    LCD_LINE2+14:	LUT_DATA	<=	9'h130+password[7:4];//
		    LCD_LINE2+15:	LUT_DATA	<=	9'h130+password[3:0];//
		    default:		LUT_DATA	<=	9'h000;//
		    endcase
       end



 
   5'b00100:
   
     begin
    LEDR[try_count]='b1;
	case(LUT_INDEX)
	//	Initial
	LCD_INTIAL+0:	LUT_DATA	<=	9'h038;		//Function Set:
																				/*9'h038=9'b0_0011_1000:
																					位4:1,显示数据长度为:8 bit;
																					位3:1,显示2行
																					位2:0,显示点阵为5*8
																					位1、位0:无关位*/
	LCD_INTIAL+1:	LUT_DATA	<=	9'h00C;		//Display ON/OFF Control
																				/*9'h00C=9'b0_0000_1100:
																					位2:1,打开显示
																					位1:1,显示光标
																					位0:0,光标不闪烁*/
	LCD_INTIAL+2:	LUT_DATA	<=	9'h001;		//Clear Display
	LCD_INTIAL+3:	LUT_DATA	<=	9'h006;		//Entry Mode Set
																				/*9'h006=9'b0_0000_0110:
																					TOTEST*/
	LCD_INTIAL+4:	LUT_DATA	<=	9'h080;		//Set DDRAM Address
																				/*设置DDRAM 的地址:AC(address counter)=0*/
	//	Line 1   //	Welcome!
	LCD_LINE1+0:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+1:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+2:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+3:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+4:	LUT_DATA	<=	9'h157;   //W
	LCD_LINE1+5:	LUT_DATA	<=	9'h165;   //e
	LCD_LINE1+6:	LUT_DATA	<=	9'h16C;   //l
	LCD_LINE1+7:	LUT_DATA	<=	9'h163;   //c
	LCD_LINE1+8:	LUT_DATA	<=	9'h16F;   //o
	LCD_LINE1+9:	LUT_DATA	<=	9'h16D;   //m
	LCD_LINE1+10:	LUT_DATA	<=	9'h165;   //e
	LCD_LINE1+11:	LUT_DATA	<=	9'h121;   //!
	LCD_LINE1+12:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+13:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+14:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+15:	LUT_DATA	<=	9'h120;   //" "
	//	Change Line
	LCD_CH_LINE:	LUT_DATA	<=	9'h0C0;   //change line instruction
	//	Line 2
	LCD_LINE2+0:	LUT_DATA	<=	9'h153;	//	S
	LCD_LINE2+1:	LUT_DATA	<=	9'h174;//t
	LCD_LINE2+2:	LUT_DATA	<=	9'h161;//a
	LCD_LINE2+3:	LUT_DATA	<=	9'h174;//t
	LCD_LINE2+4:	LUT_DATA	<=	9'h165;//e
	LCD_LINE2+5:	LUT_DATA	<=	9'h13A;//:
	LCD_LINE2+6:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+7:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+8:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+9:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+10:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+11:	LUT_DATA	<=	9'h157;//W
	LCD_LINE2+12:	LUT_DATA	<=	9'h152;//R
	LCD_LINE2+13:	LUT_DATA	<=	9'h14F;//O
	LCD_LINE2+14:	LUT_DATA	<=	9'h14E;//N
	LCD_LINE2+15:	LUT_DATA	<=	9'h147;//G
	default:		LUT_DATA	<=	9'h000;//
	endcase
    end

   
   5'b01000:
      begin

   LEDR[17:0]<=18'b111111111111111111;
	case(LUT_INDEX)
	//	Initial
	LCD_INTIAL+0:	LUT_DATA	<=	9'h038;		//Function Set:
																				/*9'h038=9'b0_0011_1000:
																					位4:1,显示数据长度为:8 bit;
																					位3:1,显示2行
																					位2:0,显示点阵为5*8
																					位1、位0:无关位*/
	LCD_INTIAL+1:	LUT_DATA	<=	9'h00C;		//Display ON/OFF Control
																				/*9'h00C=9'b0_0000_1100:
																					位2:1,打开显示
																					位1:1,显示光标
																					位0:0,光标不闪烁*/
	LCD_INTIAL+2:	LUT_DATA	<=	9'h001;		//Clear Display
	LCD_INTIAL+3:	LUT_DATA	<=	9'h006;		//Entry Mode Set
																				/*9'h006=9'b0_0000_0110:
																					TOTEST*/
	LCD_INTIAL+4:	LUT_DATA	<=	9'h080;		//Set DDRAM Address
																				/*设置DDRAM 的地址:AC(address counter)=0*/
	//	Line 1   //	Welcome!
	LCD_LINE1+0:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+1:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+2:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+3:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+4:	LUT_DATA	<=	9'h157;   //W
	LCD_LINE1+5:	LUT_DATA	<=	9'h165;   //e
	LCD_LINE1+6:	LUT_DATA	<=	9'h16C;   //l
	LCD_LINE1+7:	LUT_DATA	<=	9'h163;   //c
	LCD_LINE1+8:	LUT_DATA	<=	9'h16F;   //o
	LCD_LINE1+9:	LUT_DATA	<=	9'h16D;   //m
	LCD_LINE1+10:	LUT_DATA	<=	9'h165;   //e
	LCD_LINE1+11:	LUT_DATA	<=	9'h121;   //!
	LCD_LINE1+12:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+13:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+14:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+15:	LUT_DATA	<=	9'h120;   //" "
	//	Change Line
	LCD_CH_LINE:	LUT_DATA	<=	9'h0C0;   //change line instruction
	//	Line 2
	LCD_LINE2+0:	LUT_DATA	<=	9'h153;	//	S
	LCD_LINE2+1:	LUT_DATA	<=	9'h174;//t
	LCD_LINE2+2:	LUT_DATA	<=	9'h161;//a
	LCD_LINE2+3:	LUT_DATA	<=	9'h174;//t
	LCD_LINE2+4:	LUT_DATA	<=	9'h165;//e
	LCD_LINE2+5:	LUT_DATA	<=	9'h13A;//:
	LCD_LINE2+6:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+7:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+8:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+9:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+10:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+11:	LUT_DATA	<=	9'h141;//a
	LCD_LINE2+12:	LUT_DATA	<=	9'h14C;//l
	LCD_LINE2+13:	LUT_DATA	<=	9'h141;//a
	LCD_LINE2+14:	LUT_DATA	<=	9'h152;//r
	LCD_LINE2+15:	LUT_DATA	<=	9'h14D;//m
	default:		LUT_DATA	<=	9'h000;//
	endcase
end
   
   
   5'b10000:

    begin

    LEDG[7:0]<=8'b11111111;
	case(LUT_INDEX)
	//	Initial
	LCD_INTIAL+0:	LUT_DATA	<=	9'h038;		//Function Set:
																				/*9'h038=9'b0_0011_1000:
																					位4:1,显示数据长度为:8 bit;
																					位3:1,显示2行
																					位2:0,显示点阵为5*8
																					位1、位0:无关位*/
	LCD_INTIAL+1:	LUT_DATA	<=	9'h00C;		//Display ON/OFF Control
																				/*9'h00C=9'b0_0000_1100:
																					位2:1,打开显示
																					位1:1,显示光标
																					位0:0,光标不闪烁*/
	LCD_INTIAL+2:	LUT_DATA	<=	9'h001;		//Clear Display
	LCD_INTIAL+3:	LUT_DATA	<=	9'h006;		//Entry Mode Set
																				/*9'h006=9'b0_0000_0110:
																					TOTEST*/
	LCD_INTIAL+4:	LUT_DATA	<=	9'h080;		//Set DDRAM Address
																				/*设置DDRAM 的地址:AC(address counter)=0*/
	//	Line 1   //	Welcome!
	LCD_LINE1+0:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+1:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+2:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+3:	LUT_DATA	<=	9'h120;	   //" " blank
	LCD_LINE1+4:	LUT_DATA	<=	9'h157;   //W
	LCD_LINE1+5:	LUT_DATA	<=	9'h165;   //e
	LCD_LINE1+6:	LUT_DATA	<=	9'h16C;   //l
	LCD_LINE1+7:	LUT_DATA	<=	9'h163;   //c
	LCD_LINE1+8:	LUT_DATA	<=	9'h16F;   //o
	LCD_LINE1+9:	LUT_DATA	<=	9'h16D;   //m
	LCD_LINE1+10:	LUT_DATA	<=	9'h165;   //e
	LCD_LINE1+11:	LUT_DATA	<=	9'h121;   //!
	LCD_LINE1+12:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+13:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+14:	LUT_DATA	<=	9'h120;   //" "
	LCD_LINE1+15:	LUT_DATA	<=	9'h120;   //" "
	//	Change Line
	LCD_CH_LINE:	LUT_DATA	<=	9'h0C0;   //change line instruction
	//	Line 2
	LCD_LINE2+0:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+1:	LUT_DATA	<=	9'h153;//S
	LCD_LINE2+2:	LUT_DATA	<=	9'h159;//Y
	LCD_LINE2+3:	LUT_DATA	<=	9'h153;	//	S
	LCD_LINE2+4:	LUT_DATA	<=	9'h154;//T
	LCD_LINE2+5:	LUT_DATA	<=	9'h145;//E
	LCD_LINE2+6:	LUT_DATA	<=	9'h14D;//M
	LCD_LINE2+7:	LUT_DATA	<=	9'h120;// 
	LCD_LINE2+8:	LUT_DATA	<=	9'h14C;//L
	LCD_LINE2+9:	LUT_DATA	<=	9'h14F;//O
	LCD_LINE2+10:	LUT_DATA	<=	9'h143;//C
	LCD_LINE2+11:	LUT_DATA	<=	9'h120;//
	LCD_LINE2+12:	LUT_DATA	<=	9'h14F;//O
	LCD_LINE2+13:	LUT_DATA	<=	9'h150;//P
	LCD_LINE2+14:	LUT_DATA	<=	9'h145;//E
	LCD_LINE2+15:	LUT_DATA	<=	9'h14E;//N
	default:		LUT_DATA	<=	9'h000;//
	endcase
   end


endcase
end




LCD_Controller 		u0	(	//	Host Side
							.iDATA(mLCD_DATA),
							.iRS(mLCD_RS),
							.iStart(mLCD_Start),
							.oDone(mLCD_Done),
							.iCLK(iCLK),
							.iRST_N(iRST_N),
							//	LCD Interface
							.LCD_DATA(LCD_DATA),
							.LCD_RW(LCD_RW),
							.LCD_EN(LCD_EN),
							.LCD_RS(LCD_RS)	);

endmodule

⌨️ 快捷键说明

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