找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1922|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

紅外重復(fù)碼及按鍵切換流暢

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
紅外解碼后值怎么處理比較流暢。還有要按住處理重復(fù)碼的時(shí)候

1.PNG (9.37 KB, 下載次數(shù): 55)

1.PNG

2.PNG (21.61 KB, 下載次數(shù): 55)

2.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:772400 發(fā)表于 2023-3-7 17:22 | 只看該作者
時(shí)鐘4M\4T的,按鍵快速切換感覺(jué)不流暢有點(diǎn)阻塞一樣,系統(tǒng)任務(wù)并不復(fù)雜
回復(fù)

使用道具 舉報(bào)

板凳
ID:485350 發(fā)表于 2023-4-4 18:08 | 只看該作者
#define IR_STATUS_LOCK             0X01    //紅外鎖定
#define IR_STATUS_RECEIVE_OK       0X02    //紅外接收完成
#define IR_STATUS_KEY_UP           0X04    //紅外釋放


/*聯(lián)合體+結(jié)構(gòu)體*/
typedef union
{
    u8 Buf[4];
        struct
        {
                u8 User0;//用戶碼
                u8 User1;//用戶碼反碼
                u8 Key0;//按鍵碼
                u8 Key1;//按鍵碼反碼
        }IR_Data;
}IR_Type;


/*中斷內(nèi)變量建議使用IDATA*/
idata IR_Type IR_Code;
idata u8 IR_Status;
idata u8 IR_Receive_Bit;
idata u8 IR_Receive_Data[4];
idata u8 IR_L_Time;
idata u8 IR_H_Time;

idata u16 IR_Free_Time;
idata u16 IR_Map;


//中斷125us內(nèi)調(diào)用
void IR_Receive()
{
        if(IR_Status & IR_STATUS_LOCK)
        {
                IR_Free_Time++;
                if(IR_Free_Time >= 1000)//1000=125ms檢測(cè)不到引導(dǎo)信號(hào)或重發(fā)信號(hào),認(rèn)為紅外釋放
                {
                        IR_Status ^= (IR_STATUS_LOCK | IR_STATUS_KEY_UP);
                }
        }
       
        if(IR_IO)
        {
                IR_H_Time++;
        }
        else
        {
                IR_L_Time++;
                if(IR_H_Time)
                {
                        if(IR_L_Time >= 60)
                        {
                                IR_Free_Time = 0;//接收到引導(dǎo)碼或重復(fù)碼,清除紅外釋放計(jì)數(shù),
                                IR_Receive_Bit = 0;
                                if(IR_H_Time >= 30)//3750us
                                {
                                        //進(jìn)入此處表示接收到引導(dǎo)碼
                                        IR_Map = 0;//映射按鍵處理方式,為了支持按鍵快速處理
                                }
                        }
                        else if(IR_H_Time >= 24)
                        {
                                IR_Receive_Bit = 0;//減小干擾導(dǎo)致進(jìn)入接收到32位數(shù)據(jù)(例如手指碰觸接收頭塑料)
                        }
                        else if(IR_L_Time >= 2)
                        {
                                IR_Receive_Data[IR_Receive_Bit >> 3] >>= 1;
                                if(IR_H_Time >= 9)
                                {
                                        IR_Receive_Data[IR_Receive_Bit >> 3] |= 0x80;  //logic 1
                                }
                                IR_Receive_Bit++;
                                if(IR_Receive_Bit == 32)
                                {
                                        IR_Receive_Bit = 0;
                                        IR_Status |= (IR_STATUS_RECEIVE_OK | IR_STATUS_LOCK);
                                        IR_Code.Buf[0] = IR_Receive_Data[0];
                                        IR_Code.Buf[1] = IR_Receive_Data[1];
                                        IR_Code.Buf[2] = IR_Receive_Data[2];
                                        IR_Code.Buf[3] = IR_Receive_Data[3];
                                        //BEEP_IO = !BEEP_IO;//測(cè)試接收代碼點(diǎn)
                                }
                        }
                        IR_H_Time = 0;
                        IR_L_Time = 0;
                }
        }
}


//功能:紅外按鍵碼的功能處理,調(diào)用方式:建議Main中10毫秒處理一次
void IR_Key_Handle()
{
        //紅外按鍵釋放,一般不用處理
        if(IR_Status & IR_STATUS_KEY_UP)
        {
                IR_Status ^= IR_STATUS_KEY_UP;
                IR_Map = 0;//紅外按鍵釋放,清除映射
        }
       
    //紅外按鍵處理-映射到普通按鍵處理
    if(IR_Status & IR_STATUS_RECEIVE_OK)
    {
        IR_Status ^= IR_STATUS_RECEIVE_OK;//清除IR接收成功標(biāo)志                  
               
                if(IR_Code.IR_Data.User0 != 0x00)
                {
                        return;//用戶碼判斷,如無(wú)判斷,易被其他遙控誤操作
                }
               
                if((IR_Code.IR_Data.User0 ^ IR_Code.IR_Data.User1) != 0xff)
                {
                        return;//按照NEC協(xié)議,進(jìn)行用戶碼反碼校驗(yàn),不通過(guò),退出
                }

                if((IR_Code.IR_Data.Key0 ^ IR_Code.IR_Data.Key1) != 0xff)
                {
                        return;//按照NEC協(xié)議,進(jìn)行按鍵碼反碼校驗(yàn),不通過(guò),退出
                }

        IR_Map = KEY_POWER;
//                 switch(IR_Code.IR_Data.Key0)
//                 {
//                    case 0X00F://開(kāi)關(guān)
//                            IR_Map = KEY_POWER;
//                            break;
//                    case 0x40://搖頭
//                            IR_Map = KEY_LR_SWING;
//                            break;
//                    case 0x20://+
//                            IR_Map = KEY_INC;
//                            break;
//                    case 0x60://-
//                            IR_Map = KEY_DEC;
//                            break;
//                    case 0x10://定時(shí)
//                            IR_Map = KEY_TIMING;
//                            break;         
//                 }
    }
}
回復(fù)

使用道具 舉報(bào)

地板
ID:772400 發(fā)表于 2023-4-28 14:09 | 只看該作者
18680365301 發(fā)表于 2023-4-4 18:08
#define IR_STATUS_LOCK             0X01    //紅外鎖定
#define IR_STATUS_RECEIVE_OK       0X02    // ...

好久沒(méi)看,多謝
回復(fù)

使用道具 舉報(bào)

5#
ID:485350 發(fā)表于 2023-4-28 18:30 | 只看該作者
aYong0308 發(fā)表于 2023-4-28 14:09
好久沒(méi)看,多謝

關(guān)鍵是能不能用,叼毛
回復(fù)

使用道具 舉報(bào)

6#
ID:772400 發(fā)表于 2023-4-28 19:05 來(lái)自觸屏版 | 只看該作者
18680365301 發(fā)表于 2023-4-28 18:30
關(guān)鍵是能不能用,叼毛

不用代碼,要的是思路
回復(fù)

使用道具 舉報(bào)

7#
ID:1040201 發(fā)表于 2023-5-26 14:39 | 只看該作者
18680365301 發(fā)表于 2023-4-28 18:30
關(guān)鍵是能不能用,叼毛

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表