📄 i2c.i
字号:
#line 1 "I2C.c" /0 #line 1 "I2C.h" /0 #line 1 "C:\KEIL\C51\INC\REG52.H" /0 sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON = 0x98; sfr SBUF = 0x99; sfr T2CON = 0xC8; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; sbit EA = IE^7; sbit ET2 = IE^5; sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0; sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0; sbit T2EX = P1^1; sbit T2 = P1^0; sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2 = T2CON^0; #line 12 "I2C.h" /0 sbit I2C_SCL = P3^3; sbit SCL_Y= P1^6; sbit I2C_SDA = P3^4; sbit SDA_Y=P1^7; void I2C_Init(); bit I2C_Puts ( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ); bit I2C_Gets ( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ); #line 9 "I2C.c" /0 unsigned char data I2C_Delay_t; void I2C_Init() { I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SDA =SDA_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; } void I2C_Start() { I2C_SDA =SDA_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SDA =SDA_Y= 0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL =SCL_Y= 0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; } void I2C_Write(char dat) { unsigned char t = 8; do { I2C_SDA =SDA_Y= (bit)(dat & 0x80); dat <<= 1; I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL = SCL_Y=0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; } while ( --t != 0 ); } char I2C_Read() { char dat; unsigned char t = 8; I2C_SDA =SDA_Y= 1; do { I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; dat <<= 1; if ( I2C_SDA ) dat |= 0x01; I2C_SCL =SCL_Y= 0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; } while ( --t != 0 ); return dat; } bit I2C_GetAck() { bit ack; I2C_SDA =SDA_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; ack = I2C_SDA; I2C_SCL =SCL_Y= 0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; return ack; } void I2C_PutAck(bit ack) { I2C_SDA = ack; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL = SCL_Y=0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; } void I2C_Stop() { unsigned int t = 120; I2C_SDA =SDA_Y= 0; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SCL =SCL_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; I2C_SDA =SDA_Y= 1; { I2C_Delay_t = (12); while ( --I2C_Delay_t != 0 );}; while ( --t != 0 ); } bit I2C_Puts ( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ) { unsigned char i; char a[3]; if ( Size == 0 ) return 0; a[0] = (SlaveAddr << 1); if ( SubMod > 2 ) SubMod = 2; switch ( SubMod ) { case 0: break; case 1: a[1] = (char)(SubAddr); break; case 2: a[1] = (char)(SubAddr >> 8); a[2] = (char)(SubAddr); break; default: break; } SubMod++; I2C_Start(); for ( i=0; i<SubMod; i++ ) { I2C_Write(a[i]); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } } do { I2C_Write(*dat++); if ( I2C_GetAck() ) break; } while ( --Size != 0 ); I2C_Stop(); if ( Size == 0 ) { return 0; } else { return 1; } } bit I2C_Gets ( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ) { unsigned char i; char a[3]; if ( Size == 0 ) return 0; a[0] = (SlaveAddr << 1); if ( SubMod > 2 ) SubMod = 2; if ( SubMod != 0 ) { if ( SubMod == 1 ) { a[1] = (char)(SubAddr); } else { a[1] = (char)(SubAddr >> 8); a[2] = (char)(SubAddr); } SubMod++; I2C_Start(); for ( i=0; i<SubMod; i++ ) { I2C_Write(a[i]); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } } } I2C_Start(); I2C_Write(a[0]+1); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } for (;;) { *dat++ = I2C_Read(); if ( --Size == 0 ) { I2C_PutAck(1); break; } I2C_PutAck(0); } I2C_Stop(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -