对码原理:遥控器发出对码指令,灯具根据接收的指令,对比EEPROM存储的UID,一致则处理;未找到则,将当前第一个UID清除,并存储改UID到序列末尾。
清码原理:遥控器发送清码指令,灯具根据接收指令,对比EEPROM的UID,一致则返回UID组数据,并执行清码操作(清除EEPROM存储的UID);未找到则不执行。
1.检测UID是否一致
uint8_t MatchIDs(uint8_t *Id) //ID匹配
{
uint8_t i,j;
uint8_t matchflag;
for(i=0;i<4;i++)
{
matchflag=0;
for(j=0;j<4;j++)
{
if(Id[j+1]==RemoteID[i][j]) //接收ID值和灯组ID一致
{
matchflag++;
}
}
if(matchflag==4)
{
if((Id[5]==RemoteID[i][4]) || (Id[5]==0xDF)) //分组序号能对应上
{
RemoteMatchNum=i; //组数赋值
return 1;
}
}
}
RemoteMatchNum=0xff;
return 0;
}
2.对码操作
void MatchCode(uint8_t *cmd) //对码
{
uint8_t i,j;
uint8_t countx;
for(i=0;i<4;i++)
{
countx=0;
for(j=0;j<4;j++)
{
if(cmd[j+1]==RemoteID[i][j])
{
countx++;
}
}
if(countx>=4) //对码值已经之前有存储过
{
return; //跳出
}
}
if(cmd[5]==0xDF) //分组值为0xDF
{
return;
}
for(i=3;i>0;i--)
{
for(j=0;j<5;j++)
{
RemoteID[i][j]=RemoteID[i-1][j]; //遥控码当前ID用低位数组赋值
}
}
for(i=0;i<5;i++)
{
RemoteID[0][i]=cmd[i+1]; //遥控码最低数组赋值
}
StoreIds(); //保存ID
Flicker=3; //闪烁3次
FlickerSpeed=10; //速度等级为10
MatchCodeEn=0; //对码清码失能
}
3.清码操作
void ClearCode(void) //清码
{
uint8_t i,j;
i=RemoteMatchNum; //组数值赋值
while(i)
{
for(j=0;j<5;j++)
{
RemoteID[i][j]=RemoteID[i-1][j]; //当前ID被下一列ID覆盖
}
i--;
}
RemoteID[0][0]=0xFF; //id //最低一组UID码清零
RemoteID[0][1]=0xFF; //id
RemoteID[0][2]=0xFF; //id
RemoteID[0][3]=0xFF; //id
RemoteID[0][4]=0xFF; //组
StoreIds();
Flicker=6; //闪烁6次
MatchCodeEn=0; //对码清码失能
FlickerSpeed=3; //速度等级为3
}
标签:UID,对码,RF2.4,void,清码,uint8,EEPROM
From: https://www.cnblogs.com/logicexpression/p/17540482.html