⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 《Proteus在MCS-51&ARM7系统中的应用百例》逆向之 Chapter 8 《Proteus在MCS-51&ARM7系统中的应用百例》MCS-51例子的C语言版本。 最
💻 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 + -