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

📄 e2p.cpp

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

#include "stdafx.h"
#include "E2PRW.h"
#include "e2p.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
UINT ShowTime5_1_Proc(LPVOID lParam);	//声明定时器函数v
#pragma comment(lib, "winmm.lib")
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Ce2p::Ce2p()
{
	js=0;
	m_pWriteBuf=new BYTE[0x20000];        //申明一个数组大小为1000
	m_pReadBuf=(BYTE*)GlobalAlloc(GMEM_FIXED,0x20000);//建立缓冲2
	//m_pWriteBuf=(BYTE*)GlobalAlloc(GMEM_FIXED,0x20000);//建立缓冲1
	memset(m_pReadBuf,0xff,0x20000);//格式 化缓冲区
	//memset(m_pWriteBuf,0xff,0x20000);//格式化缓冲区
}

Ce2p::~Ce2p()
{

}

void Ce2p::InitPro()//CWnd* pWnd为对话框指针,在对话框初始化时就用THIS传输来了
{

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

/*================================================= 
i2c_write(地址,数据),写一个字节 
=================================================*/ 
void Ce2p::i2c_write(int Address,unsigned char Data) 
{ 
do{ 
	i2c_start(); 
	dealy(10);
	i2c_send8bit(0xA6);
//	dealy(10); 
}while(i2c_ack()); 
	i2c_send8bit(Address/256);
	i2c_ack();
	i2c_send8bit(Address%256); 
	i2c_ack(); 
	i2c_send8bit(Data); 
	i2c_ack(); 
	i2c_stop(); 
	return; 
} 
/*================================================= 
i2c_read(地址,数据,数量),写一个页面
=================================================*/ 
void Ce2p::i2c_pagewrite(unsigned char Address,unsigned char Data,int no)
{
unsigned char i;
do{ 
	i2c_start(); 
	dealy(10);
	i2c_send8bit(0xA6);
	dealy(10); 
}while(i2c_ack()); 
i2c_send8bit(Address/256);
i2c_ack(); 
i2c_send8bit(Address%256); 
i2c_ack(); 
for(i=0;i<page;i++)
{
	i2c_send8bit(m_pWriteBuf[i]); 
	i2c_ack(); 
}
i2c_stop(); 
return;
}
/*================================================= 
i2c_read(地址,数据),写一个字节 
=================================================*/ 
unsigned char Ce2p::i2c_read(int Address) 
{ 
	unsigned char c; 
	do	{ 
		i2c_start(); 
		i2c_send8bit(0xA6);
		}while(i2c_ack()); //=1,表示无确认,再次发送
		i2c_send8bit(Address/256);
		i2c_ack(); //=1,表示无确认,再次发送 
		i2c_send8bit(Address%256); 
		i2c_ack(); //=1,表示无确认,再次发送 
		i2c_start(); 
		i2c_send8bit(0xA7);
		i2c_ack(); 
		c=i2c_receive8bit(); 
		i2c_ack(); //=1,表示无确认,再次发送 
	i2c_stop(); 
	return(c); 
} 
//================================================= 
//发送开始信号 
void Ce2p::i2c_start(void) 
{ 
	CParallelPort::SetPinH(3);//SDA = 1;
//	dealy(5); 
	CParallelPort::SetPinH(2);//SCL = 1; 
//	dealy(5); 
	CParallelPort::SetPinL(3);//SDA = 0; 
//	dealy(5); 
	CParallelPort::SetPinL(2);//SCL = 0; 
//	dealy(5); 
	return; 
} 
//发送结束信号 
void Ce2p::i2c_stop(void) 
{ 
	CParallelPort::SetPinL(3);//SDA = 0; 
//	dealy(5); 
	CParallelPort::SetPinH(2);//SCL = 1; 
//	dealy(5); 
	CParallelPort::SetPinH(3);//SDA = 1; 
//	dealy(5); 
	return; 
} 
//发送接收确认信号 
BYTE Ce2p::i2c_ack(void) 
{ 
	BYTE ack; 
	CParallelPort::SetPinH(3);//SDA = 1; 
//	dealy(5); 
	CParallelPort::SetPinH(2);//SCL = 1; 
//	dealy(5); 
	if(CParallelPort::GetPinLogic(15))//if (SDA==1) 
		ack = 1; 
	else 
		ack = 0; 
	CParallelPort::SetPinL(2);//SCL = 0; 
	return (ack); 
} 
//发送接收非确认信号 
void Ce2p::i2c_noack(void) 
{ 
	CParallelPort::SetPinH(SDAO);
//	dealy(10);
	CParallelPort::SetPinH(SCL);
//	dealy(10);
	CParallelPort::SetPinL(SCL);
} 
//送八位数据 
void Ce2p::i2c_send8bit(unsigned char b) 
{ 
	byte a1;
unsigned char a; 
for(a=0;a<8;a++) 
{ 
	a1=b<<a;
	a1=a1 & 0x80;
	if (a1==0x80) 
	{
		CParallelPort::SetPinH(3);//SDA = 1;
	} 
	else 
	{
		CParallelPort::SetPinL(3);//SDA = 0;
	} 
	CParallelPort::SetPinH(2);//SCL = 1; 
	CParallelPort::SetPinL(2);//SCL = 0; 
} 
return; 
} 
//接收八位数据 
unsigned char Ce2p::i2c_receive8bit(void) 
{ 
	unsigned char a; 
	unsigned char b=0;
	for(a=0;a<8;a++) 
	{ 
		CParallelPort::SetPinH(2);//SCL = 1;
		b=b<<1; 
		if(CParallelPort::GetPinLogic(15))//if (SDA==1) 
		b=b|0x01; //按位或 
		CParallelPort::SetPinL(2);//SCL = 0; 
	} 
	return (b); 
} 
//连续读数据
byte Ce2p::i2c_read(void)
{
	unsigned char c; int i;
//do{ 
	i2c_start(); 
	i2c_send8bit(0xA6); 
//}while(i2c_ack()); //=1,表示无确认,再次发送 
i2c_send8bit(0x00);
i2c_ack(); 
i2c_send8bit(0x00); 
i2c_ack(); 
//do{ 
	i2c_start(); 
	i2c_send8bit(0xA7); 
//}while(i2c_ack()); 
for(i=0;i<size;i++)
{
	m_pWriteBuf[i]=i2c_receive8bit(); 
	i2c_ack(); 
}

i2c_stop(); 
return(c); 
}
//////////////////////////////
void Ce2p::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.000000001* time));//0.000001
}

void Ce2p::open()
{
	CParallelPort::SetPinH(4);
	CParallelPort::SetPinH(5);
	CParallelPort::SetPinH(6);
	CParallelPort::SetPinH(7);
}

void Ce2p::close()
{
	CParallelPort::SetPinL(4);
	CParallelPort::SetPinL(5);
	CParallelPort::SetPinL(6);
	CParallelPort::SetPinL(7);
}


byte Ce2p::Read_8bit()
{
	BYTE rdata=0;
	 int i=8;
	CParallelPort::SetPinH(SDAO);
	dealy(5);
	 while(i--)
	 {
	  rdata<<=1;
	  CParallelPort::SetPinL(SCL);
	   dealy(1); 
	  CParallelPort::SetPinH(SCL);
	  if(GetPinLogic(SDAI)) 
		  rdata|=0x01;
	  else
		  rdata=rdata&0xFE;
	 }
return rdata;
}
BYTE Ce2p::check()
{
	//dealy(5);
	if(Ack==0)
	{
	//	AfxMessageBox("出错!"); 
		return 1;
	}
	else return 1;
}

⌨️ 快捷键说明

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