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

📄 main.c

📁 LWIP在STM32裸机上的移植
💻 C
📖 第 1 页 / 共 5 页
字号:
					SceneDelFlag = ScenKeyBK & 0x0F;//标记取消"场景"键	
					ScenKeyBK = 0;
				}

				ScenKey = 0;
			}	

			if(EfctKey)		//效果按键(四个按键,每次只能显示一个按键)
			{	
				if((EfctKeyBK & EfctKey) == 0)	//按下不同"效果"键(设置不同效果)		
				{
					//不同"效果"键按下时发送效果设置 (为了使按下"效果"键,只发送一次)					
					EffectSetFlg = 1;	
											
					EfctKeyBK = 0;
					for(i=0;i<4;i++)
					{
						if(((EfctKey>>i)& 0x01) == 0x01)
						{
							EfctKeyBK ^= 1<<i;
							break;
						}
					}
				}
				else	//按下相同"效果"键(取消效果)
				{	
					//推子模块"设置"键按下时,"效果"键才有效
					for(i=0;i<20;i++)
					{					
						if(((KeySetDataBK>>i)& 0x01) == 0x01)	//哪个"设置"键按下 
						{
							if(EffectAddr[i][1])		//某路推子"设置"键是否已经设置效果(与话筒输入板绑定)
							{	
								EffectAddr[i][1] = 0;	//取消某路推子"设置"键设置的效果
								TxMessage.StdId = (((EffectAddr[i][0] & 0xF0)<<4)|(EffectAddr[i][0] & 0x0F))& 0x7FF;
//								printf("\nEffect Delete Addr = 0x%X\n",TxMessage.StdId);
								TxMessage.RTR = CAN_RTR_DATA;
								TxMessage.IDE = CAN_ID_STD;
								TxMessage.DLC = 1;
								TxMessage.Data[0] = 0;				//取消效果帧
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
																	
								break;
							}			
						}						
					}
					EfctKeyBK = 0;
					EffectSetFlg = 0;	//取消效果,不发送效果设置
					
					//=== 保存"取消效果"信息 ===//
					if(!ScenKeyBK)	//"场景"按键未按下时(临时场景)
					{
						for(h=0,i=0;i<40;i++)
						{
							ReadEEPData[i++] = EffectAddr[h][0];
							ReadEEPData[i] = EffectAddr[h++][1];
						}
						I2C_EE_PageWrite(ReadEEPData,EEP_EffectAddr_Address,40);
					}
				}

				EfctKey = 0;
			}

			
			if(TalkKey)		//对讲按键(四个按键,每次可以显示多个按键)
			{
				for(i=0;i<4;i++)		
				{
					if(((TalkKey>>i)& 0x01) == 0x01)
						TalkKeyBK ^= 1<<i;
				}
				TalkKey = 0;
			}

			if(!KeySetDataBK)EfctKeyBK = 0; //若"设置"按键不亮,则"效果"按键不亮
			if(!FaceKeyBK)
			{
				FaceKeyBK |= 0x01;				//若"界面"按键不亮,则"主页"按键默认亮
				FaceKeySet = FaceKeyBK & 0x0F;	//总控模块界面按键功能
			}
			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;
			TxMessage.StdId = 0x011;
			TxMessage.Data[0] = FaceKeyBK;
			TxMessage.Data[1] = EfctKeyBK;
			TxMessage.Data[2] = ScenKeyBK;
			TxMessage.Data[3] = TalkKeyBK;
			while(((CAN1->TSR>>26)& 0x07) == 0);
			CAN_Transmit(CAN1, &TxMessage);
		}
		
		//总控模块按键扫描
		if(tim_3)
		{	
			if(!KeySetDataBK)EfctKeyBK = 0; //若"设置"按键不亮,则"效果"按键不亮
			if(!FaceKeyBK)
			{
				FaceKeyBK |= 0x01;				//若"界面"按键不亮,则"主页"按键默认亮
				FaceKeySet = FaceKeyBK & 0x0F;	//总控模块界面按键功能
			}	
			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;
			TxMessage.StdId = 0x011;
			TxMessage.Data[0] = FaceKeyBK;
			TxMessage.Data[1] = EfctKeyBK;
			TxMessage.Data[2] = ScenKeyBK;
			TxMessage.Data[3] = TalkKeyBK;
			while(((CAN1->TSR>>26)& 0x07) == 0);
			CAN_Transmit(CAN1, &TxMessage);
			
//			tim_3 = 0;	//下面程序任会用到,暂不清零。
		}

