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