📄 isp2dlg.cpp
字号:
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 + -