//////////////////////////////// ***效果设置*** /////////////////////////////////////////

		if(EffectSetFlg)	//为了使按下"效果"键时,只发送一次
		{	
			EffectSetFlg = 0;
				
			if(KeySetDataBK)//有"设置"键按下,才可能发送效果设置
			{		
				for(i=0;i<20;i++)
				{	
					if(((KeySetDataBK>>i)& 0x01) == 0x01)  //按下哪一个"设置"按键
					{		
						if(EfctKeyBK)		//是否按下"效果"键(或者"效果"键是否有效) 
						{	
							EffectAddr[i][0] = InputState[i][8];//保存话筒输入板地址
//							printf("\rAddr[%d] = 0x%X\n",i,EffectAddr[i][0]);		
							TxMessage.StdId = (((InputState[i][8] & 0xF0)<<4)|(InputState[i][8] & 0x0F))& 0x7FF;
							TxMessage.RTR = CAN_RTR_DATA;
							TxMessage.IDE = CAN_ID_STD;
							TxMessage.DLC = 7;
							switch(EfctKeyBK & 0x0F)  //按下哪一个效果键
							{				
								case (0x01)://效果1
									EffectAddr[i][1] = 1;		//保存对应的效果
									TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
									for(h=1,cnt=0;h<6;h++)
									{	
										TxMessage.Data[h] = EffectData[0][cnt];
										cnt += 2;
									}	
									TxMessage.Data[6] = EffectData[0][10];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									
									TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
									for(h=1,cnt=1;h<6;h++)
									{	
										TxMessage.Data[h] = EffectData[0][cnt];
										cnt += 2;
									}	
									TxMessage.Data[6] = EffectData[0][11];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									break;
														
								case (0x02)://效果2
									EffectAddr[i][1] = 2;		//保存对应的效果
									TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
									for(h=1,cnt=0;h<6;h++)
									{	
										TxMessage.Data[h] = EffectData[1][cnt];
										cnt += 2;
									}	
									TxMessage.Data[6] = EffectData[1][10];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									
									TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
									for(h=1,cnt=1;h<6;h++)
									{	
										TxMessage.Data[h] = EffectData[1][cnt];
										cnt += 2;
									}	
									TxMessage.Data[6] = EffectData[1][11];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									break;
									
								case (0x04)://效果3
									EffectAddr[i][1] = 3;		//保存对应的效果
									TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
									for(h=1,cnt=0;h<6;h++)
									{	
										TxMessage.Data[h] = EffectData[2][cnt];
										cnt += 2;
									}	
									TxMessage.Data[6] = EffectData[2][10];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									
									TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
									for(h=1,cnt=1;h<6;h++)
									{
										TxMessage.Data[h] = EffectData[2][cnt];
										cnt += 2;
									}
									TxMessage.Data[6] = EffectData[2][11];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									break;
								
								case (0x08)://效果4
									EffectAddr[i][1] = 4;		//保存对应的效果	
									TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
									for(h=1,cnt=0;h<6;h++)
									{
										TxMessage.Data[h] = EffectData[3][cnt];
										cnt += 2;
									}
									TxMessage.Data[6] = EffectData[3][10];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									
									TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
									for(h=1,cnt=1;h<6;h++)
									{
										TxMessage.Data[h] = EffectData[3][cnt];
										cnt += 2;
									}
									TxMessage.Data[6] = EffectData[3][11];
									while(((CAN2->TSR>>26)& 0x07) == 0);
									CAN_Transmit(CAN2, &TxMessage);
									break;
								
								default:
									break;									
							}
						}
					}
				}
				//=== 保存"设置效果"信息 ===//
				if(EfctKeyBK)		//是否按下"效果"键(或者"效果"键是否有效)
				{
					if(!ScenKeyBK)	//"场景"按键未按下时(临时场景)
					{
						for(h=0,i=0;i<40;i++)
						{
							ReadEEPData[i++] = EffectAddr[h][0];
							ReadEEPData[i] = EffectAddr[h++][1];
						}
						I2C_EE_PageWrite(ReadEEPData,EEP_EffectAddr_Address,40);
					}
				}
			}
		}

