📄 ir.c
字号:
#include <at89x52.h>#include "ir.h"#include "i2c.h"#include "tuner.h"static unsigned char impulse = 0;static unsigned char eximpulse = 0;static unsigned char IR_flag = 0;static unsigned short impulseCounter = 0;static unsigned short spaceCounter = 0;static unsigned char preDataCounter = 0;static unsigned char bitCounter = 0;static unsigned short keycode = 0;static unsigned char tuner_data[5] = {0x00};static unsigned char channel = 5;/* IR Initial */void IR_Initial(void) { IR_DETECT_PIN = 1; /* Set IR Detect Pin as input Pin */ TCON = 0x00; TMOD = 0x01; IP = 0x01; IE = 0x83; TL0 = _TL0_; TH0 = _TH0_; TR0 = 1; /* IR Timer Run */}/* IR Decoder Algorithm */void IR_Timer(void) interrupt 1{ /* Reload the timer counts */ TL0 = _TL0_; TH0 = _TH0_; if ( IR_DETECT_PIN == 1) impulse=0; else impulse=1; if ((eximpulse==0) && (impulse==1)) // Rising Edge { impulseCounter=0; if ((spaceCounter>1)&&(IR_flag==1)&&(spaceCounter<24)) { preDataCounter++; if ((spaceCounter<10) && (preDataCounter>16)) { keycode <<= 1; bitCounter++; } if ((spaceCounter>10) && (preDataCounter>16)) { keycode <<= 1; keycode |= 1; bitCounter++; } } } if((impulse==1)&&(impulseCounter<200)) impulseCounter++; if((eximpulse==1)&&(impulse==0)) //falling edge { spaceCounter=0; if(impulseCounter>30) IR_flag=1; } if((impulse==0)&&(IR_flag==1)&&(impulseCounter<150)) //counting negative pulses spaceCounter++; if (bitCounter == 16) { if (keycode == 0x6897) // power { channel = 9; // max channel } else if (keycode == 0xA05F) // CH+ { if (channel == 11) // max channel channel = 5; // min channel else channel += 2; } else if (keycode == 0x40BF) // CH- { if (channel == 5) // min channel channel = 11; // max channel else channel -= 2; }#if 0 else if (keycode == 0x50AF) // Vol- { } else if (keycode == 0x7887) // Vol+ { }#endif switch (channel) { /* NTSC USA, fVIF = 45.75MHz, fss = 62.5KHz Test Cable Channel 7, fRF = 175.25MHz, TV Mid Band */ case 7: tuner_data[0] = 0x0D; // DB1 tuner_data[1] = 0xD0; // DB2 tuner_data[2] = 0xCE; // CB tuner_data[3] = 0x02; // BB tuner_data[4] = 0x20; // AB break; /* Test Cable Channel 11, fRF = 199.25MHz, TV Mid Band */ case 11: tuner_data[0] = 0x0F; // DB1 tuner_data[1] = 0x50; // DB2 tuner_data[2] = 0xCE; // CB tuner_data[3] = 0x02; // BB tuner_data[4] = 0x20; // AB break; /* Test Cable Channel 5 , fRF = 77.25MHz, TV Low Band (77.25 + 45.75) * 1000 / 62.5 */ case 5: tuner_data[0] = 0x07; // DB1 tuner_data[1] = 0xB0; // DB2 tuner_data[2] = 0xCE; // CB tuner_data[3] = 0x01; // BB tuner_data[4] = 0x20; // AB break; /* Test Cable Channel 9 , fRF = 187.25MHz, TV Mid Band (187.25 + 45.75) * 1000 / 62.5 */ case 9: tuner_data[0] = 0x0E; // DB1 tuner_data[1] = 0x90; // DB2 tuner_data[2] = 0xCE; // CB tuner_data[3] = 0x02; // BB tuner_data[4] = 0x20; // AB break; } /* Write Data to Tuner */ tuner_write(tuner_data); I2C_NOP(); /* Reset counters */ preDataCounter=0; IR_flag=0; spaceCounter=0; impulseCounter=0; keycode = 0; bitCounter=0; } if (spaceCounter > 300) { preDataCounter=0; IR_flag=0; spaceCounter=0; impulseCounter=0; keycode = 0; bitCounter=0; } eximpulse=impulse; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -