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

📄 myprogdlg.cpp

📁 上位机软件 for avricp 根据功能设定熔丝
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		eprogButton->EnableWindow(FALSE);
		everiButton->EnableWindow(FALSE);
		ereadButton->EnableWindow(FALSE);
		eepromGroup->SetWindowText("EEPROM");
	}
	
}

//禁止锁定位和熔丝位操作
void CMYPROGDlg::DisableLockAndFuse()
{
	int i;
	SetDlgItemText(IDC_STATIC_SIGNATURE, "");
	//锁位部分
	
	lockGroup->EnableWindow(FALSE);
	lock->ShowWindow(SW_HIDE);
	for(i=0;i<8;i++)
	lockb[i ]->ShowWindow(SW_HIDE);
	lock1Combo->ShowWindow(SW_HIDE);
	lock2Combo->ShowWindow(SW_HIDE);
	lock3Combo->ShowWindow(SW_HIDE);
	
	//熔丝部分
	
	fuseGroup->EnableWindow(FALSE);
	fuse0->ShowWindow(SW_HIDE);
	fuse1->ShowWindow(SW_HIDE);
	fuse2->ShowWindow(SW_HIDE);
	
	for(i=0;i<24;i++)
	check[i ]->ShowWindow(SW_HIDE);
	
	fuse1Combo->ShowWindow(SW_HIDE);
	fuse2Combo->ShowWindow(SW_HIDE);
	fuse3Combo->ShowWindow(SW_HIDE);
	fuse4Combo->ShowWindow(SW_HIDE);
	
    //操作
	
	sreadButton->EnableWindow(FALSE);
	sprogButton->EnableWindow(FALSE);
	eraseButton->EnableWindow(FALSE);
	
	
}

// 0-13位熔丝和ATmega16一样为true
//DEL bool CMYPROGDlg::isFuseATmeaga16compatibl()
//DEL {
//DEL 	bool isATmeaga16compatibl;
//DEL 	switch(avrp.device.getDeviceCode())
//DEL 	{
//DEL 	case ATMEGA8515:
//DEL 	case ATMEGA8535:	
//DEL 	case ATMEGA8:  
//DEL 	case ATMEGA16:  
//DEL 	case ATMEGA32:  
//DEL 	case ATMEGA64:  
//DEL 	case ATMEGA128:  
//DEL 		isATmeaga16compatibl = true;
//DEL 		break;
//DEL 	default:
//DEL 		isATmeaga16compatibl = false;
//DEL 		break;
//DEL 	}
//DEL 	return isATmeaga16compatibl;
//DEL }

//根据器件使能锁定位和熔丝位操作
void CMYPROGDlg::EnableLockAndFuse()
{
	int i;
	//锁位部分
	while(lock1Combo->GetCount())lock1Combo->DeleteString(0);
	while(lock2Combo->GetCount())lock2Combo->DeleteString(0);
	while(lock3Combo->GetCount())lock3Combo->DeleteString(0);

	bitmap *p=avrp.device.getLockMap();
	long defaultmode=p->dwDefaultMode;
	long prtectmode=p->dwProtectMode;
	if(avrp.device.getLockBytes())
	{
		lock->ShowWindow(SW_SHOW); 
	}

	if(p->dwNumber)
	{
		lockGroup->EnableWindow(TRUE);
		for(i=0;i<p->dwNumber;i++)
		{
			lockb[i]->ShowWindow(SW_SHOW);
			lockb[i]->SetWindowText(p->bitname[i]);
			if((defaultmode&0x01))
				lockb[i]->SetCheck(FALSE);
			else 
				lockb[i]->SetCheck(TRUE);
			if((prtectmode&0x01))
				lockb[i]->EnableWindow(FALSE);
			else
				lockb[i]->EnableWindow(TRUE);
			defaultmode>>=1;
			prtectmode>>=1;
		}
	}


	if(p->ucCompatible == LockCompatibleIsAT89C51)
	{
		//lockb[0 ]->SetWindowText("LB1");
		//lockb[1 ]->SetWindowText("LB2");

		lock1Combo->ShowWindow(SW_SHOW);
		lock2Combo->ShowWindow(SW_HIDE);
		lock3Combo->ShowWindow(SW_HIDE);
		
		lock1Combo->AddString("模式1:未使能存储器保护");
		lock1Combo->AddString("模式2:EA锁定.MOVC,再编程禁止");
		lock1Combo->AddString("模式3:同模式2,且校验禁止");
		lock1Combo->AddString("模式4:同模式2,且外部执行禁止");
		lock1Combo->SetCurSel(0);
	}
	else if(p->ucCompatible == LockCompatibleIsAT90S1200)
	{
		//lockb[0 ]->SetWindowText("LB1");
		//lockb[1 ]->SetWindowText("LB2");

		lock1Combo->ShowWindow(SW_SHOW);
		
		lock1Combo->AddString("模式1:存储器无保护");
		lock1Combo->AddString("模式2:再编程禁止,熔丝锁定");
		lock1Combo->AddString("模式3:再编程和校验禁止,锁定位和熔丝锁定");
		lock1Combo->AddString("无效");
		lock1Combo->SetCurSel(0);
	}
	else if(p->ucCompatible == LockCompatibleIsATmeaga16)
	{
		//lockb[0 ]->SetWindowText("LB1");
		//lockb[1 ]->SetWindowText("LB2");
		//lockb[2 ]->SetWindowText("BLB01");
		//lockb[3 ]->SetWindowText("BLB02");
		//lockb[4 ]->SetWindowText("BLB11");
		//lockb[5 ]->SetWindowText("BLB12");

		lock1Combo->ShowWindow(SW_SHOW);
		lock2Combo->ShowWindow(SW_SHOW);
		lock3Combo->ShowWindow(SW_SHOW);
		
		lock1Combo->AddString("模式1:存储器无保护");
		lock1Combo->AddString("模式2:再编程禁止,熔丝锁定");
		lock1Combo->AddString("模式3:再编程和校验禁止,锁定位和熔丝锁定");
		lock1Combo->AddString("无效");
		lock1Combo->SetCurSel(0);
		
		lock2Combo->AddString("BLB0:1应用区允许读写");
		lock2Combo->AddString("BLB0:2应用区禁止写  ");
		lock2Combo->AddString("BLB0:3应用区禁止读写");
		lock2Combo->AddString("BLB0:4应用区禁止读  ");
		lock2Combo->SetCurSel(0);
		
		lock3Combo->AddString("BLB1:1引导区允许读写");
		lock3Combo->AddString("BLB1:2引导区禁止写  ");
		lock3Combo->AddString("BLB1:3引导区禁止读写");
		lock3Combo->AddString("BLB1:4引导区禁止读  ");
		lock3Combo->SetCurSel(0);
	}
	ResultLock();
	GetLock();
	//熔丝部分
	while(fuse1Combo->GetCount())fuse1Combo->DeleteString(0);
	while(fuse2Combo->GetCount())fuse2Combo->DeleteString(0);
	while(fuse3Combo->GetCount())fuse3Combo->DeleteString(0);
	while(fuse4Combo->GetCount())fuse4Combo->DeleteString(0);
	//熔丝部分
	switch(avrp.device.getFuseBytes())
	{
	case 3:
		fuse2->ShowWindow(SW_SHOW); 
	case 2:	
		fuse1->ShowWindow(SW_SHOW); 
	case 1:  
		fuse0->ShowWindow(SW_SHOW); 
	case 0:
		break;
	default:
		break;
	}
	p=avrp.device.getFuseMap();
	defaultmode=p->dwDefaultMode;
	prtectmode=p->dwProtectMode;
	if(p->dwNumber)
	{
		fuseGroup->EnableWindow(TRUE);
		for(i=0;i<p->dwNumber;i++)
		{
			check[i]->ShowWindow(SW_SHOW);
			check[i]->SetWindowText(p->bitname[i]);
			if((defaultmode&0x01))
				check[i]->SetCheck(FALSE);
			else 
				check[i]->SetCheck(TRUE);
			if((prtectmode&0x01))
				check[i]->EnableWindow(FALSE);
			else
				check[i]->EnableWindow(TRUE);
			defaultmode>>=1;
			prtectmode>>=1;
		}
	}
	if(p->ucCompatible == FuseCompatibleIsATmeaga16)
	{
		fuse1Combo->ShowWindow(SW_SHOW);
		fuse2Combo->ShowWindow(SW_SHOW);
		fuse3Combo->ShowWindow(SW_SHOW);
		fuse4Combo->ShowWindow(SW_SHOW);

		fuse1Combo->AddString("外部时钟");
		fuse1Combo->AddString("内部RC振荡器,1MHz(CKOPT不能编程)");
		fuse1Combo->AddString("内部RC振荡器,2MHz(CKOPT不能编程)");
		fuse1Combo->AddString("内部RC振荡器,4MHz(CKOPT不能编程)");
		fuse1Combo->AddString("内部RC振荡器,8MHz(CKOPT不能编程)");
		fuse1Combo->AddString("外部RC振荡器,0-0.9MHz");
		fuse1Combo->AddString("外部RC振荡器,0.9MHz-3.0MHz");
		fuse1Combo->AddString("外部RC振荡器,3.0MHz-8.0MHz");
		fuse1Combo->AddString("外部RC振荡器,8.0MHz-12.0MHz");
		fuse1Combo->AddString("外部低频晶振(如:32.768KHz)");
		fuse1Combo->AddString("陶瓷谐振器,低频:0.4MHz-0.9MHz");
		fuse1Combo->AddString("陶瓷谐振器,中频:0.9MHz-3.0MHz");
		fuse1Combo->AddString("陶瓷谐振器,高频:3.0MHz-8.0MHz");
		fuse1Combo->AddString("陶瓷谐振器,高频:1.0MHz-16.0MHz");
		fuse1Combo->AddString("石英振荡器,低频:0.4MHz-0.9MHz(不适用)");
		fuse1Combo->AddString("石英振荡器,中频:0.9MHz-3.0MHz");
		fuse1Combo->AddString("石英振荡器,高频:3.0MHz-8.0MHz");
		fuse1Combo->AddString("石英振荡器,高频:1.0MHz-16.0MHz");
		fuse1Combo->SetCurSel(1);
		
		fuse2Combo->AddString("BOD使能启动");
		fuse2Combo->AddString("电源快速上升启动");
		fuse2Combo->AddString("电源缓慢上升启动");
		fuse2Combo->AddString("电源快速上升或BOD使能(外部RC或低频晶振)");
		fuse2Combo->AddString("启动时频率已经稳定(外部低频晶振)");
		fuse2Combo->AddString("保留");
		fuse2Combo->SetCurSel(2);
		
		fuse3Combo->AddString("无BOD功能");
		fuse3Combo->AddString("BOD使能2.7V");
		fuse3Combo->AddString("BOD使能4.0V");
		fuse3Combo->SetCurSel(1);
		
		fuse4Combo->AddString("BOOT块 1024 Words");
		fuse4Combo->AddString("BOOT块  512 Words");
		fuse4Combo->AddString("BOOT块  256 Words");
		fuse4Combo->AddString("BOOT块  128 Words");
		fuse4Combo->SetCurSel(0);
	}

	ResultFuse();
	GetFuse();
	//操作
	sreadButton->EnableWindow(TRUE);
	sprogButton->EnableWindow(TRUE);
	eraseButton->EnableWindow(TRUE);
	
}

