📄 lcd_init_0707.v
字号:
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 + -