Chia sẻ Cách giao tiếp với Vi Điều Khiển và Cách Lấy Mã Code Remote

phuceltn

Học sinh phổ thông
#51
Sao trong chương trình mình không thấy khai báo biến OF_QUAT; QUAY_QUAT; RELAY1; RELAY2 vậy?



// Ham dieu khien RELAY ========================================================
if(Data!=0) // Neu co kenh tren remote duoc an
{
if(Data == OF_QUAT) // Thuc hien lenh dieu khien ung voi moi phim
{
QUAY_QUAT =~RELAY1;
}
if((Data == QUAY_QUAT)|(Data == QUAY_QUAT1))
{
RELAY2 =~RELAY2;
}

}

}
}

//---------------END OF FILE-----------------/
//--------------------------------------------/
[/CODE]
Nguồn: Banlinkien.vn


[/QUOTE]
 

letuananh236

Học sinh phổ thông
#52
anh dungvt oi. Em download bài viết của anh nạp vào mạch thực tế thì chi bắt được sóng hồng ngoại qua RS232 lên máy tính và Generator code ra 2 file .c và .h còn thực tế nạp vào board để chạy thì không toggle được led. Nhờ anh chỉ em với có cần phải làm gì thêm nữa không anh? Em mới tìm hiểu về sóng hồng ngoại cho atmega8 nên chưa có nhiều kinh nghiệm. Nhờ anh giúp em
 

Đính kèm

Sửa lần cuối:

Lenci193

Học sinh phổ thông
#53
Cho em hỏi MSP430 với phần mềm CCS có "Genereate code" được không ạ ? Nếu không thì có cách gì để lậy được bit mã hóa các nút bấm ạ ?
 

ga_cong

Kỹ sư
#54
anh dungvt oi. Em download bài viết của anh nạp vào mạch thực tế thì chi bắt được sóng hồng ngoại qua RS232 lên máy tính và Generator code ra 2 file .c và .h còn thực tế nạp vào board để chạy thì không toggle được led. Nhờ anh chỉ em với có cần phải làm gì thêm nữa không anh? Em mới tìm hiểu về sóng hồng ngoại cho atmega8 nên chưa có nhiều kinh nghiệm. Nhờ anh giúp em
bạn fuse bit chính xác chưa đã ? nhiều lúc fuse sai là không chạy đâu
 
