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

📄 isp2dlg.cpp

📁 用于Atmel单片机ISP下载的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if(bLogic)
		SetPinH(m_nPinMosi);
	else
		SetPinL(m_nPinMosi);

	SetPinLogic(m_nPinLe,1);//开启锁存
	for(int n=0;n<=1000;n++)//延时
	{
	}
	SetPinLogic(m_nPinLe,0);//关闭锁存
}

void CISP2Dlg::SetRst(BOOL bLogic)
{
	
	if(bLogic)
		SetPinH(m_nPinRst);
	else
		SetPinL(m_nPinRst);

	SetPinLogic(m_nPinLe,1);//开启锁存
	for(int n=0;n<=1000;n++)//延时
	{
	}
	SetPinLogic(m_nPinLe,0);//关闭锁存

}

void CISP2Dlg::SetSck(BOOL bLogic)
{
	if(bLogic)
		SetPinH(m_nPinSck);
	else
		SetPinL(m_nPinSck);

	SetPinLogic(m_nPinLe,1);//开启锁存
	for(int n=0;n<=1000;n++)//延时
	{
	}
	SetPinLogic(m_nPinLe,0);//关闭锁存
}

void CISP2Dlg::SetLe(BOOL bLogic)
{
	if(bLogic)
		SetPinH(m_nPinLe);
	else
		SetPinL(m_nPinLe);
}

void CISP2Dlg::SckBytes(int nBytes)//通过下载线与器件通信
{
	for(int n=0;n<nBytes;n++)
	{	
		SetSck(0);
		SetMosi((OutBuf[n] & 0x80));//SCK为低电平时,发送一位
		SetSck(1);
		if(GetMiso())//SCK为高电平时,接收一位
		{
			InBuf[n]=InBuf[n] | 0x80;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0x7f;
		}
		SetSck(0);
		SetMosi((OutBuf[n] & 0x40));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x40;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xbf;
		}
		SetSck(0);
		SetMosi((OutBuf[n] & 0x20));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x20;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xdf;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x10));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x10;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xef;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x08));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x08;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xf7;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x04));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x04;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xfb;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x02));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x02;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xfd;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x01));
		SetSck(1);
		if(GetMiso())
		{
			InBuf[n]=InBuf[n] | 0x01;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xfe;
		}
		SetSck(0);
	}
}

void CISP2Dlg::PreparePro()//编程前的准备工作
{
	SetRst(0);//RST置低电平
	SetMosi(0);//MOSI置低电平
	SetSck(0);//SCK置低电平
	Sleep(10);
	SetRst(1); //RST置高电平
	Sleep(10);
	OutBuf[0]=0xac;//送编程允许控制字
	OutBuf[1]=0x53;
	SckBytes(4); //输出4字节控制字,手册要求
}

void CISP2Dlg::ProOver()//编程结束后的工作
{
	SetRst(0);//RST置低电平,这样单片机就开始运行了
	SetMosi(1);
	SetSck(1);
	SetLe(0); //关74hc573的LE控制端
}


void CISP2Dlg::Erase()//擦除器件
{
	OutBuf[0]=0xac;//根据器件手册上规定的命令协议
	OutBuf[1]=0x80;
	SckBytes(4);//向器件发编程命令
	Sleep(500);	//擦除器件要500ms
}

BOOL CISP2Dlg::Write(BYTE Data,int nAddr)//写一个单元
{
	int nTimeOut=0;
	OutBuf[0]=0x40;//根据器件手册上规定的命令协议
	OutBuf[1]=((BYTE*)&nAddr)[1];//高地址
	OutBuf[2]=((BYTE*)&nAddr)[0];//低地址
	OutBuf[3]=Data;
	SckBytes(4);//向器件发编程命令
	while(Read(nAddr)!=Data)//效验:循环读,直到读出与写入相同的数
	{
		nTimeOut++;
		if(nTimeOut>=1000)//如果超时了,写入失败
			return FALSE;
	}
	return TRUE;
}

BYTE CISP2Dlg::Read(int nAddr)//读一个单元
{
	OutBuf[0]=0x20;//根据器件手册上规定的命令协议
	OutBuf[1]=((BYTE*)&nAddr)[1];//高地址
	OutBuf[2]=((BYTE*)&nAddr)[0];//低地址
	SckBytes(4);//向器件发编程命令
	return InBuf[3];
}

void CISP2Dlg::ReadSign(BYTE* pBuf)//读特征字
{
    OutBuf[0]=0x28;//根据器件手册上规定的命令协议
	OutBuf[1]=0x00;
	OutBuf[2]=0x00;
	OutBuf[3]=0x00;
	SckBytes(4);//向器件发编程命令
	pBuf[0]=InBuf[3];//第1个特征字
	OutBuf[1]=0x01;
	SckBytes(4);
	pBuf[1]=InBuf[3];//第2个特征字
	OutBuf[1]=0x02;
	SckBytes(4);
	pBuf[2]=InBuf[3];//第3个特征字
}

