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

📄 lcd_init_0707.v

📁 液晶显示驱动源程序代码
💻 V
📖 第 1 页 / 共 4 页
字号:
	if(penirq==1'b0) 
		count0_p<=count0_p+1;
		else
		count0_p<=17'h00000;
end
end

always@(posedge clock or negedge reset)
begin
if(!reset) count1_p<=17'h000000;//对低电平计数
else 
begin
	if(penirq==1'b1) 
		count1_p<=count1_p+1;
		else
		count1_p<=21'h00000;
end
end

//输出
always@(posedge clock or negedge reset)
begin
if(!reset) penirq_out<=1'b1;
else if(count0_p==17'h1e848) //判断低电平信号是否符合输出条件
penirq_out<=1'b0; //如果符合条件,则输出低电平

else if(count1_p==17'h1e848) //判断低电平信号是否符合输出条件

penirq_out<=1'b1; //如果符合条件,则输出高电平
else penirq_out<=penirq_out;
end


reg [5:0]pic_num;	
wire sw1_out;
reg [20:0] count0;
reg [20:0] count1;
reg sw1_out1_reg;


assign sw1_out=sw1_out1_reg;
//对输入进行采样,计数

always@(posedge clock or negedge reset)
begin
if(!reset) count1<=21'h000000;
else if(sw1==1'b1) count1<=count1+1;//对高电平计数
else count1<=21'h000000;
end 


always@(posedge clock or negedge reset)
begin
if(!reset) count0<=21'h000000;
else if(sw1==1'b0) count0<=count0+1;//对低电平计数
else count0<=21'h000000;
end
//输出
always@(posedge clock or negedge reset)
begin
if(!reset) sw1_out1_reg<=1'b1;
else if(count0==21'h1312D0) //判断低电平信号是否符合输出条件//1250000 50ms
sw1_out1_reg<=1'b0; //如果符合条件,则输出低电平
else if(count1==21'h1312D0) //判断低电平信号是否符合输出条件
sw1_out1_reg<=1'b1; //如果符合条件,则输出高电平h1312D0
else sw1_out1_reg<=sw1_out1_reg;
end


wire sw4_out;
reg [4:0] pic_num2;
reg [4:0] pic_num3;
reg [20:0] count0_4;
reg [20:0] count1_4;
reg sw4_out1_reg;

assign sw4_out=sw4_out1_reg;
//对输入进行采样,计数


always@(posedge clock or negedge reset)
begin
if(!reset) count1_4<=21'h000000;
else if(sw4==1'b1) count1_4<=count1_4+1;//对高电平计数
else count1_4<=21'h000000;
end 


always@(posedge clock or negedge reset)
begin
if(!reset) count0_4<=21'h000000;//对低电平计数
else 
begin
	if(sw4==1'b0) 
		count0_4<=count0_4+1;
		else
		count0_4<=21'h00000;
end
end

//输出
always@(posedge clock or negedge reset)
begin
if(!reset) sw4_out1_reg<=1'b1;
else if(count0_4==21'h1312D0) //判断低电平信号是否符合输出条件
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 [5: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_num==10 && !penirq) pic_num<=11;
		if(pic_tmp>=12)
		pic_num<=pic_tmp-11;
		else
		pic_num<=pic_tmp;
	end				


inout sdao;
//output 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)
	//if(send_byte_clk_count<2)
		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;
 DataByte2_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
					//tempen_sdao=0;//置三态
					sdao=1'bz;
				//	sdao=0;
					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(tempsda) 
			if(sdao==1)
					begin
						//send_byte_zt=start;
						send_byte_zt=delay3_3;
						tempen_sdao=1;	//置输出
						tempscl=0;
				//		sclo=0;
						
					end
			else
					begin
						tempscl=0; //终止应答位
					//	sclo=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
			//	if(send_byte_num==0)
			//		shiftdata[7:0]=DataByte1[7:0];
				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
				//	tempen_sdao=0;
				   sdao=1'bz;	
				 //  sdao=0;
		    //			tempsda=1; //释放数据线,等待应答信号
		
					send_byte_zt=delay_ACK_2;
				end
			else       //........................................read
				begin
					
					sdao=0;//应答信号
					send_byte_zt=delay_ACK_2;
					 //***************************置SCL为高电
					//sclo=1;
				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
					//	if(tempsda) //如果应答信号sdai为1,NO_ACK
				/*	if(sdao)
							begin
								send_byte_zt=delay3_3;	//无应答,返回
								tempen_sdao=1;//置输出
								tempscl=0; 
								sclo=1;
							end
						else*/
						begin
							//	tempscl=0; 
								sclo=1;
								send_byte_zt=delay3_3;//------------------跳转至stop
								tempen_sdao=1;//置输出
							end
					end	
				else
					begin
						
						sclo=1;
						send_byte_zt=delay3_2;
					end
			end

⌨️ 快捷键说明

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