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

📄 main.c

📁 LWIP在STM32裸机上的移植
💻 C
📖 第 1 页 / 共 5 页
字号:
					TxMessage.Data[i] = OutputSet[i+12];	
				TxMessage.StdId = OutputAddr[3];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				OutputFlag &= ~(1<<3);
			}
			if(OutputAddr[4] != 0)
			{
				printf("\rOutputAddr[4] = 0x%X\n",OutputAddr[4]);
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+16];	
				TxMessage.StdId = OutputAddr[4];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				OutputFlag &= ~(1<<4);
			}
		}
		//总控模块初始化远程帧
		if(startmain)
		{
			startmain = 0;
			
			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;
			TxMessage.StdId = 0x02B;
			TxMessage.Data[0] = RxOutdBData[0]-24;	//播出dBFS
			TxMessage.Data[1] = RxOutdBData[1]-24;	
			TxMessage.Data[2] = RxOutdBData[6]-24;	//主持人监听dBFS
			TxMessage.Data[3] = RxOutdBData[7]-24;
			while(((CAN1->TSR>>26)& 0x07) == 0);
			CAN_Transmit(CAN1, &TxMessage);

			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 7;
			TxMessage.StdId = 0x021;
			for(i=0;i<Tablen;i++)
			{		
				TxMessage.Data[0] = i+1;
				for(h=0;h<6;h++)
					TxMessage.Data[h+1] = PlayTable[i][h];
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
			}
		}
						
	//============================== 推子模块 ===============================//
		
		//按键响应(标识符低8位为1表示数据为按键值)
		if(can1_flag>0)
		{	
			//判断"设置"按键,只能有一个按键有效
			KeySetData = 0;
			for(i=0;i<20;i++)
			{	
				if((InputState[i][7] & 0x0F)== 0x03)  //与推子模块绑定的是否是话筒输入板
				{	
					if(((KeyData[i]>>3)& 0x01) == 0x01)
					{	
						KeySetData |= 1<<i;			  //记录哪些"设置"按键按下(0-19)
					}	
				}
				else
				{		
					KeyData[i] &= ~(1<<3);	//未与话筒输入板绑定,则"设置"键无效	
				}	
			}	

			if(KeySetData>0)	//有"设置"按键按下的时候再判断(必须有此判断)
			{					
				if((KeySetDataBK & KeySetData) == 0)//按下不同的"设置"按键
				{	
					KeySetDataBK = 0;
					
					for(i=0;i<20;i++)		//只能有一个"设置"键有效
					{	
						if(((KeySetData>>i)& 0x01) == 0x01)
						{	
							KeySetDataBK |= 1<<i;		//KeySetDataBK ^= 1<<i;
							
							//按下有效"设置"键才发送效果设置(按下"效果"键,只发送一次)
							//因为不同"设置"键可能对应于不同效果,若按下不同的"设置"键,
							//则对应的"效果"键亮,也发送一次效果 (*** 设置效果记忆 ***)
							//可能并未按下"效果"键,只是记忆上次的效果设置
							EffectSetFlg = 1;
							
							break;	
						}							
					}		
				}			
				else	//按下相同的"设置"按键
				{					
					KeySetDataBK = 0;
					EffectSetFlg = 0;
				}
			}

			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;

			//推子模块1有键按下
			if(((can1_flag>>0)& 0x01) == 0x01)
			{	
				can1_flag &= ~(1<<0);
				
				h = 0;
				for(i=0;i<4;i++)
				{	
					cnt = 6;
					while(cnt)
					{
						cnt--;
						if(((KeyData[i]>>cnt) & 0x01) == 0x01)
							KeyDataBK[i] ^= 1<<cnt;
					}
					KeyData[i] = 0;

					if(KeySetData)			//处理"设置"按键
					{
						KeyRefresh = 1;
						if(((KeySetDataBK>>i)& 0x01) == 0x01) 
							KeyDataBK[i] |= 1<<3;
						else
							KeyDataBK[i] &= ~(1<<3);
					}
					if(HotFireClear == i)	//处理"热线"按键
						KeyDataBK[i] &= ~(1<<1);

					TxMessage.Data[h] = KeyDataBK[i];
					TempKeyState[i] = KeyDataBK[i];
					h++;					
				}	
				TxMessage.StdId = 0x101;
				CAN_Transmit(CAN1, &TxMessage);
			}

			//推子模块2有键按下
			if(((can1_flag>>1)& 0x01) == 0x01)
			{
				can1_flag &= ~(1<<1);
				
				h = 0;
				for(i=4;i<8;i++)
				{
					cnt = 6;
					while(cnt)
					{
						cnt--;
						if(((KeyData[i]>>cnt) & 0x01) == 0x01)
							KeyDataBK[i] ^= 1<<cnt;
					}
					KeyData[i] = 0;

					if(KeySetData)			//处理"设置"按键
					{
						KeyRefresh = 1;
						if(((KeySetDataBK>>i)& 0x01) == 0x01) 
							KeyDataBK[i] |= 1<<3;
						else
							KeyDataBK[i] &= ~(1<<3);
					}
					if(HotFireClear == i)	//处理"热线"按键
						KeyDataBK[i] &= ~(1<<1);

					TxMessage.Data[h] = KeyDataBK[i];
					TempKeyState[i] = KeyDataBK[i];
					h++;
				}	
				TxMessage.StdId = 0x201;
				CAN_Transmit(CAN1, &TxMessage);
			}

			//推子模块3有键按下
			if(((can1_flag>>2)& 0x01) == 0x01)
			{
				can1_flag &= ~(1<<2);

				h = 0;
				for(i=8;i<12;i++)
				{
					cnt = 6;
					while(cnt)
					{
						cnt--;
						if(((KeyData[i]>>cnt) & 0x01) == 0x01)
							KeyDataBK[i] ^= 1<<cnt;
					}
					KeyData[i] = 0;

					if(KeySetData)			//处理"设置"按键
					{
						KeyRefresh = 1;
						if(((KeySetDataBK>>i)& 0x01) == 0x01) 
							KeyDataBK[i] |= 1<<3;
						else
							KeyDataBK[i] &= ~(1<<3);
					}
					if(HotFireClear == i)	//处理"热线"按键
						KeyDataBK[i] &= ~(1<<1);

					TxMessage.Data[h] = KeyDataBK[i];
					TempKeyState[i] = KeyDataBK[i];
					h++;
				}					
				TxMessage.StdId = 0x301;
				CAN_Transmit(CAN1, &TxMessage);
			}

			//推子模块4有键按下
			if(((can1_flag>>3)& 0x01) == 0x01)
			{
				can1_flag &= ~(1<<3);

				h = 0;
				for(i=12;i<16;i++)
				{	
					cnt = 6;
					while(cnt)
					{
						cnt--;
						if(((KeyData[i]>>cnt) & 0x01) == 0x01)
							KeyDataBK[i] ^= 1<<cnt;
					}
					KeyData[i] = 0;

					if(KeySetData)			//处理"设置"按键
					{
						KeyRefresh = 1;
						if(((KeySetDataBK>>i)& 0x01) == 0x01) 
							KeyDataBK[i] |= 1<<3;
						else
							KeyDataBK[i] &= ~(1<<3);
					}
					if(HotFireClear == i)	//处理"热线"按键
						KeyDataBK[i] &= ~(1<<1);

					TxMessage.Data[h] = KeyDataBK[i];
					TempKeyState[i] = KeyDataBK[i];
					h++;
				}					
				TxMessage.StdId = 0x401;
				CAN_Transmit(CAN1, &TxMessage);
			}

			//推子模块5有键按下
			if(((can1_flag>>4)& 0x01) == 0x01)
			{
				can1_flag &= ~(1<<4);

				h = 0;
				for(i=16;i<20;i++)
				{					
					cnt = 6;
					while(cnt)
					{
						cnt--;
						if(((KeyData[i]>>cnt) & 0x01) == 0x01)
							KeyDataBK[i] ^= 1<<cnt;
					}
					KeyData[i] = 0;

					if(KeySetData)			//处理"设置"按键
					{
						KeyRefresh = 1;
						if(((KeySetDataBK>>i)& 0x01) == 0x01) 
							KeyDataBK[i] |= 1<<3;
						else
							KeyDataBK[i] &= ~(1<<3);
					}
					if(HotFireClear == i)	//处理"热线"按键
						KeyDataBK[i] &= ~(1<<1);

					TxMessage.Data[h] = KeyDataBK[i];
					TempKeyState[i] = KeyDataBK[i];
					h++;
				}
				TxMessage.StdId = 0x501;
				CAN_Transmit(CAN1, &TxMessage);
			}	 
			if(!ScenKeyBK)	//"场景"按键未按下时(临时场景)
				I2C_EE_PageWrite(TempKeyState,EEP_TempKeyState_Address,20);
		}

		//按键扫描 + "设置"按键扫描
		if((tim_3)||(KeyRefresh == 1))
		{	
			if(KeyRefresh == 1)	//所有推子模块"设置"按键扫描(保证只有一个"设置"按键有效)
			{	
				for(i=0;i<20;i++)	//清除前一个"设置"按键
				{	
					if(((KeySetDataBK>>i)& 0x01) == 0x01) continue;	//保留最新"设置"按键
					KeyDataBK[i] &= ~(1<<3);						//清除以前"设置"按键
					TempKeyState[i] = KeyDataBK[i];					//保存临时场景按键状态	
				}
				if(!ScenKeyBK)	//"场景"按键未按下时(临时场景)
					I2C_EE_PageWrite(TempKeyState,EEP_TempKeyState_Address,20);		
			}			
//			KeyRefresh = 0;		//下面还要用,在最后清零

			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;
			
			if(TuiziAddr[0] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = KeyDataBK[i];
				TxMessage.StdId = 0x101;
				while(((CAN1->TSR>>26)& 0x07) == 0);//只有3个发送邮箱,若都满,则数据会丢失
				CAN_Transmit(CAN1, &TxMessage);		//等待有空邮箱时再发送。				
			}

			if(TuiziAddr[1] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = KeyDataBK[i+4];
				TxMessage.StdId = 0x201;
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
			}
			
			if(TuiziAddr[2] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = KeyDataBK[i+8];
				TxMessage.StdId = 0x301;
				while(((CAN1->TSR>>26)& 0x07) == 0); 
				CAN_Transmit(CAN1, &TxMessage);
			}		 
			
			if(TuiziAddr[3] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = KeyDataBK[i+12];
				TxMessage.StdId = 0x401;
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
			}

			if(TuiziAddr[4] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = KeyDataBK[i+16];
				TxMessage.StdId = 0x501;
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
			}

			//刷新"效果"按键(即按下推子某个"设置"键时,若已经设置效果,则对于的"效果"键灯亮)
			//效果设置标记(EffectSetFlg)在按下有效"设置"键时已经置位,此处仅刷新"效果"键状态
			//发送效果帧在下面程序中进行。。。
			if(KeyRefresh)
			{
				for(i=0;i<20;i++)
				{
//					if((InputState[i][7] & 0x0F)== 0x03){	//与推子模块绑定的是否是话筒输入
					if(((KeySetDataBK>>i)& 0x01) == 0x01)  	//是否按下"设置"按键
					{	
						EfctKeyBK = 0;					//"效果"键清零				
						if(EffectAddr[i][1] == 1)		//效果一
							EfctKeyBK |= 1<<0;	
						else if(EffectAddr[i][1] == 2)	//效果二
							EfctKeyBK |= 1<<1;
						else if(EffectAddr[i][1] == 3)	//效果三
							EfctKeyBK |= 1<<2;
						else if(EffectAddr[i][1] == 4)	//效果四
							EfctKeyBK |= 1<<3;
						else
							continue;
						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);	
						
						break;
					}									
				}		
			}
			KeyRefresh = 0;					
		}
																						
	//============================== 总控模块 ===============================//
		
		//判断总控模块是否有按键按下
		if((FaceKey>0)||(ScenKey>0)||(EfctKey>0)||(TalkKey>0))	
		{
			if(FaceKey)		//界面按键(六个个按键,每次只能显示一个按键,而且一直亮)
			{
				if((FaceKeyBK & FaceKey) == 0)		
				{
					FaceKeyBK = 0;
					for(i=0;i<6;i++)
					{
						if(((FaceKey>>i)& 0x01) == 0x01)
						{
							FaceKeyBK |= 1<<i;
							break;
						}			
					}		
					FaceKeySet = FaceKeyBK & 0x0F;	//总控模块界面按键功能
				}
				else 
					FaceKeySet = FaceKeyBK & 0x0F;	//总控模块界面按键功能
								
				FaceKey = 0;	
			}

			if(ScenKey)		//场景按键(四个按键,每次只能显示一个按键)
			{	
				if((ScenKeyBK & ScenKey) == 0)		
				{	
					ScenKeyBK = 0;
					for(i=0;i<4;i++)
					{		
						if(((ScenKey>>i)& 0x01) == 0x01)
						{			
							ScenKeyBK ^= 1<<i;
							break;
						}		
					}
					SceneDelFlag = 0;		
					SceneSetFlag = ScenKeyBK & 0x0F;//标记按下"场景"键		
				}			
				else
				{	
					SceneSetFlag = 0;

⌨️ 快捷键说明

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