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

📄 backup5.c

📁 LWIP在STM32裸机上的移植
💻 C
📖 第 1 页 / 共 3 页
字号:
//backup5.c

//======================= 01-02 =========================//

//原来效果处理程序:
///////////////////////////////////////////////////////////////////////////////

//	u8 EffectDelFlg = 0;//效果取消标记(为了使"效果"键亮时,熄灭效果键,发送取消效果帧)

//					for(i=0;i<4;i++)
//					{
//						if(((EfctKeyBK>>i)& 0x01) == 0x01)
//						{
//							EffectDelFlg &= ~(1<<i);	//清零
//							break;
//						}
//					}


//[**备份**]
//"效果"按键处理程序:
///////////////////////////////////////////////////////////////////////////////

			if(EfctKey)		//效果按键(四个按键,每次只能显示一个按键)
			{	
				if((EfctKeyBK & EfctKey) == 0)	//按下不同"效果"键(设置不同效果)		
				{		
					EfctKeyBK = 0;
					//不同"效果"键按下时发送效果设置(按下"效果"键,只发送一次)
					//不用判断 EffectSetFlg 哪一位置位,因为一次只有一个"设置"键有效
					//EffectSetFlg : 一位代表一个推子模块是否有"设置"按键按下			
					EffectSetFlg |= 0x1F;	
					for(i=0;i<4;i++)
					{
						if(((EfctKey>>i)& 0x01) == 0x01)
						{
							EfctKeyBK ^= 1<<i;
							break;
						}
					}
				}
				else	//按下相同"效果"键(取消效果)
				{	
					//推子模块"设置"键按下时,"效果"键才有效
					for(i=0;i<20;i++)
					{					
//						if(((EfctKeyBK>>i)& 0x01) == 0x01)		//哪个"效果"键按下
						if(((KeySetDataBK>>i)& 0x01) == 0x01)	//哪个"设置"键按下 
						{
							if(EffectAddr[i][1])		//某路推子"设置"键是否已经设置效果(与话筒输入板绑定)
							{	
//								EffectDelFlg |= 1<<i;	//"效果"键亮时,再次按下"效果"键,发送取消效果帧
								EffectAddr[i][1] = 0;	//取消某路推子"设置"键设置的效果
								TxMessage.StdId = (((EffectAddr[i][0] & 0xF0)<<4)|(EffectAddr[i][1] & 0x0F))& 0x7FF;
								printf("Effect 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;
				}

				EfctKey = 0;
			}

//[**备份**]
//推子模块"设置"按键处理程序:
///////////////////////////////////////////////////////////////////////////////

			if(KeySetData>0)	//有"设置"按键按下的时候再判断(必须有此判断)
			{					
				printf("KeySetData = 0x%X\n",KeySetData);
				if((KeySetDataBK & KeySetData) == 0)//按下不同的"设置"按键
				{	
//					EffectSetFlg = 1;		//按下有效"设置"键才发送效果设置
					KeySetDataBK = 0;
					for(i=0;i<20;i++)		//只能有一个"设置"键亮
					{	
						if(((KeySetData>>i)& 0x01) == 0x01)
						{	
							KeySetDataBK |= 1<<i;		//KeySetDataBK ^= 1<<i;
							
							//按下有效"设置"键才发送效果设置(按下"效果键",只发送一次)
							//(一个推子模块4个"设置"按键,只有一个"设置"键有效)
							if(i<4)
								EffectSetFlg |= 1<<0;	//推子模块1
							else if(i<8)
								EffectSetFlg |= 1<<1;	//推子模块2
							else if(i<12)
								EffectSetFlg |= 1<<2;	//推子模块3
							else if(i<16)
								EffectSetFlg |= 1<<3;	//推子模块4
							else if(i<20)
								EffectSetFlg |= 1<<4;	//推子模块5
							else
								EffectSetFlg = 0;
							
							break;
						}	
					}		
				}			
				else								//按下相同的"设置"按键
					KeySetDataBK = 0;
			}	

			//推子模块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((InputState[i][7] & 0x0F)!= 0x03)
//						KeyDataBK[i] &= ~(1<<3);
					TxMessage.Data[h] = KeyDataBK[i];
					TempKeyState[i] = KeyDataBK[i];
					h++;					
				}	
				TxMessage.StdId = 0x101;
				CAN_Transmit(CAN1, &TxMessage);
			}


//[**备份**]
//原来"设置"按键扫描程序:
/////////////////////////////////////////////////////////////////////////////////////
		//"设置"按键扫描
		if((KeyRefresh == 1))	//(tim_3)||
		{	
			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;
				h = 0;
				while(((CAN1->TSR>>26)& 0x07) == 0);//只有3个发送邮箱,若都满,则数据会丢失
//				{									//等待有空邮箱时再发送。
//					h++;
//					if(h>250)break;
//				}
				CAN_Transmit(CAN1, &TxMessage);
			}

			if(TuiziAddr[1] != 0)
			{
				for(i=0;i<4;i++)
					TxMessage.Data[i] = KeyDataBK[i+4];
				TxMessage.StdId = 0x201;
				h = 0;
				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);
			}

			//刷新效果按键(即按下推子某路"设置"键时,若已经设置效果,则对于的"效果"键灯亮)
			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;
					}									
				}		
			}	
//			tim_3 = 0;				
		}

//[**备份**]
//(New)效果设置程序:
//////////////////////////////// ***效果设置*** /////////////////////////////////////////

		if(KeySetDataBK)//有"设置"键按下,才可能发送效果设置
		{	
			for(i=0;i<20;i++)
			{	
				if(((KeySetDataBK>>i)& 0x01) == 0x01)  //按下哪一个"设置"按键
				{	
					if(EffectSetFlg)		//为了使按下"效果"键时,只发送一次
					{	
						EffectSetFlg = 0;

						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;

⌨️ 快捷键说明

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