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

📄 复件 lcd_init(带TPrd05).v

📁 液晶显示驱动源程序代码
💻 V
📖 第 1 页 / 共 3 页
字号:
sw4_out1_reg<=1'b0; //如果符合条件,则输出低电平
else if(count1_4==21'h1312D0) //判断低电平信号是否符合输出条件
sw4_out1_reg<=1'b1; //如果符合条件,则输出高电平
else sw4_out1_reg<=sw4_out1_reg;
end



always @(negedge  sw4_out or negedge reset )
begin
	if (!reset)
	   pic_num3<=0;
    else 
     if(!sw4_out)
				begin
				if(pic_num3==10)
					pic_num3<=0;
					else
					pic_num3<=pic_num3+1;
				end
end


always @(negedge  sw1_out or negedge reset )
begin
	if (!reset)
	   pic_num2<=0;
    else 
     if(!sw1_out)
				begin
				if(pic_num2==10)
					pic_num2<=0;
					else
					pic_num2<=pic_num2+1;
				end
end

reg [4:0] pic_tmp;	
always @(negedge clock or negedge reset)
	if (! reset)
	pic_num<=1;
	else
	begin
		pic_tmp<=(12+pic_num2-pic_num3);
		if(pic_tmp>=12)
		pic_num<=pic_tmp-11;
		else
		pic_num<=pic_tmp;
	end				


inout sdao;
output sclo;

reg tempen_sdao;

reg tempsda;
reg tempscl;


reg sclo;
reg send_byte_clk;
reg [8:0] send_byte_num;

reg [5:0] send_byte_zt;
reg [3:0] delay_counter;


reg sdao;

reg [8:0] shiftdata;



//时钟分频 //send_byte_clk  100kHz<-25MHz
reg [7:0] send_byte_clk_count;
always @(posedge clock or negedge reset)
if(!reset)
	begin
	send_byte_clk_count<=0;
	send_byte_clk<=1;
	end
else
begin
	if(send_byte_clk_count<100)
		send_byte_clk_count<=send_byte_clk_count+1;
	else 
	 begin
        send_byte_clk_count<=0;
        send_byte_clk<=~send_byte_clk;
	end
	
end



parameter  
			start=6'd1,
			delay1=6'd2,
			sendbit1=6'd3,
			delay2=6'd4,
			sendAddress=6'd5,
			delay3=6'd6,
			sendbit2=6'd7,
			delay4=6'd8,
			sendbit3=6'd9,
			ForACK1=6'd10, 
			delay_ACK=6'd11,
			AckYESNO=6'd12,
			delay5=6'd13,
			
			sendData1=6'd14,
			delay1_2=6'd15,
			sendbit1_2=6'd16,
			delay2_2=6'd17,
			sendbit2_2=6'd18,
			ForACK1_2=6'd19,
			delay_ACK_2=6'd20,
			AckYESNO_2=6'd21,
			delay3_2=6'd22,
			
			sendData2=6'd23,
			delay1_3=6'd24,
			sendbit1_3=6'd25,
			delay2_3=6'd26,
			sendbit2_3=6'd27,
			ForACK1_3=6'd28,
			delay_ACK_3=6'd29,
			AckYESNO_3=6'd30,
			delay3_3=6'd31,
			Stop=6'd32,
			Finish_delay=6'd33,
			Finish=6'd34;
				
always@(posedge send_byte_clk or negedge reset)
if(! reset)
begin
sclo=1;
tempsda=1;
send_byte_num=0;
tempen_sdao=1;
send_byte_zt=start;
AddressByte_wq=8'b0;
 DataByte1_wq=8'b0;
sdao=1;
delay_counter=0;
end
else if
( AddressByte!=AddressByte_wq ||
  DataByte1!=DataByte1_wq   

         )
begin
	case(send_byte_zt)
		
		start:
			begin
				if(delay_counter>=4)
					begin
						tempsda=0;
						sdao=0;
						send_byte_zt=delay1;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						sdao=1;
						tempscl=1;
						sclo=1;
					end
				
			
			end
		delay1: //延时三个周期
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=sendbit1;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end	
		sendbit1:
			begin
				tempscl=0; //SCL置零
				sclo=0;
				send_byte_zt=delay2;
			end
		delay2: //延时三个周期
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=sendAddress;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end	
		sendAddress:
			begin
				if(send_byte_num==0)
					begin
						shiftdata[7:0]=AddressByte[7:0];
					end
				shiftdata=shiftdata<<1;
				sdao=shiftdata[8];
				//置SCL为高电平
				send_byte_zt=delay3;
				send_byte_num=send_byte_num+1;
			end
		delay3: //延时三个周期
			begin
				if(delay_counter>=6)
					begin
						send_byte_zt=sendbit2;
						delay_counter=0;
					end
				else if(delay_counter==3)
						begin
						delay_counter=delay_counter+1;
						sclo=1;
						end
				else	begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					
						end
			end
		sendbit2:
			begin
				sclo=0;//SCL置零
				send_byte_zt=delay4;
			end
		delay4: //延时三个周期
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=sendbit3;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end
		sendbit3: //判断是否字节中所有位都发送完毕
			begin
				if(send_byte_num<8)
					begin
						send_byte_zt=sendAddress;
					end
				else
					begin
						send_byte_zt=ForACK1;
						send_byte_num=0;
					end
			end
		ForACK1:
				begin
					sdao=1'bz;
					send_byte_zt=delay_ACK;
				end

		delay_ACK: //延时
			begin
				if(delay_counter>=6)
					begin
						send_byte_zt=AckYESNO;
						delay_counter=0;
					end
			else		if(delay_counter==3)
					begin
						delay_counter=delay_counter+1;
						sclo=1;
						end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						tempscl=1;
						
					end
			end
		AckYESNO:
			begin
			if(sdao==1)
					begin
						send_byte_zt=delay3_3;
						tempen_sdao=1;	//置输出
						tempscl=0;
				
					end
			else
					begin
						tempscl=0; //终止应答位
						send_byte_zt=delay5;
						tempen_sdao=1;//置输出
					end
			end
		delay5: //延时三个周期
			begin
				if(delay_counter>=6)
					begin
					 if(AddressByte[0]==0)
						begin
						send_byte_zt=sendData1;
						delay_counter=0;
						end
					else
						begin
						send_byte_zt=delay1_2;
						delay_counter=0;
						sdao=1'bz;
						end
					end
				else if(delay_counter==3)
				     begin
					delay_counter=delay_counter+1;
					sclo=0;
					 end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end	
		sendData1:
			if(AddressByte[0]==0)
			begin
				if(send_byte_num==0)
					shiftdata[7:0]=DataByte1[7:0];
				shiftdata=shiftdata<<1;
				sdao=shiftdata[8];
				send_byte_zt=delay1_2;
				send_byte_num=send_byte_num+1;
			end
			else
			begin
				shiftdata=shiftdata<<1;
				shiftdata[0]=sdao;
				
				send_byte_zt=sendbit1_2;
				send_byte_num=send_byte_num+1;
			end
			
		delay1_2: //延时三个周期
			begin
				if(delay_counter>=6)
					begin
					 if(AddressByte[0]==0)
						begin
						send_byte_zt=sendbit1_2;
						delay_counter=0;
						end
					else
					begin
						send_byte_zt=sendData1;
						delay_counter=0;
					end
					
					end
				else if (delay_counter==3)
						begin
						delay_counter=delay_counter+1;
						sclo=1;
						end
				
				else	begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						tempscl=1; //***************************置SCL为高电平
						
					end
			end
		sendbit1_2:
			begin
				tempscl=0; //************************SCL置零
				sclo=0;
				send_byte_zt=delay2_2;
			end
		delay2_2: //延时三个周期
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=sendbit2_2;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end
		sendbit2_2: //判断是否字节中所有位都发送完毕
			begin
				if(send_byte_num<8)
					begin
						if(AddressByte[0]==0)
						send_byte_zt=sendData1;
						else
					
						send_byte_zt=delay1_2;
					end
				else
				begin
				if(AddressByte[0]==0)
					begin
						send_byte_zt=ForACK1_2;
						send_byte_num=0;
						
					end
					else
					begin
					send_byte_zt=ForACK1_2;
						send_byte_num=0;
						DataByte1_rd[7:0]=shiftdata[7:0];
					end
				end
			end
		ForACK1_2:
		    if(AddressByte[0]==0)	//..........................write
				begin
			
				   sdao=1'bz;	
				 
		
					send_byte_zt=delay_ACK_2;
				end
			else       //........................................read
				begin
					
					sdao=0;//应答信号
					send_byte_zt=delay_ACK_2;
					
				
				end
		delay_ACK_2: //延时
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=AckYESNO_2;
						delay_counter=0;	
						
					end
				
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						
					end
			end

		AckYESNO_2:
			begin
				if(AddressByte[0]==0)
					begin
						begin
								sclo=1;
								send_byte_zt=delay3_3;//------------------跳转至stop
								tempen_sdao=1;//置输出
							end
					end	
				else
					begin
						
						sclo=1;
						send_byte_zt=delay3_2;
					end
			end
	
		delay3_2: //延时三个周期
			begin
				if(delay_counter>=6)
					begin
						send_byte_zt=delay1_3;
						delay_counter=0;
						sdao=1'bz;
					end
				else if(delay_counter==3)
					begin
						sclo=0;
						delay_counter=delay_counter+1;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end	
		delay1_3: //延时三个周期
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=sendData2;
						delay_counter=0;
						sclo=1;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						
					end
			end
		sendData2:
			begin
				shiftdata=shiftdata<<1;
				shiftdata[0]=sdao;
				send_byte_zt=sendbit1_3;
				send_byte_num=send_byte_num+1;
			end
		
		sendbit1_3:
			begin
				tempscl=0; //************************SCL置零
				sclo=0;
				send_byte_zt=delay2_3;
			end
		delay2_3: //延时三个周期
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=sendbit2_3;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
					end
			end
		sendbit2_3: //判断是否字节中所有位都发送完毕
			begin
				if(send_byte_num<8)
					begin
						send_byte_zt=delay1_3;
					end
				
				else
					begin
					if(AddressByte[0]==0)
						begin
							send_byte_zt=ForACK1_3;
							send_byte_num=0;
							
						end
					else
						begin
						send_byte_zt=ForACK1_3;
							send_byte_num=0;
							DataByte2_rd[7:0]=shiftdata[7:0];
						end
					end
			end
		ForACK1_3:
		    begin
					
					//sdao=1;//应答信号
					send_byte_zt=delay_ACK_3;
					tempscl=1; //***************************置SCL为高电
			end
		delay_ACK_3: //延时
			begin
				if(delay_counter>=6)
					begin
						send_byte_zt=AckYESNO_3;
						delay_counter=0;
					end
				else if(delay_counter==3)
					begin
						delay_counter=delay_counter+1;
						sclo=1;
					end
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						tempscl=1;
						sclo=1;
					end
			end
		AckYESNO_3:
			begin
						tempscl=0; //************************置SCL为低电平
						sclo=0;
						send_byte_zt=delay3_3;
						tempsda=0;
						
			end	
		delay3_3: //延时三个周期
			begin
				if(delay_counter>=9)
					begin
						send_byte_zt=Stop;
						delay_counter=0;
					end
				else if(delay_counter==6)
						begin
						delay_counter=delay_counter+1;
						sdao=0;
						end
				else if(delay_counter==3)
					begin
						delay_counter=delay_counter+1;
						sclo=0;
						end
				else	begin
						delay_counter=delay_counter+1;
						send_byte_zt=send_byte_zt;
						//sdao=0;
					end
			end		
		Stop:
			begin
				sclo=1; //***************************置SCL为高电
				send_byte_zt=Finish_delay;
			end
				
		Finish_delay: //延时
			begin
				if(delay_counter>=2)
					begin
						send_byte_zt=Finish;
						delay_counter=0;
					end
				else
					begin
						delay_counter=delay_counter+1;
						send_byte_zt=Finish_delay;
					end
			end
		Finish:
			begin
				tempsda=1;
				sdao=1;
				send_byte_zt=start;
				send_byte_num=0;
				AddressByte_wq=AddressByte;
				DataByte1_wq=DataByte1;
			end
		default:
			begin
				send_byte_zt=start;
				send_byte_num=0;
			end
	endcase
end


						
endmodule

⌨️ 快捷键说明

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