📄 2401.c
字号:
#include <stc89c51.h>
#include <intrins.h>
#include "source.h"
/* 5ms延时 */
void ms (void)
{ uchar i=20,j;
do
{ j=250;
while(--j);
}
while(--i);
}
/* 启动I2C */
void ic_start (void)
{ io=1;
clk=1;
nop;
io=0;
nop;
clk=0;
nop;
}
/* 停止I2C */
void ic_over (void)
{ io=0;
clk=0;
nop;
clk=1;
nop;
io=1;
nop;
}
/* 应答检测 */
void check_ack (void)
{ io=1;
clk=1;
nop;
clk=0;
nop;
}
/* 应答 */
void ack (void)
{ io=0;
clk=1;
nop;
clk=0;
nop;
}
/* 非应答 */
void no_ack (void)
{ io=1;
clk=1;
nop;
clk=0;
io=0;
nop;
}
/* 写一个字节 */
void write_byte (uchar d)
{ uchar i=8;
do
{ if(d&0x80)
{ io=1;
clk=1;
nop;
clk=0;
io=0;
nop;
}
else
{ io=0;
clk=1;
nop;
clk=0;
nop;
}
d<<=1;
}
while(--i);
}
/* 读一个字节 */
uchar read_byte (void)
{ uchar i=8,d;
io=1;
do
{ clk=1;
nop;
d<<=1;
if(io)
{ d|=0x01;
clk=0;
nop;
}
else
{ d&=0xfe;
clk=0;
nop;
}
}
while(--i);
return d;
}
/* 向I2C写数据 */
void ic_write (uint add,uchar d)
{ uchar i,j;
j=(uchar)add;
i=(uchar)(add/256);
i<<=1;
i+=0xa0;
ic_start();
write_byte(i);
check_ack();
write_byte(j);
check_ack();
write_byte(d);
check_ack();
ic_over();
}
/* 从I2C读数据 */
void ic_read (uint add,uchar len)
{ uchar i=0,j,k;
j=(uchar)add;
k=(uchar)(add/256);
k<<=1;
k+=0xa0;
ic_start();
write_byte(k);
check_ack();
write_byte(j);
check_ack();
ic_start();
k|=0x01;
write_byte(k);
check_ack();
do
{ ic_data[i]=read_byte();
ack();
i+=1;
}
while(--len);
ic_data[i]=read_byte();
no_ack();
ic_over();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -