久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 【原創(chuàng)】部分開源NEC紅外遙控解碼程序(適合多款單片機) [打印本頁]

作者: psuxaog    時間: 2018-10-5 23:44
標題: 【原創(chuàng)】部分開源NEC紅外遙控解碼程序(適合多款單片機)
本帖最后由 psuxaog 于 2018-10-5 23:47 編輯

本次開源代碼為大批量量產(chǎn)項目中的代碼(標準模塊),已經(jīng)在多款國內(nèi)外產(chǎn)品中使用。移植方便,僅需要處理IO口和提供100微秒中斷,10毫秒節(jié)拍主循環(huán)即可,按鍵讀取等操作直接對接結(jié)構(gòu)體即可,具體請分析源程序。大家可以參考編程思想和代碼風格,歡迎批評指正

//remote.c
#include "remote.h"
#define ID_IR_USER                     0x06F9
#define REMOTE_KEY_SPEED               0xF0
#define REMOTE_KEY_SETINC              0xF1
#define REMOTE_KEY_MODE                0xF2
#define REMOTE_KEY_SETDEC              0xF3
#define REMOTE_KEY_SET                 0xF4
#define REMOTE_KEY_POWER               0xF5
#define REMOTE_KEY_LIGHT               0xF6
#define REMOTE_KEY_WIFI                0xF7
#define REMOTE_KEY_NOPRESS             0
static u8 gCntIrBit = 0;
static bit gFlagIrNow = 0;
static bit gFlagIrPrev = 0;
static u8 gCntFilter = 0;
static u8 gCntIrTime = 0;
static u8 idata gBufIrCode[4] = { 0, 0, 0, 0 };
static u8 idata gBufIrCodeOut[4] = { 0, 0, 0, 0 };
static bit gFlagStart = 0;
static bit gFlagIrHold = 0;
static bit gFlagRecvOk = 0;
REMOTE_StructDef xdata REMOTE_Struct;
bit REMOTE_Action = 0;
void REMOTE_Init(void)
{
u8 *p, i;
p = (u8 *) &REMOTE_Struct;
for (i = 0; i < sizeof(REMOTE_Struct); i++)
{
  p = 0;
}
}
void REMOTE_IsrServer(void)
{
u8 tmp = 0;
if (PIN_IR_REC)                  //檢測IO口電平變化
{
  if (gCntFilter < 2)               //濾波
  {
   gCntFilter++;
  }
  else
  {
   gFlagIrNow = 1;              //高電平
  }
}
else
{
  if (gCntFilter)                     //濾波
  {
   gCntFilter--;
  }
  else
  {
   gFlagIrNow = 0;              //低電平
  }
}
if (gFlagIrPrev && (!gFlagIrNow))
{
  if ((gCntIrTime > 125) && gCntIrTime < (145))
  {
   gCntIrBit = 0;
   gFlagStart = 1;
  }
  else if (!gFlagStart)
  {
   if ((gCntIrTime > 105) && (gCntIrTime < 125))
   {
    gFlagIrHold = 1;
   }
  }
  else
  {
   if ((gCntIrTime < 5) || (gCntIrTime > 30))
   {
    gFlagStart = 0;
   }
   else
   {
    tmp = gCntIrBit >> 3;
    gBufIrCode[tmp] >>= 1;
    if (gCntIrTime > (1680 / 100))
    {
     gBufIrCode[tmp] |= 0x80;
    }
    else
    {
     gBufIrCode[tmp] &= ~0x80;
    }
    gCntIrBit++;
    if (gCntIrBit >= 32)
    {
     if (!gFlagRecvOk)
     {
      gFlagRecvOk = 1;
      gBufIrCodeOut[0] = gBufIrCode[0];
      gBufIrCodeOut[1] = gBufIrCode[1];
      gBufIrCodeOut[2] = gBufIrCode[2];
      gBufIrCodeOut[3] = gBufIrCode[3];
     }
     gFlagStart = 0;
    }
   }
  }
  gCntIrTime = 0;
}
else
{
  if (gCntIrTime < 255)
  {
   gCntIrTime++;
  }
}
gFlagIrPrev = gFlagIrNow;
}
void REMOTE_Server(void)
{
static u16 idata dlyLong = 0;
static u16 idata dlyLongLim = 0;
static u16 idata dlyReleased = 0;
static u8 keyReleased = 0;
static u8 keyOut = 0;
static u8 keyLong = 0;
bit flagLong3s = 0;
bit flagLong5s = 0;
bit flagReleased = 0;
bit flagAction = 0;
if (gFlagRecvOk)
{
  if ((gBufIrCodeOut[2] == ~gBufIrCodeOut[3])
      && (gBufIrCodeOut[0] == (ID_IR_USER / 256))
      && (gBufIrCodeOut[1] == (ID_IR_USER % 256)))
  {
   keyOut = gBufIrCodeOut[2];
   keyLong = keyOut;
   keyReleased = keyOut;
   dlyLong = 0;
   dlyLongLim = 0;
   dlyReleased = 0;
   flagAction = 1;
  }
  gFlagRecvOk = 0;
}
if (dlyLongLim < 65530)
{
  dlyLongLim++;
}
if (dlyLongLim == 300)
{
  if (dlyLong > 20)
  {
   flagLong3s = 1;
   dlyLong = 0;
   keyOut = keyLong;
//   keyLong = REMOTE_KEY_NOPRESS;
   keyReleased = 0;
  }
}
if (dlyLongLim == 500)
{
  dlyLongLim = 0;
  if (dlyLong > 10)
  {
   flagLong5s = 1;
   dlyLong = 0;
   keyOut = keyLong;
   keyLong = REMOTE_KEY_NOPRESS;
   keyReleased = 0;
  }
}
if (keyReleased)
{
  dlyReleased++;
  if (dlyReleased > 15)
  {
   dlyReleased = 0;
   keyOut = keyReleased;
   flagReleased = 1;
   keyReleased = 0;
  }
}
if (gFlagIrHold)
{
  gFlagIrHold = 0;
  if (dlyLong < 65530)
  {
   dlyLong++;
  }
  dlyReleased = 0;
}
if (REMOTE_Struct.HasAction)
{
  if (flagAction)
  {
   flagAction = 0;
   REMOTE_Struct.Activated = 1;
  }
  if (flagLong3s || flagReleased)
  {
   REMOTE_Struct.HasAction = 0;
  }
  keyOut = REMOTE_KEY_NOPRESS;
  return;
}
flagAction = 0;
if (keyOut != REMOTE_KEY_NOPRESS)
{
  switch (keyOut)
   {
  case REMOTE_KEY_MODE:
   if (flagLong3s)
   {
    REMOTE_Struct.Value = REMOTE_KeyDispTemp;
   }
   else if (flagReleased)
   {
    REMOTE_Struct.Value = REMOTE_KeyMode;
   }
   break;
  case REMOTE_KEY_SPEED:
   if ((!flagReleased) && (!flagLong3s) && (!flagLong5s))
   {
    REMOTE_Struct.Value = REMOTE_KeySpeed;
   }
   break;
  case REMOTE_KEY_LIGHT:
   if (flagLong5s)
   {
    REMOTE_Struct.Value = REMOTE_KeyLock;
   }
   else if (flagReleased)
   {
    REMOTE_Struct.Value = REMOTE_KeyLight;
   }
   break;
  case REMOTE_KEY_POWER:
   if ((!flagReleased) && (!flagLong3s) && (!flagLong5s))
   {
    REMOTE_Struct.Value = REMOTE_KeyPower;
   }
   if (flagLong3s)
   {
    REMOTE_Struct.Value = REMOTE_KeyPowerLong;
   }
   break;
  case REMOTE_KEY_SETINC:
   if ((!flagReleased) && (!flagLong3s) && (!flagLong5s))
   {
    REMOTE_Struct.Value = REMOTE_KeySetInc;
   }
   break;
  case REMOTE_KEY_SETDEC:
   if ((!flagReleased) && (!flagLong3s) && (!flagLong5s))
   {
    REMOTE_Struct.Value = REMOTE_KeySetDec;
   }
   break;
  case REMOTE_KEY_WIFI:
   if (flagLong5s)
   {
    REMOTE_Struct.Value = REMOTE_KeyWifi;
   }
   break;
  case REMOTE_KEY_SET:
   if (flagLong5s)
   {
    REMOTE_Struct.Value = REMOTE_KeySet;
   }
   else if (flagReleased)
   {
    REMOTE_Struct.Value = REMOTE_KeySetOK;
   }
   break;
   }
}
keyOut = REMOTE_KEY_NOPRESS;
flagLong3s = 0;
flagLong5s = 0;
flagReleased = 0;
}
//remote.h
#ifndef __REMOTE_H__
#define __REMOTE_H__
#include "global.h"
typedef enum
{
REMOTE_KeyNoPress = 0,
REMOTE_KeyPower = 1,
REMOTE_KeySetInc = 2,
REMOTE_KeySetDec = 3,
REMOTE_KeyLight = 4,
REMOTE_KeyMode = 5,
REMOTE_KeySpeed = 6,
REMOTE_KeyWifi = 7,
REMOTE_KeyLock = 8,
REMOTE_KeyDispTemp = 9,
REMOTE_KeySet = 10,
REMOTE_KeySetOK = 11,
REMOTE_KeyPowerLong = 12,
} REMOTE_KeyEnumDef;
typedef struct
{
REMOTE_KeyEnumDef Value;               //按鍵鍵值
u8 HasAction :1;                                 
u8 Activated :1;                                 
} REMOTE_StructDef;
extern REMOTE_StructDef xdata REMOTE_Struct;             //程序接口
extern void REMOTE_Init(void);                                      //初始化
extern void REMOTE_IsrServer(void);                              //定時器中斷中調(diào)用的程序100微秒調(diào)用一次
extern void REMOTE_Server(void);                                  //主循環(huán),10毫秒調(diào)用一次
#endif








歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久久久久久久一区二区 | 国产一区二区欧美 | 狠狠色综合网站久久久久久久 | 在线看片网站 | 天天色天天射天天干 | 久久久一区二区三区 | 国产一区二区激情视频 | 99久久精品免费 | 成人免费视频 | 欧美成人精品一区二区男人看 | 天天干夜夜拍 | 国产一区二区三区视频免费观看 | 黄色av网站在线观看 | 亚洲国产精品日本 | 日韩精品在线视频免费观看 | 日韩久久久久 | 免费观看av| 一级毛片免费完整视频 | 国产免费av在线 | 在线观看黄色电影 | 在线国产一区 | 成人一区二区三区在线观看 | 亚洲高清在线免费观看 | 午夜在线小视频 | 日韩综合| 日本又色又爽又黄又高潮 | 久久精品中文字幕 | 亚洲精品不卡 | 日本特黄a级高清免费大片 特黄色一级毛片 | 日韩成人在线观看 | 亚洲乱码一区二区三区在线观看 | 国产农村一级片 | 亚洲国产高清高潮精品美女 | 久热久热| 91在线视频 | 亚洲精品久久久久久一区二区 | 久久日韩精品 | 日韩久久久久久 | 国产欧美一区二区三区在线看蜜臀 | 国产精品乱码一二三区的特点 | 丁香综合|