本次实验目的:在指定的EPPROM地址中,写入一数据,延时100MS后,在从该地址中读取,并在LCD上显示。

该实验在前两天就开始做了,一开始并没有成功,读出的一直0x00,当时也调了一会,但跳回到PS2鼠标实验继续调试(因为晚上睡觉会一直想那个问题),当把PS2鼠标实验调通之后,感觉自己对时序图有进一步的好感,写状态机时,我能抓住每一个动作细节,这就是经验吧,然后今天晚上调试I2C实验,直接对着时序图一步一步检查状态机的变动,经过仔细的检查,确实发现不少问题,当场就改掉,检查完一遍后(仅检查了一遍),改完后立即编译下载到板子上验证,结果很OK。此时我非常高兴,PS2鼠标实验花了那么长的时间去调试,是值得的。

由于主板子上没有EPPROM,故在外面用飞线接了一个AT24C02B器件,如下图。

在写代码前,建议先看看特权视频,有了一定的了解后,在去仔细的去琢磨I2C的时序。

1、首先得知道起始和停止在什么时候产生,

2、主机到设备发送数据时,是在时钟为低时改变数据,每发完一组数据,设备都会产生应答位。

3、主机从设备中读取数据时,是在时钟为高时进行锁存,因为在时钟高电平期间,SDA上的数据是稳定的,如果是连续读,每读完一组数据,主机一般要给设备发送应答位,读到最后一组数据时,主机可以不发送应答位,直接发送停止信号作为结束。

代码实现:

i2c_epprom.v

 // 给EPPROM 写数据,延时100ms后读出该数据