//计算锁定位
void CMYPROGDlg::ResultLock()
{
	
	
	avrp.device.LockBits = -1;
	//bitmap *p=avrp.device.getLockMap();
	if(avrp.device.getLockMap()->ucCompatible == LockCompatibleIsAT89C51)
	for(int i=7;i>=0;i--)
	{
		avrp.device.LockBits <<= 1;
		if( lockb[i]->GetCheck()) 
			avrp.device.LockBits |= 1;
	}
	else 
	for(int i=7;i>=0;i--)
	{
		avrp.device.LockBits <<= 1;
		if( !lockb[i]->GetCheck()) 
			avrp.device.LockBits |= 1;
	}
	
	char printlock[16];
	switch(avrp.device.getLockBytes())
	{
	case 1:  
		sprintf(printlock,"锁定字节 0x%02X",(unsigned char)avrp.device.LockBits);
		SetDlgItemText(IDC_STATIC_LOCK,printlock);
	case 0:
		break;
	default:
		break;
	}
}


//计算熔丝位
void CMYPROGDlg::ResultFuse()
{
	
	avrp.device.ExtendedFuseBits = -1;
	for(int i=23;i>=16;i--)
	{
		avrp.device.ExtendedFuseBits <<= 1;
		if( !check[i]->GetCheck()) 
			avrp.device.ExtendedFuseBits |= 1;
	}
	avrp.device.FuseBits = -1;
	for(i=15;i>=0;i--)
	{
		avrp.device.FuseBits <<= 1;
		if( !check[i]->GetCheck()) 
			avrp.device.FuseBits |= 1;
	}
	
	char printfuse[16];
	switch(avrp.device.getFuseBytes())
	{
	case 3:
		sprintf(printfuse,"扩展 0x%02X",
			(unsigned char)(avrp.device.ExtendedFuseBits)  & 0xff);
		SetDlgItemText(IDC_STATIC_FUSE2,printfuse);
	case 2:	
		sprintf(printfuse,"高字节 0x%02X",
			(unsigned char)(avrp.device.FuseBits >> 8)  & 0xff);
		SetDlgItemText(IDC_STATIC_FUSE1,printfuse);
	case 1:  
		sprintf(printfuse,"低字节 0x%02X",
			(unsigned char)avrp.device.FuseBits  & 0xff);
		SetDlgItemText(IDC_STATIC_FUSE0,printfuse);
	case 0:
		break;
	default:
		break;
	}
}
//分析锁定位
void CMYPROGDlg::AnalyseLock()
{
	
	if(avrp.device.getLockMap()->ucCompatible == LockCompatibleIsAT89C51)
	for(int i=7;i>=0;i--)
	{
		if((avrp.device.LockBits >> i) & 0x01)
			lockb[i]->SetCheck(1); 
		else 
			lockb[i]->SetCheck(0); 
	}
	else 
	for(int i=0;i<8;i++)
	{
		if((avrp.device.LockBits >> i) & 0x01)
			lockb[i]->SetCheck(0); 
		else 
			lockb[i]->SetCheck(1); 
	}
	
	char printlock[16];
	switch(avrp.device.getLockBytes())
	{
	case 1:  
	sprintf(printlock,"锁定字节 0x%02X",(unsigned char)avrp.device.LockBits);
	SetDlgItemText(IDC_STATIC_LOCK,printlock);
	case 0:
		break;
	default:
		break;
	}
	
}
//分析熔丝位
void CMYPROGDlg::AnalyseFuse()
{
	
	for(int i=0;i<8;i++)
	{
		if((avrp.device.ExtendedFuseBits >> i) & 0x01)
			check[i+16]->SetCheck(0); 
		else
			check[i+16]->SetCheck(1); 
	}
	for(i=0;i<16;i++)
	{
		if((avrp.device.FuseBits >> i) & 0x01)
			check[i]->SetCheck(0); 
		else 
			check[i]->SetCheck(1); 
	}
	
	char printfuse[16];
	switch(avrp.device.getFuseBytes())
	{
	case 3:
		sprintf(printfuse,"扩展 0x%02X",
			(unsigned char)(avrp.device.ExtendedFuseBits)  & 0xff);
		SetDlgItemText(IDC_STATIC_FUSE2,printfuse);
	case 2:	
		sprintf(printfuse,"高字节 0x%02X",
			(unsigned char)(avrp.device.FuseBits >> 8)  & 0xff);
		SetDlgItemText(IDC_STATIC_FUSE1,printfuse);
	case 1:  
		sprintf(printfuse,"低字节 0x%02X",
			(unsigned char)avrp.device.FuseBits  & 0xff);
		SetDlgItemText(IDC_STATIC_FUSE0,printfuse);
	case 0:
		break;
	default:
		break;
	}
}
//根据锁定要求设定锁定位
void CMYPROGDlg::SetLock()
{
	bitmap *p=avrp.device.getLockMap();
	if(p->ucCompatible == LockCompatibleIsAT89C51)
	{
		switch(lock1Combo->GetCurSel())
		{
		case 0:
			lockb[0 ]->SetCheck(0);
			lockb[1 ]->SetCheck(0);
			lockb[2 ]->SetCheck(0);
			//avrp.device.LockBits=0;
			break;
		case 1:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(0);
			lockb[2 ]->SetCheck(0);
			//avrp.device.LockBits=1;
			break;
		case 2:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(1);
			lockb[2 ]->SetCheck(0);
			//avrp.device.LockBits=3;
			break;
		case 3:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(1);
			lockb[2 ]->SetCheck(1);
			//avrp.device.LockBits=7;
			break;
		default:
			lockb[0 ]->SetCheck(0);
			lockb[1 ]->SetCheck(0);
			lockb[2 ]->SetCheck(0);
			//avrp.device.LockBits=0;
			break;
		}
	}
	if(p->ucCompatible == LockCompatibleIsAT90S1200)
	{
		switch(lock1Combo->GetCurSel())
		{
		case 0:
			lockb[0 ]->SetCheck(0);
			lockb[1 ]->SetCheck(0);
			break;
		case 1:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(0);
			break;
		case 2:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(1);
			break;
		case 3:
			lockb[0 ]->SetCheck(0);
			lockb[1 ]->SetCheck(1);
			break;
		default:
			break;
		}
	}
	if(p->ucCompatible == LockCompatibleIsATmeaga16)
	{
		switch(lock1Combo->GetCurSel())
		{
		case 0:
			lockb[0 ]->SetCheck(0);
			lockb[1 ]->SetCheck(0);
			break;
		case 1:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(0);
			break;
		case 2:
			lockb[0 ]->SetCheck(1);
			lockb[1 ]->SetCheck(1);
			break;
		case 3:
			lockb[0 ]->SetCheck(0);
			lockb[1 ]->SetCheck(1);
			break;
		default:
			break;
		}
		switch(lock2Combo->GetCurSel())
		{
		case 0:
			lockb[2 ]->SetCheck(0);
			lockb[3 ]->SetCheck(0);
			break;
		case 1:
			lockb[2 ]->SetCheck(1);
			lockb[3 ]->SetCheck(0);
			break;
		case 2:
			lockb[2 ]->SetCheck(1);
			lockb[3 ]->SetCheck(1);
			break;
		case 3:
			lockb[2 ]->SetCheck(0);
			lockb[3 ]->SetCheck(1);
			break;
		default:
			break;
		}
		switch(lock3Combo->GetCurSel())
		{
		case 0:
			lockb[4 ]->SetCheck(0);
			lockb[5 ]->SetCheck(0);
			break;
		case 1:
			lockb[4 ]->SetCheck(1);
			lockb[5 ]->SetCheck(0);
			break;
		case 2:
			lockb[4 ]->SetCheck(1);
			lockb[5 ]->SetCheck(1);
			break;
		case 3:
			lockb[4 ]->SetCheck(0);
			lockb[5 ]->SetCheck(1);
			break;
		default:
			break;
		}
	}	
	
}