#55
Sau một thời gian dài cất vào tủ mình có làm lại 1 mạch dùng code đa năng, mình phát hiện code mà anh DUNGVT có vấn đề, nó không khắc phục hết hiện tượng sai số do thạch anh gây ra.
- mình đã cố ý sửa code gốc và thay đổi theo ý mình và phát hiện ra nguyên nhân sai mã IR bạn nào gặp trường hợp như mình thì sửa nhé..
code cũ của anh DUNGVT
Mã:
/* we have max, min --> so we calculate KeyCode */
        else if ((MIN > 0) && (MAX > 0) && (keycode_idx < 31))
        {
          if (compare_equal(nStick, MIN))
          {
            keycode <<= 1;
            keycode_idx++;
          }
          else if (compare_equal(nStick, MAX))
          {
            keycode |= 1;
            keycode <<= 1;
            keycode_idx++;
          }
          else
          {
            /* do nothing */
          }
code do mình sửa, nó không tổng quát như code gốc. thực chất code của mình chỉ cần thay đổi
#define OFFSET 3 // sai số thời gian cho phép = 0.3 ms
ví dụ :
- vdk đọc được timing như sau : 10 9 11 23 26 23 12 với MIN = 10, MAX = 22
với OFFSET=3 : Data = 0 0 0 1 1 1 0
với OFFSET=2 : Data = 0 0 0 1 0 1 0


Mã:
if ((nStick==   MIN)||
              (nStick==(MIN-1))||
              (nStick==(MIN-2))||
              (nStick==(MIN+1))||
              (nStick==(MIN+2)))
              {
                keycode |= 0;
                keycode<<= 1;
                keycode_idx++;
               
              }
          else if (nStick>= (MAX-3))
              {
                keycode |= 1;
                keycode <<= 1;
                keycode_idx++;
              }
code mà mình đã sửa chạy trên codevision AVR :
file : InfraredDecoder.h
Mã:
#define F_CPU_Khz     8000
#define TRUE          1
#define FALSE         0
/***** DEFINITION FOR KEY CODE  **********/
#define KEY_0     0
#define KEY_1     1
#define KEY_2     2
#define KEY_3     3
#define KEY_4     4
#define KEY_5     5
#define KEY_6     6
#define KEY_7     7
#define KEY_8     8
#define KEY_9     9
#define KEY_10    10
#define KEY_11    11
#define KEY_12    12
#define KEY_13    13
#define KEY_14    14
#define KEY_15    15
#define KEY_16    16
#define KEY_17    17
#define KEY_18    18
#define KEY_19    19
#define KEY_20    20
#define KEY_INVALID 0xFF

/***** DEFINITION FOR GLOBAL FUNCTIONS  **********/
void InfraredDecode_Init(void);
unsigned char InfraredDecode_GetKeyCode(void);
file : InfraredDecoder.c
Mã:
#define OFFSET                  3
#define MAX_KEY_CODE_IDX        84
// đây là mã IR giải mã được
unsigned char KeyCode_Table[MAX_KEY_CODE_IDX] = {
0x02, 0xFF, 0x44, 0xBA,
0x02, 0xFE, 0xC5, 0x3A,
0x02, 0xFF, 0xC4, 0x3A,
0x02, 0xFE, 0x45, 0xBA,
0x02, 0xFE, 0x05, 0xFA,
0x02, 0xFF, 0x84, 0x7A,
0x02, 0xFF, 0xC0, 0x3E,
0x02, 0xFF, 0x50, 0xAE,
0x02, 0xFF, 0x20, 0xDE,
0x02, 0xFE, 0xD1, 0x2E,
0x02, 0xFF, 0x30, 0xCE,
0x02, 0xFF, 0x60, 0x9E,
0x02, 0xFE, 0x61, 0x9E,
0x02, 0xFE, 0x31, 0xCE,
0x02, 0xFE, 0xF5, 0x0A,
0x02, 0xFE, 0x21, 0xDE,
0x02, 0xFE, 0x71, 0x8E,
0x02, 0xFE, 0xB5, 0x4A,
0x02, 0xFE, 0x85, 0x7A,
0x02, 0xFE, 0x95, 0x6A,
0x02, 0xFE, 0xA5, 0x5A
}; 

/***** LOCAL VARIABLES  **********/
unsigned int MAX = 0,Max1;
unsigned int MIN = 0,Min1;
unsigned char nIdx = 0;
unsigned int startBitsCode[4] = {0, 0, 0, 0};
unsigned char key1,key2,key3,key4;
unsigned char bMatchStartCode0 = FALSE;
unsigned char bMatchStartCode1 = FALSE;
unsigned char bMatchStartCode2 = FALSE;
unsigned long int keycode = 0,keycode2;
unsigned char keycode_idx = 0;
unsigned int stick = 0;

/***** LOCAL FUNCTIONS  **********/

unsigned char compare_equal(unsigned int a, unsigned int b);
/***** FUNCTION IMPLEMENTATION **********/
void InfraredDecode_Init(void)
{
  /*** Led configuration ***/
  /*** Timer1: Input capture, Output Compare Mode (CTC) ***/
  TCCR1A = 0x00; /* Normal port operation, OC1A/OC1B disconnected */
  TCCR1B =  ((1<< ICNC1)|  /* Activates the Input Capture Noise Canceler */
            (0 << ICES1)|  /* Input Capture Edge Select: falling edge */
            (1 << WGM12)|  /* CTC mode */
            (0 << CS12)|(0 << CS11)|(1 << CS10)); /* PRESCALE = 1 */
  /****** Set interrupt 100us *********/
  /* fo = 8Mhz / 1 = 8000Khz */
  /* ==> OCR1A = 0.1ms * 8000Khz/PRESCALE */
  OCR1A = 800;
  TIMSK |= (1 << TICIE1);  /* Input Capture Interrupt Enable */
}

void ClearVars(void)
{
  bMatchStartCode0 = FALSE;
  bMatchStartCode1 = FALSE;
  bMatchStartCode2 = FALSE;
  MAX = 0;
  MIN = 0;
  keycode = 0;
  keycode_idx = 0;
}

void TimerStop(void)
{
  TCNT1 = 0;
  stick = 0;
  nIdx = 0;
  ClearVars();
  TIFR |= (1 << ICF1) | (1 << OCF1A);
  TIMSK &= ~(1 << OCIE1A);
}

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
  unsigned int nStick = 0;
  nStick = stick; /* logging stick*/
  /* Save Global Interrupt Flag*/
  SREG=0x00;
  if (nIdx > 0) //Ignore the first ISR - xung start
  {
    if (nIdx <= 4) // Start Bit Codes
    {
      /* luu thoi gian bit muc 1 4 bit  */
      startBitsCode[nIdx - 1] = nStick;
    }
    else
    {
      /* Check if overlap */
      if (compare_equal(nStick,startBitsCode[0]))
      {
        bMatchStartCode0 = TRUE;
      }
      else if ((bMatchStartCode0 == TRUE) && (compare_equal(nStick,startBitsCode[1])))
      {
        bMatchStartCode0 = FALSE;
        bMatchStartCode1 = TRUE;
      }
      else if ((bMatchStartCode1 == TRUE) && (compare_equal(nStick,startBitsCode[2])))
      {
        bMatchStartCode0 = FALSE;
        bMatchStartCode1 = FALSE;
        bMatchStartCode2 = TRUE;
      }
      else if ((bMatchStartCode2 == TRUE) && (compare_equal(nStick,startBitsCode[3])))
      {
        ClearVars();
      }
      else /* Not overlap*/
      {
        if (MIN == 0)
        {
          if (MAX == 0)
          {
            MAX = nStick;
          }
          else
          {
            if (compare_equal(nStick, MAX) == FALSE)
            {
              if (nStick < MAX)
              {
                MIN = nStick;
                keycode <<= 1;
                keycode  |= 1;
                keycode <<= 1;
              }
              else
              {
                MIN = MAX;
                MAX = nStick;
                keycode |= 1;
                keycode <<= 2;
              } 
              //Max1=MAX;
              //Min1=MIN;
              keycode_idx += 2;
            }
          }
        }
      
        /* we have max, min --> so we calculate KeyCode */
        else if ((MIN > 0) && (MAX > 0) && (keycode_idx < 31))
        {
          if (compare_equal(nStick, MIN))
              {
                keycode |= 0;
                keycode<<= 1;
                keycode_idx++;
               
              }
          else if (compare_equal(nStick, MAX))
              {
                keycode |= 1;
                keycode <<= 1;
                keycode_idx++;
              }
          else
          {
            /* do nothing */
          }
       }
      }
    }
  }
  TCNT1 = 0;
  stick = 0;
  TIMSK |= (1 << OCIE1A);   /* Output Compare A Match Interrupt Enable */
  nIdx++;                   /* Incre number of bits */
  SREG = 0x80;              /* Restore Global Interrupt Flag*/
}

