📄 main.c
字号:
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 + -