关于STM32红外遥控器的研究与分析
?前情提要:
STM32 紅外遙控器詳解_Lzjusc2017的博客-CSDN博客
?關于左移右移的問題:程序如圖。
?????? 正點原子程序寫的是左移,所以接收到的數據依次是同步碼頭、地址碼、地址反碼、數據碼、數據反碼、連發碼。但是中間32位數據(RmtRec),每一部分(一共四部分)的位都是相反的,因為信號是低位發送,所以先接收到低位,例如發送按鍵1,應該是00001100(0X0C),但是左移接收便是00110000(0x30)。
??? 【如果在此基礎上直接改成右移,那么這32位數據(RmtRec)的數據最終順序是數據反碼、數據碼、地址反碼、地址碼(猜測,還未驗證)。改成右移之后發現程序出現問題,后續有時間會再更新,找到問題所在。。。RmtRec|=0 和 RmtRec&=0 在紅框內應該是一樣的。但按理說應該使用&,有0則0】
???? 為了能夠跟遙控器的鍵值對應上,我在鍵盤掃描函數中增加了顛倒位操作,把錯誤的數據碼改成更正過來。程序如下:
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 xxxxxxxxt2=(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;?? ?
?? ??? ??? ??? ?}
返回的值可以跟按鍵值一一對應。
?注:待完善。
總結
以上是生活随笔為你收集整理的关于STM32红外遥控器的研究与分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 香农与信息论三大定律
- 下一篇: 数据库系统概述--数据库习题