unsigned char compare_equal(unsigned int a, unsigned int b)
{
  unsigned char ret;
  ret = ((a <= (b + OFFSET)) && (a >= (b - OFFSET)));
  return ret;
}

// dem 100us
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
  stick++;
}

unsigned char InfraredDecode_GetKeyCode(void)
{
  unsigned char key = KEY_INVALID;
  unsigned char dem = 0;
  if ((stick >= 1000))
  {
          key1=keycode>>24;
          key2=(keycode>>16)&0xff;
          key3=(keycode>>8)&0xff;
          key4=keycode&0xff;
          for(dem=0;dem<21;dem++)
            {
            if(
            (key1==KeyCode_Table[4*dem])&&
            (key2==KeyCode_Table[4*dem+1])&&
            (key3==KeyCode_Table[4*dem+2])&&
            (key4==KeyCode_Table[4*dem+3]))
                {
                key=dem;
                break;
                }
            }  
    //keycode2=keycode;
    TimerStop();
  }
  return key;
}
 

stonelion

Học sinh phổ thông
#57
Sau một thời gian dài cất vào tủ mình có làm lại 1 mạch dùng code đa năng, mình phát hiện code mà anh DUNGVT có vấn đề, nó không khắc phục hết hiện tượng sai số do thạch anh gây ra.
- mình đã cố ý sửa code gốc và thay đổi theo ý mình và phát hiện ra nguyên nhân sai mã IR bạn nào gặp trường hợp như mình thì sửa nhé..
code cũ của anh DUNGVT
Mã:
/* we have max, min --> so we calculate KeyCode */
        else if ((MIN > 0) && (MAX > 0) && (keycode_idx < 31))
        {
          if (compare_equal(nStick, MIN))
          {
            keycode <<= 1;
            keycode_idx++;
          }
          else if (compare_equal(nStick, MAX))
          {
            keycode |= 1;
            keycode <<= 1;
            keycode_idx++;
          }
          else
          {
            /* do nothing */
          }
code do mình sửa, nó không tổng quát như code gốc. thực chất code của mình chỉ cần thay đổi
#define OFFSET 3 // sai số thời gian cho phép = 0.3 ms
ví dụ :
- vdk đọc được timing như sau : 10 9 11 23 26 23 12 với MIN = 10, MAX = 22
với OFFSET=3 : Data = 0 0 0 1 1 1 0
với OFFSET=2 : Data = 0 0 0 1 0 1 0


Mã:
if ((nStick==   MIN)||
              (nStick==(MIN-1))||
              (nStick==(MIN-2))||
              (nStick==(MIN+1))||
              (nStick==(MIN+2)))
              {
                keycode |= 0;
                keycode<<= 1;
                keycode_idx++;
             
              }
          else if (nStick>= (MAX-3))
              {
                keycode |= 1;
                keycode <<= 1;
                keycode_idx++;
              }
code mà mình đã sửa chạy trên codevision AVR :
file : InfraredDecoder.h
Mã:
#define F_CPU_Khz     8000
#define TRUE          1
#define FALSE         0
/***** DEFINITION FOR KEY CODE  **********/
#define KEY_0     0
#define KEY_1     1
#define KEY_2     2
#define KEY_3     3
#define KEY_4     4
#define KEY_5     5
#define KEY_6     6
#define KEY_7     7
#define KEY_8     8
#define KEY_9     9
#define KEY_10    10
#define KEY_11    11
#define KEY_12    12
#define KEY_13    13
#define KEY_14    14
#define KEY_15    15
#define KEY_16    16
#define KEY_17    17
#define KEY_18    18
#define KEY_19    19
#define KEY_20    20
#define KEY_INVALID 0xFF

/***** DEFINITION FOR GLOBAL FUNCTIONS  **********/
void InfraredDecode_Init(void);
unsigned char InfraredDecode_GetKeyCode(void);
file : InfraredDecoder.c
Mã:
#define OFFSET                  3
#define MAX_KEY_CODE_IDX        84
// đây là mã IR giải mã được
unsigned char KeyCode_Table[MAX_KEY_CODE_IDX] = {
0x02, 0xFF, 0x44, 0xBA,
0x02, 0xFE, 0xC5, 0x3A,
0x02, 0xFF, 0xC4, 0x3A,
0x02, 0xFE, 0x45, 0xBA,
0x02, 0xFE, 0x05, 0xFA,
0x02, 0xFF, 0x84, 0x7A,
0x02, 0xFF, 0xC0, 0x3E,
0x02, 0xFF, 0x50, 0xAE,
0x02, 0xFF, 0x20, 0xDE,
0x02, 0xFE, 0xD1, 0x2E,
0x02, 0xFF, 0x30, 0xCE,
0x02, 0xFF, 0x60, 0x9E,
0x02, 0xFE, 0x61, 0x9E,
0x02, 0xFE, 0x31, 0xCE,
0x02, 0xFE, 0xF5, 0x0A,
0x02, 0xFE, 0x21, 0xDE,
0x02, 0xFE, 0x71, 0x8E,
0x02, 0xFE, 0xB5, 0x4A,
0x02, 0xFE, 0x85, 0x7A,
0x02, 0xFE, 0x95, 0x6A,
0x02, 0xFE, 0xA5, 0x5A
};

/***** LOCAL VARIABLES  **********/
unsigned int MAX = 0,Max1;
unsigned int MIN = 0,Min1;
unsigned char nIdx = 0;
unsigned int startBitsCode[4] = {0, 0, 0, 0};
unsigned char key1,key2,key3,key4;
unsigned char bMatchStartCode0 = FALSE;
unsigned char bMatchStartCode1 = FALSE;
unsigned char bMatchStartCode2 = FALSE;
unsigned long int keycode = 0,keycode2;
unsigned char keycode_idx = 0;
unsigned int stick = 0;

/***** LOCAL FUNCTIONS  **********/

unsigned char compare_equal(unsigned int a, unsigned int b);
/***** FUNCTION IMPLEMENTATION **********/
void InfraredDecode_Init(void)
{
  /*** Led configuration ***/
  /*** Timer1: Input capture, Output Compare Mode (CTC) ***/
  TCCR1A = 0x00; /* Normal port operation, OC1A/OC1B disconnected */
  TCCR1B =  ((1<< ICNC1)|  /* Activates the Input Capture Noise Canceler */
            (0 << ICES1)|  /* Input Capture Edge Select: falling edge */
            (1 << WGM12)|  /* CTC mode */
            (0 << CS12)|(0 << CS11)|(1 << CS10)); /* PRESCALE = 1 */
  /****** Set interrupt 100us *********/
  /* fo = 8Mhz / 1 = 8000Khz */
  /* ==> OCR1A = 0.1ms * 8000Khz/PRESCALE */
  OCR1A = 800;
  TIMSK |= (1 << TICIE1);  /* Input Capture Interrupt Enable */
}

void ClearVars(void)
{
  bMatchStartCode0 = FALSE;
  bMatchStartCode1 = FALSE;
  bMatchStartCode2 = FALSE;
  MAX = 0;
  MIN = 0;
  keycode = 0;
  keycode_idx = 0;
}

void TimerStop(void)
{
  TCNT1 = 0;
  stick = 0;
  nIdx = 0;
  ClearVars();
  TIFR |= (1 << ICF1) | (1 << OCF1A);
  TIMSK &= ~(1 << OCIE1A);
}

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
  unsigned int nStick = 0;
  nStick = stick; /* logging stick*/
  /* Save Global Interrupt Flag*/
  SREG=0x00;
  if (nIdx > 0) //Ignore the first ISR - xung start
  {
    if (nIdx <= 4) // Start Bit Codes
    {
      /* luu thoi gian bit muc 1 4 bit  */
      startBitsCode[nIdx - 1] = nStick;
    }
    else
    {
      /* Check if overlap */
      if (compare_equal(nStick,startBitsCode[0]))
      {
        bMatchStartCode0 = TRUE;
      }
      else if ((bMatchStartCode0 == TRUE) && (compare_equal(nStick,startBitsCode[1])))
      {
        bMatchStartCode0 = FALSE;
        bMatchStartCode1 = TRUE;
      }
      else if ((bMatchStartCode1 == TRUE) && (compare_equal(nStick,startBitsCode[2])))
      {
        bMatchStartCode0 = FALSE;
        bMatchStartCode1 = FALSE;
        bMatchStartCode2 = TRUE;
      }
      else if ((bMatchStartCode2 == TRUE) && (compare_equal(nStick,startBitsCode[3])))
      {
        ClearVars();
      }
      else /* Not overlap*/
      {
        if (MIN == 0)
        {
          if (MAX == 0)
          {
            MAX = nStick;
          }
          else
          {
            if (compare_equal(nStick, MAX) == FALSE)
            {
              if (nStick < MAX)
              {
                MIN = nStick;
                keycode <<= 1;
                keycode  |= 1;
                keycode <<= 1;
              }
              else
              {
                MIN = MAX;
                MAX = nStick;
                keycode |= 1;
                keycode <<= 2;
              }
              //Max1=MAX;
              //Min1=MIN;
              keycode_idx += 2;
            }
          }
        }
    
        /* we have max, min --> so we calculate KeyCode */
        else if ((MIN > 0) && (MAX > 0) && (keycode_idx < 31))
        {
          if (compare_equal(nStick, MIN))
              {
                keycode |= 0;
                keycode<<= 1;
                keycode_idx++;
             
              }
          else if (compare_equal(nStick, MAX))
              {
                keycode |= 1;
                keycode <<= 1;
                keycode_idx++;
              }
          else
          {
            /* do nothing */
          }
       }
      }
    }
  }
  TCNT1 = 0;
  stick = 0;
  TIMSK |= (1 << OCIE1A);   /* Output Compare A Match Interrupt Enable */
  nIdx++;                   /* Incre number of bits */
  SREG = 0x80;              /* Restore Global Interrupt Flag*/
}

