#include #include #include #include #define XTAL 11.0592e6 //11Mhz Quarz #define xRC5_IN P0 #define xRC5 7 // IR input low active #define RC5TIME 1.778e-3 // 1.778msec #define PULSE_MIN (unsigned char)(XTAL / 512 * RC5TIME * 0.4 + 0.5) #define PULSE_1_2 (unsigned char)(XTAL / 512 * RC5TIME * 0.8 + 0.5) #define PULSE_MAX (unsigned char)(XTAL / 512 * RC5TIME * 1.2 + 0.5) unsigned char rc5_bit; // bit value unsigned char rc5_time; // count bit time unsigned int rc5_tmp; // shift bits in unsigned int rc5_data; // store result unsigned int left; unsigned int left2; void uart_init(void) { // Baudrate = 19200 SCON = 0x50; // 8 Bit UART REN = 1; //Recieve Interrupt Enable IEN0 =0x10; //enable Uart interrupt TH1=0xFD; PCON |=0x80; TMOD |=0x21; // use timer 1 as baudrate generator TCON |=0x40; ES=0; // UART Interrupt deaktivieren EA= 1; // Interrupts generell aktivieren TI = 0; } void init_timer0(void) { //Interrupt alle 0,18ms TMOD = 0x2; //8bit //TCON = 0x16; TH0 = 0xA6; //Timer 0 High Byte setzen TL0 = 0xA6; //Timer 0 Low Byte setzen ET0 = 1; //Timer 0 Interrupt aktivieren TR0 = 1; //Timer 0 am Anfang aktivieren } void IR_Timer(void) interrupt 1 using 1 { unsigned tmp = rc5_data; if( ++rc5_time > PULSE_MAX ){ // count pulse time if( !(tmp & 0x4000) && tmp & 0x2000 ) // only if 14 bits received rc5_data = tmp; tmp = 0; } left = xRC5; if( (rc5_bit ^ xRC5_IN) & 1< 0xFF -> 0x00 if( rc5_time < PULSE_MIN ) // to short tmp = 0; if( !tmp || rc5_time > PULSE_1_2 ){ // start or long pulse time if( !(tmp & 0x4000) ) // not to many bits tmp <<= 1; // shift left2 = xRC5; if( !(rc5_bit & 1<> 11 & 1) + '0'); // Toggle Bit putchar_new(' '); sprintf(s,"%d",i >> 6 & 0x1F); //entspricht itoa( i >> 6 & 0x1F, s, 10); puts_new( s ); putchar_new(' '); sprintf(s,"%d",(i & 0x3F) | (~i >> 7 & 0x40)); //entspricht itoa((i & 0x3F) | (~i >> 7 & 0x40), s, 10); // Key Code puts_new( s ); puts_new( "\n\r" ); } } }