//根据功能设定熔丝位
void CMYPROGDlg::SetFuse()
{
	/*
	0 ("外部时钟");
	1 ("内部RC振荡器,1MHz");
	2 ("内部RC振荡器,2MHz");
	3 ("内部RC振荡器,4MHz");
	4 ("内部RC振荡器,8MHz");
	5 ("外部RC振荡器,0-0.9MHz");
	6 ("外部RC振荡器,0.9MHz-3.0MHz");
	7 ("外部RC振荡器,3.0MHz-8.0MHz");
	8 ("外部RC振荡器,8.0MHz-12.0MHz");
	9 ("外部低频晶振(如:32.768KHz)");
	10("陶瓷谐振器,低频:0.4MHz-0.9MHz");
	11("陶瓷谐振器,中频:0.9MHz-3.0MHz");
	12("陶瓷谐振器,高频:3.0MHz-8.0MHz");
	13("陶瓷谐振器,高频:1.0MHz-16.0MHz");
	14("石英振荡器,低频:0.4MHz-0.9MHz(不适用)");
	15("石英振荡器,中频:0.9MHz-3.0MHz");
	16("石英振荡器,高频:3.0MHz-8.0MHz");
	17("石英振荡器,高频:1.0MHz-16.0MHz");
	fuse1Combo->SetCurSel(1);
	*/
    bitmap	*p=avrp.device.getFuseMap();
	if(p->ucCompatible == FuseCompatibleIsATmeaga16)
	{
		switch(fuse1Combo->GetCurSel())
		{
		case 0:
			check[0]->SetCheck(1);
			check[1]->SetCheck(1);
			check[2]->SetCheck(1);
			check[3]->SetCheck(1);
			break;
		case 1:
			check[12]->SetCheck(0);
			check[0]->SetCheck(0);
			check[1]->SetCheck(1);
			check[2]->SetCheck(1);
			check[3]->SetCheck(1);
			break;
		case 2:
			check[12]->SetCheck(0);
			check[0]->SetCheck(1);
			check[1]->SetCheck(0);

⌨️ 快捷键说明

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