unsigned char compare_equal(unsigned int a, unsigned int b)
{
  unsigned char ret;
  ret = ((a <= (b + OFFSET)) && (a >= (b - OFFSET)));
  return ret;
}

// dem 100us
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
  stick++;
}

unsigned char InfraredDecode_GetKeyCode(void)
{
  unsigned char key = KEY_INVALID;
  unsigned char dem = 0;
  if ((stick >= 1000))
  {
          key1=keycode>>24;
          key2=(keycode>>16)&0xff;
          key3=(keycode>>8)&0xff;
          key4=keycode&0xff;
          for(dem=0;dem<21;dem++)
            {
            if(
            (key1==KeyCode_Table[4*dem])&&
            (key2==KeyCode_Table[4*dem+1])&&
            (key3==KeyCode_Table[4*dem+2])&&
            (key4==KeyCode_Table[4*dem+3]))
                {
                key=dem;
                break;
                }
            }
    //keycode2=keycode;
    TimerStop();
  }
  return key;
}
anh xem hộ em với ạ! e dùng code của a và dùng thạch anh 12M. em truyền dữ liệu lên máy tinh nhung vẫn không được toàn lên 255
 

Đính kèm

#60
à mình quên mất. bạn đừng lấy cái mã IR của mình. nó khác với mã mà cái remote của bạn gửi đi. bạn phải sửa thế này nhé.
code cũ của bạn tại hàm main:
Mã:
#include "InfraredDecoder.h"