////////////////////////////////////////////////////////////////////////////////
`timescale ns/ ps
module i2c_epprom(
//input
sys_clk,
rst_n, //output
scl,
sda, //inout
dis_data_low,
dis_data_hig
); input sys_clk; // 50MHz
input rst_n; //复位信号,低有效
output scl; // 24C02的时钟端口
inout sda; // 24C02的数据端口
output [:] dis_data_low; //LCD显示的数据
output [:] dis_data_hig;
/**************************************************************/
parameter T100MS = 'd4_999_999;
parameter IDLE = 'd0;
parameter START1 = 'd1;
parameter ADD1 = 'd2;
parameter ACK1 = 'd3;
parameter ADD2 = 'd4;
parameter ACK2 = 'd5;
parameter WR_DATA = 'd6;
parameter ACK2_1 = 'd7;
parameter STOP1 = 'd8;
parameter DELAY = 'd9;
parameter START2 = 'd10;
parameter ADD3 = 'd11;
parameter ACK3 = 'd12;
parameter RD_DATA = 'd13;
parameter ACK4 = 'd14;
parameter STOP2 = 'd15;
parameter OVER = 'd16;
/**************************************************************/
//100ms计数
reg [:] cnt1;
reg cnt_en;
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n)
cnt1 <= 'd0;
else if((!cnt_en) || (cnt1 == T100MS))
cnt1 <= 'd0;
else
cnt1 <= cnt1+'b1;
/**************************************************************/
//分频部分
// cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间
reg[:] cnt;
reg[:] cnt_delay; //500循环计数,产生iic所需要的时钟
reg scl_r; //时钟脉冲寄存器
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n)
cnt_delay <= 'd0;
else if(cnt_delay == 'd499)
cnt_delay <= 'd0; //计数到10us为scl的周期,即100KHz
else
cnt_delay <= cnt_delay + 'b1; //时钟计数
/**************************************************************/
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n)
cnt <= 'd5;
else begin
case (cnt_delay)
'd0 : cnt <= 3'd0; //cnt=0:scl上升沿
'd124 : cnt <= 3'd1; //cnt=1:scl高电平中间,用于数据采样
'd249 : cnt <= 3'd2; //cnt=2:scl下降沿
'd374 : cnt <= 3'd3; //cnt=3:scl低电平中间,用于数据变化
// 9'd499 : cnt <= 3'd0; //cnt=0:scl上升沿
default : cnt <= 'd5;
endcase
end /**************************************************************/
`define SCL_POS (cnt == 'd0) //cnt=0:scl上升沿
`define SCL_HIG (cnt == 'd1) //cnt=1:scl高电平中间,用于数据采样
`define SCL_NEG (cnt == 'd2) //cnt=2:scl下降沿
`define SCL_LOW (cnt == 'd3) //cnt=3:scl低电平中间,用于数据变化
/**************************************************************/
`define DEVICE_READ 'b1010_0001 //被寻址器件地址(读操作)a1
`define DEVICE_WRITE 'b1010_0000 //被寻址器件地址(写操作)a0
`define WRITE_DATA 'hc8 //写入EEPROM的数据
`define BYTE_ADDR 'h03 //写入/读出EEPROM的地址寄存器
/**************************************************************/
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n)
scl_r <= 'b0;
else if(cnt_delay == 'd0/*cnt==3'd0*/)
scl_r <= 'b1; //scl信号上升沿
else if(cnt_delay == 'd249/*cnt==3'd2*/)
scl_r <= 'b0; //scl信号下降沿 assign scl = scl_r; //产生iic所需要的时钟
/**************************************************************/
reg [:] db_r; //在IIC上传送的数据寄存器
reg [:] read_data; //读出EEPROM的数据寄存器
reg [:] cstate; //状态寄存器
reg [:] num;
reg sda_r; //输出数据寄存器
reg sda_link; //输出数据sda信号inout方向控制位
reg rd_flag; //读操作标志
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n) begin
cstate <= IDLE;
sda_r <= 'b1;
sda_link <= 'b0;
num <= 'd0;
rd_flag <= 'b0;
read_data <= 'b0000_0000;
cnt_en <= 'b0;
end
else begin
case (cstate)
IDLE:
begin
sda_link <= 'b1; //数据线sda为输出
sda_r <= 'b1;
cstate <= START1;
db_r <= `DEVICE_WRITE; //送器件地址(写操作)
end START1:
begin
if(`SCL_HIG) begin //scl为高电平期间
num <= 'd0; //num计数清零
sda_link <= 'b1; //数据线sda为output
sda_r <= 'b0; //拉低数据线sda,产生起始位信号
cstate <= ADD1;
end
else
cstate <= START1; //等待scl高电平中间位置到来
end ADD1:
begin //给EPPROM送入器件地址
if(`SCL_LOW) begin
if(num == 'd8) begin
num <= 'd0; //num计数清零
sda_r <= 'b1;
sda_link <= 'b0; //sda置为高阻态(input)
cstate <= ACK1;
end
else begin
sda_link <= 'b1;
num <= num+'b1;
case (num)
'd0 : sda_r <= db_r[7];
'd1 : sda_r <= db_r[6];
'd2 : sda_r <= db_r[5];
'd3 : sda_r <= db_r[4];
'd4 : sda_r <= db_r[3];
'd5 : sda_r <= db_r[2];
'd6 : sda_r <= db_r[1];
'd7 : sda_r <= db_r[0];
default : ;
endcase
cstate <= ADD1;
end
end
else
cstate <= ADD1;
end
ACK1:
begin
if(`SCL_NEG) begin //注:24C01/02/04/08/16器件可以不考虑应答位
db_r <= `BYTE_ADDR; // 1地址
cstate <= ADD2; //从机响应信号
end
else
cstate <= ACK1; //等待从机响应
end ADD2:
begin //给EPPROM送入存储地址
if(`SCL_LOW) begin
if(num=='d8) begin
num <= 'd0; //num计数清零
sda_r <= 'b1;
sda_link <= 'b0; //sda置为高阻态(input)
cstate <= ACK2;
end
else begin
sda_link <= 'b1; //sda作为output
num <= num+'b1;
case (num)
'd0 : sda_r <= db_r[7];
'd1 : sda_r <= db_r[6];
'd2 : sda_r <= db_r[5];
'd3 : sda_r <= db_r[4];
'd4 : sda_r <= db_r[3];
'd5 : sda_r <= db_r[2];
'd6 : sda_r <= db_r[1];
'd7 : sda_r <= db_r[0];
default : ;
endcase
cstate <= ADD2;
end
end
else
cstate <= ADD2;
end ACK2:
begin
if(`SCL_NEG) begin //从机响应信号
if(!rd_flag) begin
rd_flag <= 'b1; //标志下轮进入读状态
db_r <= `WRITE_DATA; //写入的数据
cstate <= WR_DATA; //写数据
end
else begin
rd_flag <= 'b0;
cstate <= START2;
end
end
else
cstate <= ACK2; //等待从机响应
end WR_DATA:
begin
if(num<='d7) begin
if(`SCL_LOW) begin
sda_link <= 'b1; //sda作为output
num <= num+'b1;
case (num)
'd0 : sda_r <= db_r[7];
'd1 : sda_r <= db_r[6];
'd2 : sda_r <= db_r[5];
'd3 : sda_r <= db_r[4];
'd4 : sda_r <= db_r[3];
'd5 : sda_r <= db_r[2];
'd6 : sda_r <= db_r[1];
'd7 : sda_r <= db_r[0];
default : ;
endcase
cstate <= WR_DATA;
end
end
else if((`SCL_LOW) && (num=='d8)) begin
num <= 'd0;
sda_r <= 'b1;
sda_link <= 'b0; //sda置为高阻态
cstate <= ACK2_1;
end
end ACK2_1:
begin
if(`SCL_NEG)
cstate <= STOP1;
else
cstate <= ACK2_1;
end STOP1:
begin
if(`SCL_LOW) begin
sda_link <= 'b1;
sda_r <= 'b0;
cstate <= STOP1;
end
else if(`SCL_HIG) begin
sda_link <= 'b1;
sda_r <= 'b1; //scl为高时,sda产生上升沿(结束信号)
cnt_en <= 'b1; //启动100MS计数器
cstate <= DELAY;
end
end DELAY: //延时100ms后在进行读
begin
if(cnt1 == T100MS) begin
cnt_en <= 'b0;
cstate <= IDLE;
end
else begin
sda_link <= 'b1;
sda_r <= 'b1;
cstate <= DELAY;
end
end START2:
begin //读操作起始位
if(`SCL_LOW) begin
sda_link <= 'b1; //sda作为output
sda_r <= 'b1; //拉高数据线sda
cstate <= START2;
end
else if(`SCL_HIG) begin //scl为高电平中间
num <= 'd0;
sda_link <= 'b1;
sda_r <= 'b0; //拉低数据线sda,产生起始位信号
db_r <= `DEVICE_READ; //准备读
cstate <= ADD3;
end
else
cstate <= START2;
end ADD3:
begin //送器件地址 读操作
if(`SCL_LOW) begin
if(num=='d8) begin
num <= 'd0; //num计数清零
sda_r <= 'b1;
sda_link <= 'b0; //sda置为高阻态(input)
cstate <= ACK3;
end
else begin
sda_link <= 'b1;
num <= num+'b1;
case (num)
'd0 : sda_r <= db_r[7];
'd1 : sda_r <= db_r[6];
'd2 : sda_r <= db_r[5];
'd3 : sda_r <= db_r[4];
'd4 : sda_r <= db_r[3];
'd5 : sda_r <= db_r[2];
'd6 : sda_r <= db_r[1];
'd7 : sda_r <= db_r[0];
default : ;
endcase
cstate <= ADD3;
end
end
else cstate <= ADD3;
end ACK3:
begin
if(`SCL_NEG)
cstate <= RD_DATA; //从机响应信号
else
cstate <= ACK3; //等待从机响应
end RD_DATA:
begin
if(num<='d7) begin
if(`SCL_HIG) begin
sda_link <= 'b0; // sda 作为输入管脚
num <= num+'b1;
case (num)
'd0 : read_data[7] <= sda;
'd1 : read_data[6] <= sda;
'd2 : read_data[5] <= sda;
'd3 : read_data[4] <= sda;
'd4 : read_data[3] <= sda;
'd5 : read_data[2] <= sda;
'd6 : read_data[1] <= sda;
'd7 : read_data[0] <= sda;
default : ;
endcase
cstate <= RD_DATA;
end
else
cstate <= RD_DATA;
end
else if((`SCL_LOW) && (num=='d8)) begin
num <= 'd0; //num计数清零
sda_link <= 'b1;
sda_r <= 'b0; //数据拉低,准备产生停止信号
cstate <= ACK4; //这里也可以直接跳到STOP2
end
else
cstate <= RD_DATA;
end ACK4: //主机发出应答为
begin
if(`SCL_NEG)
cstate <= STOP2;
else
cstate <= ACK4;
end STOP2:
begin
if(`SCL_HIG) begin
sda_link <= 'b1;
sda_r <= 'b1; //产生结束信号
cstate <= OVER;
end
else
cstate <= STOP2;
end OVER: cstate <= OVER; default: cstate <= IDLE; endcase
end
/**************************************************************/
//sda_link = 1, 作为输出
//sda_link = 0, 作为输入,FPGA内部得把该管脚设置为高祖太,可以接收高低电平
assign sda = sda_link ? sda_r:'bz;
/**************************************************************/
reg [:] dis_data_low;
always @(read_data[:])
case(read_data[:])
'h0: dis_data_low = "0";
'h1: dis_data_low = "1";
'h2: dis_data_low = "2";
'h3: dis_data_low = "3";
'h4: dis_data_low = "4";
'h5: dis_data_low = "5";
'h6: dis_data_low = "6";
'h7: dis_data_low = "7";
'h8: dis_data_low = "8";
'h9: dis_data_low = "9";
'ha: dis_data_low = "a";
'hb: dis_data_low = "b";
'hc: dis_data_low = "c";
'hd: dis_data_low = "d";
'he: dis_data_low = "e";
'hf: dis_data_low = "f";
endcase
/**************************************************************/
reg [:] dis_data_hig;
always @(read_data[:])
case(read_data[:])
'h0: dis_data_hig = "0";
'h1: dis_data_hig = "1";
'h2: dis_data_hig = "2";
'h3: dis_data_hig = "3";
'h4: dis_data_hig = "4";
'h5: dis_data_hig = "5";
'h6: dis_data_hig = "6";
'h7: dis_data_hig = "7";
'h8: dis_data_hig = "8";
'h9: dis_data_hig = "9";
'ha: dis_data_hig = "a";
'hb: dis_data_hig = "b";
'hc: dis_data_hig = "c";
'hd: dis_data_hig = "d";
'he: dis_data_hig = "e";
'hf: dis_data_hig = "f";
endcase
/**************************************************************/
endmodule

LCD12864.v

 module LCD12864(
//input
sys_clk,
rst_n,
dis_data_low,
dis_data_hig, //output
lcd_rs,
lcd_rw,
lcd_en,
lcd_data,
lcd_psb
);
input sys_clk;// 50MHZ
input rst_n;
input [:] dis_data_low;
input [:] dis_data_hig; output lcd_rs;//H:data L:command
output lcd_rw;//H:read module L:write module
output lcd_en;//H active
output [:] lcd_data;
output lcd_psb;//H:parallel module L:SPI module /***************************************************/
parameter T3MS = 'd149_999;
parameter IDLE = 'd0,
INIT_FUN_SET1 = 'd1,
INIT_FUN_SET2 = 'd2,
INIT_DISPLAY = 'd3,
INIT_CLEAR = 'd4,
INIT_DOT_SET = 'd5,
SET_DDRAM = 'd6,
WRITE_DATA0 = 'd7,
SET_DDRAM2 = 'd8,
WRITE_DATA1 = 'd9,
WRITE_DATA2 = 'd10,
WRITE_DATA3 = 'd11; /***************************************************/
//产生周期为6MS的lcd_clk给LCD
reg [:] cnt;
reg lcd_clk;
always @(posedge sys_clk or negedge rst_n)
if(!rst_n) begin
cnt <= 'd0;
lcd_clk <= 'b0;
end
else if(cnt == T3MS)begin
cnt <= 'd0;
lcd_clk <= ~lcd_clk;
end
else
cnt <= cnt + 'b1; /***************************************************/
reg lcd_rs;
reg [:] state;
always @(posedge lcd_clk or negedge rst_n)
if(!rst_n)
lcd_rs <= 'b0;
else if((state == WRITE_DATA0) || (state == WRITE_DATA1)
|| (state == WRITE_DATA2) || (state == WRITE_DATA3))
lcd_rs <= 'b1; //写数据模式
else
lcd_rs <= 'b0; //写命令模式
/***************************************************/
reg [:] lcd_data;
reg [:] dis_data;
reg [:] num;
reg en;
always @(posedge lcd_clk or negedge rst_n)
if(!rst_n) begin
state <= IDLE;
lcd_data <= 'h00;
en <= 'b1;
num <= 'd0;
end
else
case(state)
IDLE:
begin
state <= INIT_FUN_SET1;
lcd_data <= 'hzz;
en <= 'b1;
end INIT_FUN_SET1:
begin
lcd_data <= 'h30; //功能设定
state <= INIT_FUN_SET2;
end INIT_FUN_SET2:
begin
lcd_data <= 'h30; //功能设定
state <= INIT_DISPLAY;
end INIT_DISPLAY:
begin
lcd_data <= 'h0c; //显示设定
state <= INIT_CLEAR;
end INIT_CLEAR:
begin
lcd_data <= 'h01; //清屏
state <= INIT_DOT_SET;
end INIT_DOT_SET:
begin
lcd_data <= 'h06; //进入点设定
state <= SET_DDRAM;
end SET_DDRAM:
begin
lcd_data <= 'h91;//2 line
state <= WRITE_DATA0;
end WRITE_DATA0: ////I2C通信实验
begin
if(num == 'd11)
state <= SET_DDRAM2;
else begin
num <= num + 'b1;
lcd_data <= dis_data;
state <= WRITE_DATA0;
end
end SET_DDRAM2:
begin
lcd_data <= 'h89;//3 line
state <= WRITE_DATA1;
end WRITE_DATA1: //03地址值
begin
if(num == 'd20) begin
num <= 'd0;
state <= WRITE_DATA2;
end
else begin
num <= num + 'b1;
lcd_data <= dis_data;
state <= WRITE_DATA1;
end
end WRITE_DATA2: //高字节
begin
lcd_data <= dis_data_hig;
state <= WRITE_DATA3;
end WRITE_DATA3://低字节
begin
lcd_data <= dis_data_low;
state <= SET_DDRAM;
end /* STOP:
begin
en <= 1'b0;//显示完了,lcd_e就一直拉为低
state <= STOP;
end */ default: state <= IDLE;
endcase always @(posedge sys_clk or negedge rst_n)
if(!rst_n)
dis_data <= 'h00;
else
case(num)
//I2C通信实验%CD%A8%D0%C5%CA%B5%D1%E9
'd0 : dis_data <= "I";
'd1 : dis_data <= "2";
'd2 : dis_data <= "C";
'd3 : dis_data <= " ";//8'hcd;
'd4 : dis_data <= "E";//8'ha8;
'd5 : dis_data <= "P";//8'hd0;
'd6 : dis_data <= "P";//8'hc5;
'd7 : dis_data <= "R";//8'hca;
'd8 : dis_data <= "O";//8'hb5;
'd9 : dis_data <= "M";//8'hd1;
'd10 : dis_data <= " ";//8'he9;
//03地址值 %B5%D8%D6%B7
'd11 : dis_data <= "0";
'd12 : dis_data <= "3";
'd13 : dis_data <= 8'hb5;
'd14 : dis_data <= 8'hd8;
'd15 : dis_data <= 8'hd6;
'd16 : dis_data <= 8'hb7;
'd17 : dis_data <= 8'hd6;
'd18 : dis_data <= 8'hb5;
'd19 : dis_data <= " ";
default: dis_data <= 'h00;
endcase
/***************************************************/
assign lcd_rw = 'b0;//只有写模式
assign lcd_psb = 'b1;//并口模式
assign lcd_en = en ? lcd_clk : 'b0;
/***************************************************/
endmodule

i2c_top.v

 module i2c_top(
//input
sys_clk,
rst_n, //inout
sda, //output
scl,
lcd_rs,
lcd_rw,
lcd_en,
lcd_data,
// lcd_psb
);
input sys_clk; // 50MHz
input rst_n; //复位信号,低有效
output scl; // 24C02的时钟端口
inout sda; // 24C02的数据端口 output lcd_rs;//H:data L:command
output lcd_rw;//H:read module L:write module
output lcd_en;//H active
output [:] lcd_data;
//output lcd_psb;//H:parallel module L:SPI module
wire [:] dis_data_low;
wire [:] dis_data_hig; i2c_epprom u1(
//input
.sys_clk(sys_clk),
.rst_n(rst_n), //output
.scl(scl),
.sda(sda),
.dis_data_low(dis_data_low),
.dis_data_hig(dis_data_hig)
); LCD12864 u2(
//input
.sys_clk(sys_clk),
.rst_n(rst_n),
.dis_data_low(dis_data_low),
.dis_data_hig(dis_data_hig), //output
.lcd_rs(lcd_rs),
.lcd_rw(lcd_rw),
.lcd_en(lcd_en),
.lcd_data(lcd_data)
// .lcd_psb(lcd_psb)
);
endmodule

OK,先到这,明天在完善吧。。。。

基于I2C EPPRPM(AT24C02B) + LCD12864实验的更多相关文章

  1. PS2鼠标+LCD12864实验——终于OK 了

    抱着“不气馁.不放弃.誓不罢休.搞不定你我还能搞其他玩意吗”的心态,调试许久的PS2鼠标实验,终于在今天被我搞定了.发几张图显摆一下,嘿嘿...    左键按下+鼠标移动 右键按下+鼠标移动  中键按 ...

  2. 基于STM32F1 的BASIC解码实验 vb basic 液晶显示执行过程及结果

    基于STM32F1 的BASIC解码实验 1.basic程序以文件形式存储 2.程序文件存储在sd卡 3.解释结果显示在液晶屏上 主函数部分 int main(void){ u16 i,j; dela ...

  3. 基于ZYNQ 的UART中断实验之串口写数据到DDR3中

    1.参考 UG585 网络笔记 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验 3.实验目的 练习使用UART的中断实验,并将接收到的数据写入到DDR3中. 4.实验过程 建立工程,设 ...

  4. FPGA回忆记事(一):基于Nios II的LED实验

    实验一:基于Nios II的LED实验 一.    创建Quartus II工程 1.打开Quartus II环境.开始->程序->Altera->Quartus II 9.1. 2 ...

  5. 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验

    实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·L ...

  6. 【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验

    实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...

  7. 【iCore3 双核心板_FPGA】实验十七:基于I2C总线的ARM与FPGA通信实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1dFqddMp iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  8. 基于 Arduino 的 RFID 识别实验

    http://www.it165.net/embed/html/201512/3287.html 2015年12月04日(周五) 上午  博士的智能卡实验--RFID识别实验,基于51单片机: 我们的 ...

  9. I2C的读写操作实验

    [实验任务]   利用24C08断电以后存储的数据不消失的特点,可以做一个断电保护装置.首先利用单片机做一个0-99秒的自动计时器.然后随机关断电源,在 通电以后计时器接着断电前的状态继续计时. [实 ...

随机推荐

  1. hdu_3067_小t的游戏(脑洞)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3067 题意:中文,不解释 题解:一看就知道是要找规律的题,都是有循环节的,看代码. #include ...

  2. 用tomcat6自定义域名

    第一步:tomcat配置 修改server.xml文件 8080端口 更改为 80端口 并在<Host name="localhost"  appBase="web ...

  3. linux查看文件及文件夹的大小

    最近发现服务器的磁盘容量使用率超过了90%,所以有必要查看是哪个文件占用了太多的空间, 服务器系统:CentOS6.5 df -h #查看磁盘使用情况,步骤1 cd / #切换到根目录, 步骤2 du ...

  4. Qt之操作系统环境

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc90102uy9k.html Qt中操作系统环境,官方解释如下: QStringList QProcess::syst ...

  5. php中header函数参数的 Cache-control:private,no-cache,must-revalidate,max-age 使用方法

    网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为private.其作用根据 ...

  6. mongodb启动

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.MongoDB是一款分布式文档数据库,支持类似关型数据库的主从结构,文档以二进制J ...

  7. 打不开BT,一直重复的关闭开启。

    /bt-btif (25335): ...preload_wait_timeout (retried:0/max-retry:1)...D/bt_userial(25335): RX terminat ...

  8. 2.10 工具使用 after effects(图形视频处理软件)

    ................... ..................... 暂无 教程素材网 http://img.yipinsucai.com/

  9. 页面开发辅助类—HtmlHelper初步了解

    1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. ...

  10. UIView的layoutSubviews,initWithFrame,initWithCoder方法

    ****************************layoutSubviews************************************ layoutSubviews是UIView ...