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

📄 lcd.v

📁 用Verilog HDL 语言写的在LCD液晶上显示文字的源程序
💻 V
字号:
module lcd(clk,data,rst,rs,rw,en,cs1,cs2,test);
input clk,rst;
output [7:0] data;
output rs,rw,en,cs1,cs2;

output [3:0]test;
reg [3:0] test;

reg [7:0] data,xaddr,yaddr,xpage;
reg [7:0] rom1[31:0],rom2[31:0],rom3[31:0],rom4[31:0];
reg en,rs,rw,cs1,cs2;
reg [4:0]state;
parameter s1=1,   s2=2,    s3=3,    s4=4,
          s5=5,   s6=6,    s7=7,    s8=8,
          s9=9,  s10=10,   s11=11,  s12=12,
         s13=13,  s14=14,   s15=15, s16=16,
         s17=17,  s18=18,   s19=19;

reg [6:0] addr,addr1;
reg ison;
reg [2:0] count;

initial
begin
          rom1[0]=8'h08;rom1[1]=8'h08;rom1[2]=8'h08;rom1[3]=8'h88;    //"东",
          rom1[4]=8'h68;rom1[5]=8'h18;rom1[6]=8'h0f;rom1[7]=8'he8;
          rom1[8]=8'h08;rom1[9]=8'h08;rom1[10]=8'h08;rom1[11]=8'h88;
          rom1[12]=8'h08;rom1[13]=8'h0c;rom1[14]=8'h08;rom1[15]=8'h00;
          rom1[16]=8'h00;rom1[17]=8'h40;rom1[18]=8'h21;rom1[19]=8'h11;
          rom1[20]=8'h0d;rom1[21]=8'h41;rom1[22]=8'h81;rom1[23]=8'h7f;
          rom1[24]=8'h01;rom1[25]=8'h05;rom1[26]=8'h09;rom1[27]=8'h31;
          rom1[28]=8'h61;rom1[29]=8'h00;rom1[30]=8'h00;rom1[31]=8'h00;

          rom2[0]=8'h02;rom2[1]=8'hf2;rom2[2]=8'h12;rom2[3]=8'h12;    //"疆",
          rom2[4]=8'h12;rom2[5]=8'h3e;rom2[6]=8'h82;rom2[7]=8'hfa;
          rom2[8]=8'haa;rom2[9]=8'haa;rom2[10]=8'hfa;rom2[11]=8'haa;
          rom2[12]=8'haa;rom2[13]=8'hfb;rom2[14]=8'h82;rom2[15]=8'h00;
          rom2[16]=8'h20;rom2[17]=8'h25;rom2[18]=8'h1f;rom2[19]=8'h55;
          rom2[20]=8'h81;rom2[21]=8'h7f;rom2[22]=8'h80;rom2[23]=8'hbe;
          rom2[24]=8'haa;rom2[25]=8'haa;rom2[26]=8'hbe;rom2[27]=8'haa;
          rom2[28]=8'haa;rom2[29]=8'hbe;rom2[30]=8'h80;rom2[31]=8'h00;

          rom3[0]=8'h20;rom3[1]=8'h24;rom3[2]=8'h24;rom3[3]=8'ha4;    //"教",
          rom3[4]=8'hff;rom3[5]=8'ha4;rom3[6]=8'hb4;rom3[7]=8'hac;
          rom3[8]=8'h20;rom3[9]=8'h9f;rom3[10]=8'h10;rom3[11]=8'h10;
          rom3[12]=8'hf0;rom3[13]=8'h18;rom3[14]=8'h10;rom3[15]=8'h00;
          rom3[16]=8'h02;rom3[17]=8'h12;rom3[18]=8'h51;rom3[19]=8'h90;
          rom3[20]=8'h7e;rom3[21]=8'h0a;rom3[22]=8'h89;rom3[23]=8'h40;
          rom3[24]=8'h20;rom3[25]=8'h1b;rom3[26]=8'h04;rom3[27]=8'h1b;
          rom3[28]=8'h60;rom3[29]=8'hc0;rom3[30]=8'h40;rom3[31]=8'h00;

          rom4[0]=8'h80;rom4[1]=8'h40;rom4[2]=8'h20;rom4[3]=8'hf8;    //"仪",
          rom4[4]=8'h07;rom4[5]=8'h00;rom4[6]=8'h38;rom4[7]=8'hc0;
          rom4[8]=8'h02;rom4[9]=8'h04;rom4[10]=8'h0c;rom4[11]=8'h80;
          rom4[12]=8'h60;rom4[13]=8'h1c;rom4[14]=8'h00;rom4[15]=8'h00;
          rom4[16]=8'h00;rom4[17]=8'h00;rom4[18]=8'h00;rom4[19]=8'hff;
          rom4[20]=8'h80;rom4[21]=8'h40;rom4[22]=8'h20;rom4[23]=8'h10;
          rom4[24]=8'h0b;rom4[25]=8'h04;rom4[26]=8'h0a;rom4[27]=8'h11;
          rom4[28]=8'h60;rom4[29]=8'hc0;rom4[30]=8'h40;rom4[31]=8'h00;

end

always @(negedge rst)
begin
     if(!rst)
     begin
          rom1[0]=8'h08;rom1[1]=8'h08;rom1[2]=8'h08;rom1[3]=8'h88;    //"东",
          rom1[4]=8'h68;rom1[5]=8'h18;rom1[6]=8'h0f;rom1[7]=8'he8;
          rom1[8]=8'h08;rom1[9]=8'h08;rom1[10]=8'h08;rom1[11]=8'h88;
          rom1[12]=8'h08;rom1[13]=8'h0c;rom1[14]=8'h08;rom1[15]=8'h00;
          rom1[16]=8'h00;rom1[17]=8'h40;rom1[18]=8'h21;rom1[19]=8'h11;
          rom1[20]=8'h0d;rom1[21]=8'h41;rom1[22]=8'h81;rom1[23]=8'h7f;
          rom1[24]=8'h01;rom1[25]=8'h05;rom1[26]=8'h09;rom1[27]=8'h31;
          rom1[28]=8'h61;rom1[29]=8'h00;rom1[30]=8'h00;rom1[31]=8'h00;

          rom2[0]=8'h02;rom2[1]=8'hf2;rom2[2]=8'h12;rom2[3]=8'h12;    //"疆",
          rom2[4]=8'h12;rom2[5]=8'h3e;rom2[6]=8'h82;rom2[7]=8'hfa;
          rom2[8]=8'haa;rom2[9]=8'haa;rom2[10]=8'hfa;rom2[11]=8'haa;
          rom2[12]=8'haa;rom2[13]=8'hfb;rom2[14]=8'h82;rom2[15]=8'h00;
          rom2[16]=8'h20;rom2[17]=8'h25;rom2[18]=8'h1f;rom2[19]=8'h55;
          rom2[20]=8'h81;rom2[21]=8'h7f;rom2[22]=8'h80;rom2[23]=8'hbe;
          rom2[24]=8'haa;rom2[25]=8'haa;rom2[26]=8'hbe;rom2[27]=8'haa;
          rom2[28]=8'haa;rom2[29]=8'hbe;rom2[30]=8'h80;rom2[31]=8'h00;

          rom3[0]=8'h20;rom3[1]=8'h24;rom3[2]=8'h24;rom3[3]=8'ha4;    //"教",
          rom3[4]=8'hff;rom3[5]=8'ha4;rom3[6]=8'hb4;rom3[7]=8'hac;
          rom3[8]=8'h20;rom3[9]=8'h9f;rom3[10]=8'h10;rom3[11]=8'h10;
          rom3[12]=8'hf0;rom3[13]=8'h18;rom3[14]=8'h10;rom3[15]=8'h00;
          rom3[16]=8'h02;rom3[17]=8'h12;rom3[18]=8'h51;rom3[19]=8'h90;
          rom3[20]=8'h7e;rom3[21]=8'h0a;rom3[22]=8'h89;rom3[23]=8'h40;
          rom3[24]=8'h20;rom3[25]=8'h1b;rom3[26]=8'h04;rom3[27]=8'h1b;
          rom3[28]=8'h60;rom3[29]=8'hc0;rom3[30]=8'h40;rom3[31]=8'h00;

          rom4[0]=8'h80;rom4[1]=8'h40;rom4[2]=8'h20;rom4[3]=8'hf8;    //"仪",
          rom4[4]=8'h07;rom4[5]=8'h00;rom4[6]=8'h38;rom4[7]=8'hc0;
          rom4[8]=8'h02;rom4[9]=8'h04;rom4[10]=8'h0c;rom4[11]=8'h80;
          rom4[12]=8'h60;rom4[13]=8'h1c;rom4[14]=8'h00;rom4[15]=8'h00;
          rom4[16]=8'h00;rom4[17]=8'h00;rom4[18]=8'h00;rom4[19]=8'hff;
          rom4[20]=8'h80;rom4[21]=8'h40;rom4[22]=8'h20;rom4[23]=8'h10;
          rom4[24]=8'h0b;rom4[25]=8'h04;rom4[26]=8'h0a;rom4[27]=8'h11;
          rom4[28]=8'h60;rom4[29]=8'hc0;rom4[30]=8'h40;rom4[31]=8'h00;
     end