// Declare your global variables here

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
void main(void)
{
// Declare your local variables here
unsigned char code = 0;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x4D;

InfraredDecode_Init();
delay_ms(1000);

while (1)
      {
      // Place your code here
        code = InfraredDecode_GetKeyCode(); 
      
        if(code != 0)
        {
            printf("data: %u  ", code);
            delay_ms(500);
        }
      }
}
mình sửa lại thế này
Mã:
#include "InfraredDecoder.h"

// Declare your global variables here

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
extern unsigned char key1,key2,key3,key4;
void main(void)
{
// Declare your local variables here
unsigned char code = 0;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x4D;

InfraredDecode_Init();
delay_ms(1000);

while (1)
      {
      // Place your code here
        code = InfraredDecode_GetKeyCode(); 
        // khi goi ham InfraredDecode_GetKeyCode()
        // key1,key2,key3,key4: da duoc tach tu keycode
        if((code != 0)||(key1!=0xff)||(key2!=0xff)||(key3!=0xff)||(key4!=0xff))
        {
            printf("data: %u Hex: 0x%02x,0x%02x,0x%02x,0x%02x", code,key1,key2,key3,key4);
            //delay_ms(500);
            code=0;
            key1=0xff;
            key2=0xff;
            key3=0xff;
            key4=0xff;
        }
      }
}
bạn sửa lại phần include trong InfraredDecoder.c không #include <mega8.h>
Mã:
//#include <mega8.h>
#include "InfraredDecoder.h"

