📄 i2c1.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 + -