end

always @(posedge clk)
begin
      count=count+1;
     if(count==7)
        en=0;
     else
        en=1;
end

always @(negedge en)
begin
    if(!rst)
    begin
			cs1<=1;
			cs2<=0;
			if(cs1==1&& cs2==0)
			begin
			rs<=0;
			rw<=0;
			data<=8'b00111111;
			cs1<=0;
			cs2<=1;
			state<=s1;
			end
			else if(cs1==0&& cs2==1)
			begin
			rs<=0;
			rw<=0;
			data<=8'b00111111;
			cs1<=1;
			cs2<=0;
			state<=s1;
			end
			else
			begin
			cs1<=1;
			cs2<=0;
			end
		test<=7;
        xaddr=8'hb8;
        yaddr=8'h40;
        xpage=8'hb8;
    end
    else
    begin
       case(state)
			s1:begin
				cs1<=1;
				cs2<=0;
				rs<=0;
				rw<=0;
				xpage<=8'b10111000;
				data<=8'b11000000;
				state<=s2;
			   end
		   s2:begin
				addr1<=0;
				rs<=0;
				rw<=0;
				data<=xpage;
				state<=s3;
			  end
		    s3:begin
				rs<=0;
				rw<=0;
				data<=8'b01000000;
				state<=s4;
			   end
			s4:begin
				rs<=1;    //左半屏清零
				rw<=0;
				data<=8'b00000000;
				if(xpage>=8'b10111111)
				begin
					if(addr1>63)
					begin
						state<=s5;
						test[0]<=~test[0];
					end
					else
					begin
						addr1<=addr1+1;
						state<=s4;
                     end
				end
				else
				begin
					if(addr1>63)
					begin
						xpage<=xpage+1;
						state<=s2;
					end
					else
					begin
						addr1<=addr1+1;
						state<=s4;
					end
				end
				end
			s5:begin
				cs1<=0;
				cs2<=1;
				rs<=0;
				rw<=0;
				xpage<=8'b10111000;
				data<=8'b11000000;
				state<=s6;
				end
			 s6:begin
				addr1<=0;
				rs<=0;
				rw<=0;
				data<=xpage;
				state<=s7;
				end
			 s7:begin
				rs<=0;
				rw<=0;
				data<=8'b01000000;
				state<=s8;
				end
			 s8:begin             //右半屏清零
				rs<=1;
				rw<=0;
				data<=8'b00000000;
				if(xpage>=8'b10111111)
				begin
					if(addr1>63)
					begin
						state<=s9;
						test[1]<=~test[1];
					end
					else
					begin
						addr1<=addr1+1;
						state<=s8;
					end
				end
				else
				begin
					if(addr1>63)
					begin
						xpage<=xpage+1;
						state<=s6;
					end
					else
					begin
						addr1<=addr1+1;
						state<=s8;
					end
				end
				end
			s9:begin
				cs1<=1;
				cs2<=0;
				addr<=0;
				rs<=0;
				rw<=0;
				data<=8'b10111011;
				state<=s10;
				end
			s10:begin
				rs<=0;
				rw<=0;
				data<=8'b01010000;
				state<=s11;
				end
			s11:begin               //D
				rs<=1;
				rw<=0;
				data<=rom1[addr];
				if(addr>15)
				   state<=s12;
				else
				begin
				     addr<=addr+1;
				     state<=s11;
				end
	      /*          if(addr==0) 
					  data<=8'b10000001;
	                else if(addr==1) 
	                  data<=8'b11111111;
	                else if(addr==2) 
	                  data<=8'b10000001;
	                else if(addr==3) 
	                  data<=8'b10000001;
	                else if(addr==4) 
	                  data<=8'b01111110;
	                else if(addr==5) 
	                  data<=8'b00000000;
	        
					if(addr>5)
						state<=s12;
					else
					begin
						addr<=addr+1;
						state<=s11;
					end */
				end
			s12:begin
				addr<=0;
				rs<=0;
				rw<=0;
				data<=8'b01110000;
				state<=s13;
				end
			s13:begin                  //J
				rs<=1;
				rw<=0;
				data<=rom2[addr];
				if(addr>15)
				  state<=14;
				else
				begin
				     addr<=addr+1;
				     state<=s13;
				end
	/*				if(addr==0) 
					  data<=8'b10000001;
	                else if(addr==1) 
	                  data<=8'b10000001;
	                else if(addr==2)
	                  data<=8'b01000001;//8'b10000010;
	                else if(addr==3)
	                  data<=8'b00111111;//8'b11111100;
	                else if(addr==4)
	                  data<=8'b00000001;//8'b10000000;
	                else if(addr==5)
	                  data<=8'b00000000;
	                
					if(addr>=5)
						state<=s14;
					else
					begin
						addr<=addr+1;
						state<=s13;
					end     */
				end 
			s14:begin
//				cs1<=0;
//				cs2<=1;
                cs1<=1;
                cs2<=0;
				addr<=0;
				rs<=0;
				rw<=0;
				data<=8'b10111100;
				state<=s15;
				end
		    s15:begin
				rs<=0;
				rw<=0;
				data<=8'b01010000;
				state<=s16;
				test[3]<=1;
				end
			s16:begin                    //C
			    test[3]<=0;
				rs<=1;
				rw<=0;
				data<=rom1[16+addr];
				if(addr>31)
				   state<=s17;
				else
				begin
				    addr<=addr+1;
				    state<=s16;
				end
	/*				if(addr==0) 
					  data<=8'b01111110;
	                else if(addr==1) 
	                  data<=8'b10000001;
	                else if(addr==2) 
	                  data<=8'b10000001;
	                else if(addr==3) 
	                  data<=8'b10000001;
	                else if(addr==4) 
	                  data<=8'b11000010;//8'b01000011;
	                else if(addr==5) 
	                  data<=8'b00000000;

					if(addr>=5)
						state<=s17;
					else
					begin
						addr<=addr+1;
						state<=s16;
					end        */
				end
			  s17:begin
				addr<=0;
				rs<=0;
				rw<=0;
				data<=8'b01110000;
				state<=s18;
				end
			 s18:begin               //E
				rs<=1;
				rw<=0;
				data<=rom2[16+addr];
				if(addr>31)
				   state<=s19;
				else
				begin
				    addr<=addr+1;
				    state<=s18;
				end
	/*				if(addr==0) 
					  data<=8'b10000001;
	                else if(addr==1) 
	                  data<=8'b11111111;
	                else if(addr==2) 
	                  data<=8'b10010001;//8'b10001001;
	                else if(addr==3) 
	                  data<=8'b10111001;//8'b10011101;
	                else if(addr==4) 
	                  data<=8'b11000011;//8'b11000011;
	                else if(addr==5) 
	                  data<=8'b00000000;

					if(addr>=5)
						state<=s19;
					else
					begin
						addr<=addr+1;
						state<=s18;
					end     */
				end
			s19:begin state<=s9;end
       endcase
   end
end 

endmodule
/*
--"东", 
      x"08",x"08",x"08",x"88",x"68",x"18",x"0F",x"E8",
      x"08",x"08",x"08",x"88",x"08",x"0C",x"08",x"00",
      x"00",x"40",x"21",x"11",x"0D",x"41",x"81",x"7F",
      x"01",x"05",x"09",x"31",x"61",x"00",x"00",x"00");

--"疆", 
constant rom2:rom:=(
      x"02",x"F2",x"12",x"12",x"12",x"3E",x"82",x"FA",
      x"AA",x"AA",x"FA",x"AA",x"AA",x"FB",x"82",x"00",
      x"20",x"25",x"1F",x"55",x"81",x"7F",x"80",x"BE",
      x"AA",x"AA",x"BE",x"AA",x"AA",x"BE",x"80",x"00");

--"教", 
constant rom3:rom:=(
      x"20",x"24",x"24",x"A4",x"FF",x"A4",x"B4",x"AC",
      x"20",x"9F",x"10",x"10",x"F0",x"18",x"10",x"00",
      x"02",x"12",x"51",x"90",x"7E",x"0A",x"89",x"40",
      x"20",x"1B",x"04",x"1B",x"60",x"C0",x"40",x"00");

--"仪",
constant rom4:rom:=(
      x"80",x"40",x"20",x"F8",x"07",x"00",x"38",x"C0",
      x"02",x"04",x"0C",x"80",x"60",x"1C",x"00",x"00",
      x"00",x"00",x"00",x"FF",x"80",x"40",x"20",x"10",
      x"0B",x"04",x"0A",x"11",x"60",x"C0",x"40",x"00");
*/

⌨️ 快捷键说明

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