#define OFFSET                  3
#define MAX_KEY_CODE_IDX        84
...
....
bạn sửa lại phần include trong InfraredDecoder.h, #include <mega8
Mã:
#include <mega8.h>
#define F_CPU_Khz     12000
#define TRUE          1
#define FALSE         0
/***** DEFINITION FOR KEY CODE  **********/
#define KEY_0     0
#define KEY_1     1
#define KEY_2     2
#define KEY_3     3
#define KEY_4     4
#define KEY_5     5
#define KEY_6     6
#define KEY_7     7
#define KEY_8     8
#define KEY_9     9
#define KEY_10    10
#define KEY_11    11
#define KEY_12    12
#define KEY_13    13
#define KEY_14    14
#define KEY_15    15
#define KEY_16    16
#define KEY_17    17
#define KEY_18    18
#define KEY_19    19
#define KEY_20    20
#define KEY_INVALID 0xFF

/***** DEFINITION FOR GLOBAL FUNCTIONS  **********/
void InfraredDecode_Init(void);
unsigned char InfraredDecode_GetKeyCode(void);
trên giao diện COM mà bạn dùng, nó sẽ hiện code và 4 key. bạn lấy 4 mã này để đưa vào mảng.
Mã:
unsigned char KeyCode_Table[MAX_KEY_CODE_IDX] = {
0x02, 0xFF, 0x44, 0xBA, 
0x02, 0xFE, 0xC5, 0x3A,
0x02, 0xFF, 0xC4, 0x3A,
0x02, 0xFE, 0x45, 0xBA,
0x02, 0xFE, 0x05, 0xFA,
0x02, 0xFF, 0x84, 0x7A,
0x02, 0xFF, 0xC0, 0x3E,
0x02, 0xFF, 0x50, 0xAE,
0x02, 0xFF, 0x20, 0xDE,
0x02, 0xFE, 0xD1, 0x2E,
0x02, 0xFF, 0x30, 0xCE,
0x02, 0xFF, 0x60, 0x9E,
0x02, 0xFE, 0x61, 0x9E,
0x02, 0xFE, 0x31, 0xCE,
0x02, 0xFE, 0xF5, 0x0A,
0x02, 0xFE, 0x21, 0xDE,
0x02, 0xFE, 0x71, 0x8E,
0x02, 0xFE, 0xB5, 0x4A,
0x02, 0xFE, 0x85, 0x7A,
0x02, 0xFE, 0x95, 0x6A,
0x02, 0xFE, 0xA5, 0x5A
};
 
Sửa lần cuối:

Quảng cáo Google