void CISP2Dlg::Reset()
{
    SetLe(1);
	SetRst(1);
	SetRst(0);
}

void CISP2Dlg::OnExit() 
{
	ShutdownWinIo();
	exit(1);
}

void CISP2Dlg::OnReset() 
{
	Reset();
	BeepOk();
}

void CISP2Dlg::OnReadSign() 
{   CString str,str0,str1,str2;
    PreparePro();
	ReadSign(SignBuf);
	ProOver();
	str0.Format("%x",SignBuf[0]);
	str1.Format("%x",SignBuf[1]);
    str2.Format("%x",SignBuf[2]);
	str=str0+":"+str1+":"+str2;str0.Format("%x",SignBuf[0]);
	m_sign=str;
	this->UpdateData(false);
	BeepOk();
}
/*
int CISP2Dlg::ConvertHexStr2int(CString string)
{
    unsigned int len;
	char temp;
	unsigned int i;
	CString fourbit;
	CString dec[8]={"0"};
	int result = 0;

	len=string.GetLength();
	for(i=0;i<len;i++)
	{
		temp = string.GetAt(i);
		dec[i] = ConvertHex2bin(temp);
		result = result + (int)pow(16, len-1-i)*Convertsbin2int(dec[i]);
	}
	return result;
}

CString CISP2Dlg::ConvertHex2bin(char hex)
{
	CString bin;
	switch(hex)
	{
	case '0':
		bin = "0000";
		break;
	case '1':
		bin = "0001";
		break;
	case '2':
		bin = "0010";
		break;
	case '3':
		bin = "0011";
		break;
	case '4':
		bin = "0100";
		break;
	case '5':
		bin = "0101";
		break;
	case '6':
		bin = "0110";
		break;
	case '7':
		bin = "0111";
		break;
	case '8':
		bin = "1000";
		break;
	case '9':
		bin = "1001";
		break;
	case 'a':
	case 'A':
		bin = "1010";
		break;
	case 'b':
	case 'B':
		bin = "1011";
		break;
	case 'c':
	case 'C':
		bin = "1100";
		break;
	case 'd':
	case 'D':
		bin = "1101";
		break;
	case 'e':
	case 'E':
		bin = "1110";
		break;
	case 'f':
	case 'F':
		bin = "1111";
		break;
	default:
		AfxMessageBox("The Hex number is incorrect!");
		break;
	}
	return bin;
}

int CISP2Dlg::Convertsbin2int(CString sbin)
{
	int temp, result;
	temp = atoi(sbin);
	result = temp/1000 * 8 + (temp%1000)/100 * 4 + (temp%100)/10 * 2 + (temp%10);
    return result;
}
*/
void CISP2Dlg::OnFileOpen() 
{
	CString str;
	CFileDialog fileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"*.hex|*.HEX",NULL);
 	fileDialog.DoModal();
	str=fileDialog.GetPathName();
	m_FileName=str;
	UpdateData(FALSE);
}

void CISP2Dlg::BeepOk()
{
	Beep(2000,30);
	Sleep(100);
	Beep(2000,30);
	Sleep(100);
	Beep(2000,30);
}

int CISP2Dlg::Char4ToByte(CString str)
{
    char h0,l0,h1,l1;
	char* pChar;
	int value;
	pChar=new char[4];
	pChar=str.GetBuffer(0);

	h1=pChar[0];//高4位 h1l1 h0l0
	l1=pChar[1];//低4位    
	h0=pChar[2];//高4位
	l0=pChar[3];//低4位

	if(l0>='0'&&l0<='9')
		l0=l0-'0';
	else if(l0>='A' && l0<='F')
		l0=l0-'A'+0xa;

	if(h0>='0'&&h0<='9')
		h0=h0-'0';
	else if(h0>='A'&&h0<='F')
		h0=h0-'A'+0xa;

	if(l1>='0'&&l1<='9')
		l1=l1-'0';
	else if(l1>='A' && l1<='F')
		l1=l1-'A'+0xa;

	if(h1>='0'&&h1<='9')
		h1=h1-'0';
	else if(h1>='A' &&h1<='F')
		h1=h1-'A'+0xa;
    value=h1*4096+l1*256+h0*16+l0;
	return value;
}


int CISP2Dlg::Char2ToByte(CString str)
{
    char h0,l0;
	char* pChar;
	int value;
	pChar=new char[2];
	pChar=str.GetBuffer(0);
  
	h0=pChar[0];//高4位
	l0=pChar[1];//低4位

	if(l0>='0'&&l0<='9')
		l0=l0-'0';
	else if(l0>='A' && l0<='F')
		l0=l0-'A'+0xa;

	if(h0>='0'&&h0<='9')
		h0=h0-'0';
	else if(h0>='A'&&h0<='F')
		h0=h0-'A'+0xa;
    value=h0*16+l0;
	return value;
}

⌨️ 快捷键说明

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