|
汇编写的24C01 单字节读写程序 ; ======================================================= ; 24C01存储器I2C总线实验 汇编语言例子 ; ======================================================= ; ; ew51仿真编程器 配套实验板学习例程 ; ; 中山单片机学习网 诚电科技 站长:逸风 ; ; http://www.zsMCU.com ; E-mail:ew51@zsmcu.com ; ======================================================= SDA EQU P2.0 SCL EQU P2.1 Address EQU 08H I2CData EQU 09H ORG 0000H START: MOV SP,#60H MOV Address,#00H MOV I2CData,#55H CALL I2C_WRITE ;写入数据 MOV I2CDATA,#0AAH ; MOV Address,#00H CALL I2C_READ MOV I2CData,A ;读出数据 NOP NOP MAIN: JMP MAIN /*======================================================= 写一个字节 Address地址 I2CDatata写入的数据 =======================================================*/ I2C_WRITE: I2C_WRITE_A: LCALL I2C_START MOV A,#10100000B LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_WRITE_A ;=1,表示无确认,再次发送 MOV A,Address LCALL I2C_SEND8BIT LCALL I2C_ACK MOV A,I2CData LCALL I2C_SEND8BIT LCALL I2C_ACK LCALL I2C_STOP RET /*======================================================= 读一个字节 Address地址 Data读出的数据 =======================================================*/ I2C_READ: I2C_READ_A: LCALL I2C_START MOV A,#10100000B LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_READ_A ;=1,表示无确认,再次发送 MOV A,Address LCALL I2C_SEND8BIT LCALL I2C_ACK I2C_READ_B: LCALL I2C_START MOV A,#10100001B LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_READ_B LCALL I2C_RECEIVE8BIT MOV I2CData,A LCALL I2C_ACK LCALL I2C_STOP RET ;======================================================= ;发送开始信号 I2C_START: SETB SCL SETB SDA NOP NOP CLR SDA NOP NOP CLR SCL RET ;======================================================= ;发送结束信号 I2C_STOP: CLR SDA NOP NOP SETB SCL NOP NOP SETB SDA RET ;======================================================= ;发送接收确认信号 I2C_ACk: SETB SDA SETB SCL NOP NOP JB SDA,I2C_ACK0 CLR C SJMP I2C_ACK_END I2C_ACK0: SETB C I2C_ACK_END: CLR SCL RET ;======================================================= ;送八位数据 I2C_SEND8BIT: MOV B,#08H I2C_SEND8BIT_A: RLC A MOV SDA,C SETB SCL NOP NOP CLR SCL DJNZ B,I2C_SEND8BIT_A RET ;======================================================= ;接收八位数据 I2C_RECEIVE8BIT: MOV B,#08H CLR A SETB SDA I2C_RECEIVE8IT_A: SETB SCL NOP NOP MOV C,SDA RLC A CLR SCL DJNZ B,I2C_RECEIVE8IT_A RET 5 C语言写的24C01 单字节读写程序 /*======================================================= 24C01存储器I2C总线实验 C语言例子 ======================================================= ew51仿真编程器 配套实验板学习例程 中山单片机学习网 诚电科技 站长:逸风 http://www.zsmcu.com E-mail:ew51@zsmcu.com =======================================================*/ #include sbit SDA=0x90; sbit SCL=0x91; //函数声明 unsigned char i2c_read(unsigned char); void i2c_write(unsigned char,unsigned char); void i2c_send8bit(unsigned char); unsigned char i2c_receive8bit(void); void i2c_start(void); void i2c_stop(void); bit i2c_ack(void); //======================================================= void main(void) { unsigned char dd; i2c_write(0x00,0x55); _nop_(); dd=i2c_read(0x00); for(;;) {} } /*======================================================= i2c_write(地址,数据),写一个字节 =======================================================*/ void i2c_write(unsigned char Address,unsigned char Data) { do{ i2c_start(); i2c_send8bit(0xA0); }while(i2c_ack()); i2c_send8bit(Address); i2c_ack(); i2c_send8bit(Data); i2c_ack(); i2c_stop(); return; } /*======================================================= i2c_read(地址,数据),写一个字节 =======================================================*/ unsigned char i2c_read(unsigned char Address) { unsigned char c; do{ i2c_start(); i2c_send8bit(0xA0); }while(i2c_ack()); //=1,表示无确认,再次发送 i2c_send8bit(Address); i2c_ack(); do{ i2c_start(); i2c_send8bit(0xA1); }while(i2c_ack()); c=i2c_receive8bit(); i2c_ack(); i2c_stop(); return(c); } //======================================================= //发送开始信号 void i2c_start(void) { SDA = 1; SCL = 1; SDA = 0; SCL = 0; return; } //发送结束信号 void i2c_stop(void) { SDA = 0; SCL = 1; SDA = 1; return; } //发送接收确认信号 bit i2c_ack(void) { bit ack; SDA = 1; SCL = 1; if (SDA==1) ack = 1; else ack = 0; SCL = 0; return (ack); } //送八位数据 void i2c_send8bit(unsigned char b) { unsigned char a; for(a=0;a<8;a++) { if ((b< SDA = 1; else SDA = 0; SCL = 1; SCL = 0; } return; } //接收八位数据 unsigned char i2c_receive8bit(void) { unsigned char a; unsigned char b=0; for(a=0;a<8;a++) { SCL = 1; b=b<<1; if (SDA==1) b=b|0x01; //按位或 SCL = 0; } return (b); }
|