///////////////////////////////// *** 场景设置 *** //////////////////////////////////////
		
		//按下"场景"键,或者取消"场景"键
		if(SceneSetFlag || SceneDelFlag)
		{
			//*** 按下"场景"键 ***//	
			if(SceneSetFlag)	
			{		
				switch(SceneSetFlag)
				{		
					case (0x01):	//场景一
						I2C_EE_BufferRead(ReadEEPData,EEP_ScenNum1_Address,311);
						break;
					case (0x02):	//场景二
						I2C_EE_BufferRead(ReadEEPData,EEP_ScenNum2_Address,311);
						break;
					case (0x04):	//场景三
						I2C_EE_BufferRead(ReadEEPData,EEP_ScenNum3_Address,311);
						break;
					case (0x08):	//场景四
						I2C_EE_BufferRead(ReadEEPData,EEP_ScenNum4_Address,311);
						break;			
					default:				
						break;				
				}				
				SceneSetFlag = 0;
				KeySetDataBK = 0;	//场景中的"设置"键默认无效
				
				//按下"场景"键,临时场景中"设置"键对应的"效果"键无效
				if(EfctKeyBK)EfctKeyBK = 0;
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;
				TxMessage.StdId = 0x011;
				TxMessage.Data[0] = FaceKeyBK;	//默认"主页"按键有效
				TxMessage.Data[1] = EfctKeyBK;	
				TxMessage.Data[2] = ScenKeyBK;
				TxMessage.Data[3] = TalkKeyBK;
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
	
				//=== 推子模块按键状态(场景) ===//
				for(i=0,h=0;i<40;i++)
				{
					TempKeyState[h] = ReadEEPData[i++];		//按键状态
					ScenEffectState[h++] = ReadEEPData[i];	//"设置"键对应的效果	
				}
	
				//=== 推子模块状态(场景) ===//
				h = 0;
				L = 0;
				for(i=40;i<280;i++)			
				{
					InputState[L][h] = ReadEEPData[i];	//输入通道状态设置数据
					h++;
					if(h%12==0)
					{
						L++;
						h=0;
					}
				}
	
				//=== 协议四(0xAD协议)(场景) ===//
				for(h=0,i=280;i<284;i++)	
					HotFireSet[h++] = ReadEEPData[i];	//热线设置数据
				
				//=== 设置输出通道数据(场景) ===//
				for(h=0,i=284;i<304;i++)	
					OutputSet[h++] = ReadEEPData[i]; 	//输出通道状态设置数据

				for(h=0,i=304;i<311;i++)	
					OutputGainSet[h++] = ReadEEPData[i];//输出通道增益设置数据

				SyncMode = OutputGainSet[6];			//同步模式
				
				//=== 场景"设置"按键对应的效果 ===//
				for(i=0;i<20;i++)
				{	
					if(InputState[i][7] == 0x03)
					{	
						EffectAddr[i][0] = InputState[i][8];	//保存话筒输入板地址
						EffectAddr[i][1] = ScenEffectState[i];	//"设置"按键对应的效果
					}
					else
					{
						EffectAddr[i][0] = 0;
						EffectAddr[i][1] = 0;
					}
				}
			}

			//*** 取消"场景"键 ***//
			if(SceneDelFlag)	
			{
//				SceneDelFlag = 0;					
				I2C_EE_BufferRead(TempKeyState,EEP_TempKeyState_Address,20);//读取上一时刻按键状态
				I2C_EE_BufferRead(ReadEEPData,EEP_TempScene_Address,271);	//读取临时状态

				//=== 推子模块状态 ===//
				h = 0;
				L = 0;				
				for(i=0;i<240;i++)	
				{
					InputState[L][h] = ReadEEPData[i];	//输入通道状态设置数据
					h++;
					if(h%12==0)
					{
						L++;
						h=0;
					}
				}
				
				//=== 协议四(0xAD协议) ===//
				for(h=0,i=240;i<244;i++)
					HotFireSet[h++] = ReadEEPData[i];	//热线设置数据
				
				//=== 设置输出通道数据 ===//		
				for(h=0,i=244;i<264;i++)
					OutputSet[h++] = ReadEEPData[i];	//输出通道状态设置数据

				for(h=0,i=264;i<271;i++)				//输出通道增益设置数据
					OutputGainSet[h++] = ReadEEPData[i];//(OutputGainSet[6]为一个字节SyncMode)
				
				SyncMode = OutputGainSet[6];			//同步模式
				
				//=== 读取临时场景效果设置信息 ===//
				I2C_EE_BufferRead(ReadEEPData,EEP_EffectAddr_Address,40);
				h = 0;
				L = 0;
				for(i=0;i<40;i++)
				{
					EffectAddr[L][h] = ReadEEPData[i];
					h++;
					if(h%2 == 0)
					{
						L++;
						h=0;
					}
				}			
			}
			
			//////////////////// *** 设置输出通道数据 *** /////////////////////
			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;
			if(OutputAddr[0] != 0)
			{	
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i];
				TxMessage.StdId = OutputAddr[0];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
			}	
			if(OutputAddr[1] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+4];
				TxMessage.StdId = OutputAddr[1];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
			}
			if(OutputAddr[2] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+8];
				TxMessage.StdId = OutputAddr[2];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
			}
			if(OutputAddr[3] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+12];
				TxMessage.StdId = OutputAddr[3];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
			}
			if(OutputAddr[4] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+16];

⌨️ 快捷键说明

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