📄 复件 lcd_init(带TPrd05).v
字号:
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 + -