基于I2C EPPRPM(AT24C02B) + LCD12864实验
本次实验目的:在指定的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实验的更多相关文章
- PS2鼠标+LCD12864实验——终于OK 了
抱着“不气馁.不放弃.誓不罢休.搞不定你我还能搞其他玩意吗”的心态,调试许久的PS2鼠标实验,终于在今天被我搞定了.发几张图显摆一下,嘿嘿... 左键按下+鼠标移动 右键按下+鼠标移动 中键按 ...
- 基于STM32F1 的BASIC解码实验 vb basic 液晶显示执行过程及结果
基于STM32F1 的BASIC解码实验 1.basic程序以文件形式存储 2.程序文件存储在sd卡 3.解释结果显示在液晶屏上 主函数部分 int main(void){ u16 i,j; dela ...
- 基于ZYNQ 的UART中断实验之串口写数据到DDR3中
1.参考 UG585 网络笔记 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验 3.实验目的 练习使用UART的中断实验,并将接收到的数据写入到DDR3中. 4.实验过程 建立工程,设 ...
- FPGA回忆记事(一):基于Nios II的LED实验
实验一:基于Nios II的LED实验 一. 创建Quartus II工程 1.打开Quartus II环境.开始->程序->Altera->Quartus II 9.1. 2 ...
- 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符GINGKO. 3.通过串口精灵发送命令可以控制ARM·L ...
- 【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) { int i,n; ]; ]; HAL_Init(); system_clock.initialize(); led.initialize(); ...
- 【iCore3 双核心板_FPGA】实验十七:基于I2C总线的ARM与FPGA通信实验
实验指导书及代码包下载: http://pan.baidu.com/s/1dFqddMp iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 基于 Arduino 的 RFID 识别实验
http://www.it165.net/embed/html/201512/3287.html 2015年12月04日(周五) 上午 博士的智能卡实验--RFID识别实验,基于51单片机: 我们的 ...
- I2C的读写操作实验
[实验任务] 利用24C08断电以后存储的数据不消失的特点,可以做一个断电保护装置.首先利用单片机做一个0-99秒的自动计时器.然后随机关断电源,在 通电以后计时器接着断电前的状态继续计时. [实 ...
随机推荐
- hdu_4828_Grids(卡特兰数+逆元)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4828 题意:中文,不解释 题解:实际就是一个卡特兰递推: Catalan(n+1)= Catalan( ...
- OpenCV ——背景建模之CodeBook(1)
1,CodeBook算法流程介绍 CodeBook算法的基本思想是得到每个像素的时间序列模型.这种模型能很好地处理时间起伏,缺点是需要消耗大量的内存.CodeBook算法为当前图像的每一个像素建立一个 ...
- sql server基础学习之引号
create table #(code varchar(20),value int)declare @sql varchar(200) set @sql='insert into # select ' ...
- JavaScript学习总结(十七)——Javascript原型链的原理
一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中, ...
- Ansible7:Playbook常用模块【转】
playbook的模块与在ansible命令行下使用的模块有一些不同.这主要是因为在playbook中会使用到一些facts变量和一些通过setup模块从远程主机上获取到的变量.有些模块没法在命令行下 ...
- jQuery实现DIV拖动
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- iptables基础知识
iptables防火墙可以用于创建过滤(filter)与NAT规则.所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙.如果你是第一 ...
- 使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。
这里一句代码就是查询2个表中某一列的相同,可是查询出来之后B表因为有很多重复的id数据,然而查询出来的数据需要插入到临时表中,临时表的oid是不允许有重复的, 因此需要用到 distinct 函数来取 ...
- WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】
1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...
- EditText的一点深入的了解
最近在开发android下的记事本程序时,频繁的使用EditText控件,折腾来折腾去,算是对其的了解更深入了一些.特将这些收获记录如下: 一.几个属性的介绍 android:gravity=&quo ...