📄 main.c
字号:
TxMessage.Data[0] = (InputState[i][7]<<4)|(i-15);//高4位信号格式,低4位数据包编号
TxMessage.Data[1] = InputState[i][8];
for(h=2;h<8;h++)
TxMessage.Data[h] = InputState[i][h-1]; //6字节汉字码
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
TxMessage.StdId = 0x501;
for(h=0,i=16;i<20;i++)
{
TxMessage.Data[h++] = TempKeyState[i];
KeyDataBK[i] = TempKeyState[i];
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
KeySetBegin = 1;
}
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
//刷新"效果"按键(即按下推子某个"设置"键时,若已经设置效果,则对应的"效果"键灯亮)
if(KeySetBegin)
{
KeySetBegin = 0;
KeySetDataBK = 0;
for(i=0;i<20;i++)
{
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //是否按下"设置"按键
{
// printf("TempKeyState[%d] = 0x%X\n",i,TempKeyState[i]);
EfctKeyBK = 0; //"效果"键清零
KeySetDataBK |= 1<<i; //哪一个"设置"键有效
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;
break;
}
}
}
//输入板卡地址
I2C_EE_BufferRead(ReadEEPData,EEP_Input_Address,10);
for(i=0,h=0;i<10;i++)
{
if(ReadEEPData[i])
{
InputAddr[h] = ((ReadEEPData[i]<<8)|(ReadEEPData[i+1]))& 0x7FF;
// printf("(0).InputAddr[%d] = 0x%X\n",h,InputAddr[h]);
i++;
h++;
}
else
{
i++;
h++;
}
}
//输出板卡地址
I2C_EE_BufferRead(ReadEEPData,EEP_Output_Address,10);
for(i=0,h=0;i<10;i++)
{
if(ReadEEPData[i])
{
OutputAddr[h] = ((ReadEEPData[i]<<8)|(ReadEEPData[i+1]))& 0x7FF;
// printf("(0).OutputAddr[%d] = 0x%X\n",h,OutputAddr[h]);
i++;
h++;
}
else
{
i++;
h++;
}
}
I2C_EE_ClearWrite(EEP_Tuizi_Address,48); //清空区域(EEP_Tuizi_Input_Output_Address)
}
for(i=0;i<12;i++) //(协议二:0xAB)(默认值:-40)
RxOutdBData[i] = 0xD8;
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
Delay(20000);
GPIO_SetBits(GPIOE, GPIO_Pin_0);
Delay(40000);
I2C_ByteWrite(0x20,0x00,0x00);
I2C_ByteWrite(0x20,0x01,0x88);
I2C_ByteWrite(0x20,0x02,0x02);
I2C_ByteWrite(0x20,0x03,0x50);
I2C_ByteWrite(0x20,0x04,0x80);
I2C_ByteWrite(0x20,0x05,0x85);
I2C_ByteWrite(0x20,0x06,0x16);
while(1)
{
//=============================== 远程帧 ================================//
//推子模块初始化远程帧
if(startflg1>0)
{
if(TuiziAddr[0] != 0)
{
printf("\rTuiziAddr[0] = 0x%X\n",TuiziAddr[0]);
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.StdId = TuiziAddr[0]; //0x100
for(i=0;i<4;i++)
{
TxMessage.Data[0] = (InputState[i][7]<<4)|(i+1); //高4位信号格式,低4位数据包编号
TxMessage.Data[1] = InputState[i][8]; //输入模块地址
for(h=2;h<8;h++)
TxMessage.Data[h] = InputState[i][h-1]; //6字节汉字码
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
//=== 初始化上一时刻按键状态 ===//
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
TxMessage.StdId = 0x101;
for(i=0;i<4;i++)
{
TxMessage.Data[i] = TempKeyState[i];
KeyDataBK[i] = TempKeyState[i];
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
KeySetBegin = 1;
}
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
startflg1 &= ~(1<<0);
}
if(TuiziAddr[1] != 0) //地址2推子
{
printf("\rTuiziAddr[1] = 0x%X\n",TuiziAddr[1]);
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.StdId = TuiziAddr[1];
for(i=4;i<8;i++)
{
TxMessage.Data[0] = (InputState[i][7]<<4)|(i-3); //高4位信号格式,低4位数据包编号
TxMessage.Data[1] = InputState[i][8]; //输入模块地址
for(h=2;h<8;h++)
TxMessage.Data[h] = InputState[i][h-1]; //6字节汉字码
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
//=== 初始化上一时刻按键状态 ===//
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
TxMessage.StdId = 0x201;
for(h=0,i=4;i<8;i++)
{
TxMessage.Data[h++] = TempKeyState[i];
KeyDataBK[i] = TempKeyState[i];
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
KeySetBegin = 1;
}
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
startflg1 &= ~(1<<1);
}
if(TuiziAddr[2] != 0) //地址3推子
{
printf("\rTuiziAddr[2] = 0x%X\n",TuiziAddr[2]);
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.StdId = TuiziAddr[2];
for(i=8;i<12;i++)
{
TxMessage.Data[0] = (InputState[i][7]<<4)|(i-7); //高4位信号格式,低4位数据包编号
TxMessage.Data[1] = InputState[i][8];
for(h=2;h<8;h++)
TxMessage.Data[h] = InputState[i][h-1]; //6字节汉字码
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
//=== 初始化上一时刻按键状态 ===//
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
TxMessage.StdId = 0x301;
for(h=0,i=8;i<12;i++)
{
TxMessage.Data[h++] = TempKeyState[i];
KeyDataBK[i] = TempKeyState[i];
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
KeySetBegin = 1;
}
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
startflg1 &= ~(1<<2);
}
if(TuiziAddr[3] != 0) //地址4推子
{
printf("\rTuiziAddr[3] = 0x%X\n",TuiziAddr[3]);
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.StdId = TuiziAddr[3];
for(i=12;i<16;i++)
{
TxMessage.Data[0] = (InputState[i][7]<<4)|(i-11);//高4位信号格式,低4位数据包编号
TxMessage.Data[1] = InputState[i][8];
for(h=2;h<8;h++)
TxMessage.Data[h] = InputState[i][h-1]; //6字节汉字码
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
//=== 初始化上一时刻按键状态 ===//
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
TxMessage.StdId = 0x401;
for(h=0,i=12;i<16;i++)
{
TxMessage.Data[h++] = TempKeyState[i];
KeyDataBK[i] = TempKeyState[i];
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
KeySetBegin = 1;
}
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
startflg1 &= ~(1<<3);
}
if(TuiziAddr[4] != 0) //地址5推子
{
printf("\rTuiziAddr[4] = 0x%X\n",TuiziAddr[4]);
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.StdId = TuiziAddr[4];
for(i=16;i<20;i++)
{
TxMessage.Data[0] = (InputState[i][7]<<4)|(i-15);//高4位信号格式,低4位数据包编号
TxMessage.Data[1] = InputState[i][8];
for(h=2;h<8;h++)
TxMessage.Data[h] = InputState[i][h-1]; //6字节汉字码
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
//=== 初始化上一时刻按键状态 ===//
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
TxMessage.StdId = 0x501;
for(h=0,i=16;i<20;i++)
{
TxMessage.Data[h++] = TempKeyState[i];
KeyDataBK[i] = TempKeyState[i];
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
KeySetBegin = 1;
}
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
startflg1 &= ~(1<<4);
}
//刷新"效果"按键(即按下推子某个"设置"键时,若已经设置效果,则对应的"效果"键灯亮)
if(KeySetBegin)
{
KeySetBegin = 0;
KeySetDataBK = 0;
for(i=0;i<20;i++)
{
if(((TempKeyState[i]>>3)& 0x01) == 0x01) //是否按下"设置"按键
{
// printf("TempKeyState[%d] = 0x%X\n",i,TempKeyState[i]);
EffectSetFlg = 1; //"效果"设置标记(发送效果)
EfctKeyBK = 0; //"效果"键清零
KeySetDataBK |= 1<<i; //哪一个"设置"键有效
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;
break;
}
}
// if(!FaceKeyBK)FaceKeyBK |= 0x01;//若"界面"按键不亮,则"主页"按键默认亮
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; //FaceKeyBK | 0x01
TxMessage.Data[1] = EfctKeyBK;
TxMessage.Data[2] = ScenKeyBK;
TxMessage.Data[3] = TalkKeyBK;
while(((CAN1->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN1, &TxMessage);
}
}
//输入模块初始化远程帧
if(InputFlag>0)
{
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;
// TxMessage.Data[0] = 0xFA;
if(InputAddr[0] != 0)
{
printf("\rInputAddr[0] = 0x%X\n",InputAddr[0]);
TxMessage.Data[0] = (AddVoltage[0][0]|(AddVoltage[0][1]<<1)|
(AddVoltage[0][2]<<2)|(AddVoltage[0][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[0];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
InputFlag &= ~(1<<0); //0xFE;
}
if(InputAddr[1] != 0)
{
printf("\rInputAddr[1] = 0x%X\n",InputAddr[1]);
TxMessage.Data[0] = (AddVoltage[1][0]|(AddVoltage[1][1]<<1)|
(AddVoltage[1][2]<<2)|(AddVoltage[1][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[1];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
InputFlag &= ~(1<<1); //0xFD;
}
if(InputAddr[2] != 0)
{
printf("\rInputAddr[2] = 0x%X\n",InputAddr[2]);
TxMessage.Data[0] = (AddVoltage[2][0]|(AddVoltage[2][1]<<1)|
(AddVoltage[2][2]<<2)|(AddVoltage[2][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[2];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
InputFlag &= ~(1<<2); //0xFB;
}
if(InputAddr[3] != 0)
{
printf("\rInputAddr[3] = 0x%X\n",InputAddr[3]);
TxMessage.Data[0] = (AddVoltage[3][0]|(AddVoltage[3][1]<<1)|
(AddVoltage[3][2]<<2)|(AddVoltage[3][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[3];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
InputFlag &= ~(1<<3); //0xF7;
}
if(InputAddr[4] != 0)
{
printf("\rInputAddr[4] = 0x%X\n",InputAddr[4]);
TxMessage.Data[0] = (AddVoltage[4][0]|(AddVoltage[4][1]<<1)|
(AddVoltage[4][2]<<2)|(AddVoltage[4][3]<<3))& 0x0F;
TxMessage.StdId = InputAddr[4];
while(((CAN2->TSR>>26)& 0x07) == 0);
CAN_Transmit(CAN2, &TxMessage);
InputFlag &= ~(1<<4); //0xEF;
}
}
//输出模块初始化远程帧
if(OutputFlag>0)
{
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 4;
if(OutputAddr[0] != 0)
{
printf("\rOutputAddr[0] = 0x%X\n",OutputAddr[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);
OutputFlag &= ~(1<<0);
}
if(OutputAddr[1] != 0)
{
printf("\rOutputAddr[1] = 0x%X\n",OutputAddr[1]);
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);
OutputFlag &= ~(1<<1);
}
if(OutputAddr[2] != 0)
{
printf("\rOutputAddr[2] = 0x%X\n",OutputAddr[2]);
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);
OutputFlag &= ~(1<<2);
}
if(OutputAddr[3] != 0)
{
printf("\rOutputAddr[3] = 0x%X\n",OutputAddr[3]);
for(i=0;i<4;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -