?前情提要:
STM32 红外遥控器详解_Lzjusc2017的博客-CSDN博客
?关于左移右移的问题:程序如图。
?????? 正点原子程序写的是左移,所以接收到的数据依次是同步码头、地址码、地址反码、数据码、数据反码、连发码。但是中间32位数据(RmtRec),每一部分(一共四部分)的位都是相反的,因为信号是低位发送,所以先接收到低位,例如发送按键1,应该是00001100(0X0C),但是左移接收便是00110000(0x30)。
??? 【如果在此基础上直接改成右移,那么这32位数据(RmtRec)的数据最终顺序是数据反码、数据码、地址反码、地址码(猜测,还未验证)。改成右移之后发现程序出现问题,后续有时间会再更新,找到问题所在。】
???? 为了能够跟遥控器的键值对应上,我在键盘扫描函数中增加了颠倒位操作,把错误的数据码改成更正过来。程序如下:
u8 Remote_Scan(void)
{
u8 sta=0;
u8 resta=0;
u8 t1,t2,i,x;
if(RmtSta&(1<<6))//得到一个按键的所有信息了
{
t1=RmtRec>>24; //得到地址码,RmtRec最高的8位,通过右移位变为了00000000 00000000 00000000 xxxxxxxx
t2=(RmtRec>>16)&0xff; //得到地址反码 ,因为已知地址码是0,所以通过与全1相与得到地址反码
if((t1==(u8)~t2)&&t1==0)//检验遥控识别码(ID)及地址 :(u8)是只对低8位进行判断
{
t1=RmtRec>>8; //控制码
t2=RmtRec; //控制反码(低8位
if(t1==(u8)~t2)sta=t1;//键值正确:(u8)是只对低8位进行判断
for(i=0;i<7;i++) //相当于移位了七次,i从0一直到6
{
x = sta>>i&(0x01);
resta=resta|x;
resta<<=1;
}
}
if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了
{
RmtSta&=~(1<<6);//清除接收到有效按键标识
RmtCnt=0; //清除按键次数计数器
}
}
return resta;
}
通过该段代码解决了问题:
????????? for(i=0;i<7;i++)? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ????? x = sta>>i&(0x01); ?? ??? ??? ??? ??? ??? resta=resta|x; ?? ??? ??? ??? ??? ??? resta<<=1;?? ? ?? ??? ??? ??? ?}
返回的值可以跟按键值一一对应。
?注:待完善。
|