📄 main.c
字号:
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
sbit SDA=P1^5;
sbit SCL=P1^4;
bit ACK;
BYTE SLA;
BYTE SUBA;
BYTE NUMBYTE;
BYTE MTD[0x0F];
BYTE MRD[0x0F];
void IWRNBYTE();
void IRDNBYTE();
void START();
void STOP();
void MACK();
void MNACK();
void CACK();
void WRBYTE(BYTE in);
BYTE RDBYTE();
main()
{
BYTE delay=0xF0;
BYTE offset=0;
BYTE i,j,k;
while(--delay);
while(offset<0x10)
{
MTD[offset]=offset;
}
SLA=0xA0;
SUBA=0x30;
NUMBYTE=16;
IWRNBYTE();
i=20;
do
{
j=248;
do
{
k=248;
do
{}while(--k);
}while(--j);
}while(--i);
SLA=0xA0;
SUBA=0x30;
NUMBYTE=16;
IRDNBYTE();
}
void IWRNBYTE()
{
BYTE i;
BYTE offset;
dd:
i=NUMBYTE;
offset=0;
START();
WRBYTE(SLA);
CACK();
if(!ACK)
{
STOP(); return;
}
WRBYTE(SUBA);
CACK();
do
{
WRBYTE(MTD[offset]);
CACK();
if(!ACK) goto dd;
offset++;
}while(--i);
STOP();
}
void IRDNBYTE()
{
BYTE offset;
BYTE num;
qq:
offset=0;
num=NUMBYTE;
START();
WRBYTE(SLA);
CACK();
if(!ACK)
{
STOP();
return;
}
WRBYTE(SUBA);
CACK();
START();
WRBYTE(++SLA);
CACK();
if(!ACK) goto qq;
do
{
MRD[offset]=RDBYTE;
MACK();
offset++;
}while(--num);
MNACK();
STOP();
}
void START()
{
SDA=1; //发送起始条件数据信号
_nop_(); //起始条件建立时间大于4.7us
SCL=1; //发送起始条件的时钟信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //起始条件锁定时间大于4.7us
SDA=0; //发送起始信号
_nop_();
_nop_();
_nop_();
_nop_(); //起始条件锁定时间大于4.7us
SCL=0; //钳住I2C总线,准备发送或接收数据
_nop_();
}
void STOP()
{
SDA=0; //发送停止条件的数据信号
_nop_();
_nop_();
SCL=1; //发送停止条件的时钟信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //起始条件建立时间大于4.7us
SDA=1; //发送I2C总线停止信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void MACK()
{
SDA=0; //将SDA置0
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //保持数据时间,大于4.7us
SCL=0;
_nop_();
_nop_();
}
void MNACK()
{
SDA=1; //将SDA置1
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0; //保持数据时间,大于4.7us
_nop_();
_nop_();
}
void CACK()
{
SDA=1;
_nop_();
_nop_();
SCL=1;
ACK=0;
_nop_();
_nop_();
if(SDA)
ACK=1;
_nop_();
SCL=0;
_nop_();
}
void WRBYTE(BYTE in)
{
BYTE num=8;
ACC=in;
do
{
#pragma asm
RLC A
#pragma endasm
if(CY)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
else
{
SDA=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
}while(--num);
}
BYTE RDBYTE()
{
BYTE num=8;
do
{
SDA=1;
_nop_();
SCL=1; // 时钟线为高,接收数据位
_nop_();
_nop_();
CY=SDA;
SCL=0;
#pragma asm
RLC A
#pragma endasm
_nop_();
_nop_();
_nop_();
}while(--num);
return ACC;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -