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

📄 i2c1.cpp

📁 一款通过并口读写E2P的程序
💻 CPP
字号:
// i2c1.cpp: implementation of the Ci2c class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "E2PRW.h"
#include "i2c1.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Ci2c::Ci2c()
{

}

Ci2c::~Ci2c()
{

}

void Ci2c::InitPro()
{
if(!CParallelPort::InitPort())//初始化并口
	{
		//AfxMessageBox("初始化并口啊失败!");
	}
}

void Ci2c::dealy(int time)
{
	LARGE_INTEGER  litmp; 
	LONGLONG       QPart1,QPart2;;
	double         dfMinus, dfFreq, dfTim; 
	QueryPerformanceFrequency(&litmp); 
	dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
	QueryPerformanceCounter(&litmp); 
	QPart1 = litmp.QuadPart; // 获得初始值
	do{
		QueryPerformanceCounter(&litmp); 
		QPart2 = litmp.QuadPart;// 获得中止值 
		dfMinus = (double)(QPart2-QPart1); 
		dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒
	}while(dfTim<(0.000001* time));
}

void Ci2c::Start_I2c()
{
	CParallelPort::SetPinH(SDAO);
	dealy(1);
	CParallelPort::SetPinL(SCL);
	dealy(5);
	CParallelPort::SetPinL(SDAO);
	dealy(5);
	CParallelPort::SetPinL(SCL);
	dealy(2);
}

void Ci2c::Stop_I2c()
{
	CParallelPort::SetPinL(SDAO);
	dealy(1);
	CParallelPort::SetPinL(SCL);
	dealy(5);
	CParallelPort::SetPinH(SDAO);
	dealy(4);
}

void Ci2c::SendB(unsigned short c)
{
	BYTE BitCnt;
	for (BitCnt=0;BitCnt<8;BitCnt++)
	{
		if ((c<<BitCnt)&0x80) CParallelPort::SetPinH(SDAO);
		else CParallelPort::SetPinL(SDAO);
		dealy(1);
		CParallelPort::SetPinH(SCL);
		dealy(5);
		CParallelPort::SetPinL(SCL);
	}
	dealy(2);
	CParallelPort::SetPinH(SDAO);
	dealy(2);
	CParallelPort::SetPinH(SCL);
	dealy(3);
	if(CParallelPort::GetPinLogic(SDAI)) ask=0;
	else ask=1;
	CParallelPort::SetPinL(SCL);
	dealy(2);
}

BYTE Ci2c::RcvB()
{
	UCHAR rectc;
	UCHAR BitCnt;
	rectc=0;
	CParallelPort::SetPinH(SDAO);
	for (BitCnt=0;BitCnt<8;BitCnt++)
	{
		dealy(1);
		CParallelPort::SetPinL(SCL);
		dealy(5);
		CParallelPort::SetPinH(SCL);
		dealy(2);
		rectc=rectc<<1;
		if(CParallelPort::GetPinLogic(SDAI)) rectc=rectc+1;
		dealy(2);
	}
	CParallelPort::SetPinL(SCL);
	dealy(2);
	return(rectc);
}


VOID Ci2c::Ack_I2c(byte a)
{
	if (a==0)CParallelPort::SetPinL(SDAO);
	else CParallelPort::SetPinH(SDAO);
	dealy(3);
	CParallelPort::SetPinH(SCL);
	dealy(5);
	CParallelPort::SetPinL(SCL);
	dealy(2);
}

byte Ci2c::ISendB(UCHAR sla, UCHAR c)
{
	Start_I2c();
	SendB(sla);
	if (ask==0) return 0;
	Stop_I2c();
	return 1;
}

byte Ci2c::ISendStr(UCHAR suba, UCHAR s)
{
//	UCHAR i;
	Start_I2c();
	SendB(0XA0);
	if(ask==0) return 0;
	SendB(suba);
	if(ask==0) return 0;
	Start_I2c();
	SendB(0XA1);
//	for (i=0;i<no-1;i++)
	//{
		s=RcvB();
		Ack_I2c(0);
		s++;
	//}
	s=RcvB();
	Stop_I2c();
	return 1;
}

BYTE Ci2c::IRcvStr(UCHAR suba, UCHAR s)
{
	//UCHAR i;
	Start_I2c();
	SendB(0xa0);
	if (ask==0) return 0;
	SendB(suba);
	if (ask==0) return 0;
	Start_I2c();
	SendB(0xa1);
	if(ask==0) return 0;
//	for (i=0;i<no-1;i++)
//	{
		s=RcvB();
		Ack_I2c(0);
	//	s++;
//	}
	s=RcvB();
	Ack_I2c(1);
	Stop_I2c();
	return 1;
}
UINT Ci2c::WriteRomThread(LPVOID pParam)//写线程
{
	Ci2c* i2c=(Ci2c*)pParam;//定义本类的对象用于该线程
	i2c->ls();
	//AfxMessageBox("线程工作结束!");
	//发送进度条为0的消息
	PostMessage(AfxGetMainWnd()->m_hWnd, WM_PRO_MSG, (WPARAM)10, 0);	
	return 1;
}

VOID Ci2c::READ()
{
	AfxBeginThread(WriteRomThread,this)!=NULL;
}

void Ci2c::ls()
{
int i;
	for(i=0;i<1000+1;i++)
	{
		Sleep(30);
		dealy(10000);
		if((i*100)/1000%1==0)
		PostMessage(AfxGetMainWnd()->m_hWnd, WM_PRO_MSG, (WPARAM)(i*100)/1000, 0);
	}
}
void Ci2c::open()
{
	CParallelPort::SetPinH(4);
	CParallelPort::SetPinH(5);
	CParallelPort::SetPinH(6);
	CParallelPort::SetPinH(7);
}
void Ci2c::closs()
{
	CParallelPort::SetPinL(4);
	CParallelPort::SetPinL(5);
	CParallelPort::SetPinL(6);
	CParallelPort::SetPinL(7);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -