#include #include /* Commands: 0x0D mute 0x2A 0x2B "Full" 0x2C PC 0x2D side-by-side? 0x2F "i" 0x38 AV */ #define MAKE_COMMAND(toggle, addr, cmd) \ (cmd | ((addr) << 6) | ((toggle) << 11) | 0x3000) // (0x3 | ((toggle) << 2) | ((addr) << 3) | ((cmd) << 8)) const uint16_t mute = MAKE_COMMAND(0, 0x00, 0x2B); void delay_ms(uint16_t ms) { while (ms--) __delay_cycles(1000); } void wait_for_button() { while (!(P1IN & 0x08)) ; delay_ms(20); while (P1IN & 0x08) ; delay_ms(20); } void philips_rc5_send_no_carrier(uint16_t data) { const uint16_t bit_cycles = 889 - 6; // us P1OUT &= ~0x10; __delay_cycles(bit_cycles * 2); uint8_t bit = 14; while (bit--) { if (data & (1 << 13)) { P1OUT &= ~0x10; __delay_cycles(bit_cycles); P1OUT |= 0x10; __delay_cycles(bit_cycles); } else { P1OUT |= 0x10; __delay_cycles(bit_cycles); P1OUT &= ~0x10; __delay_cycles(bit_cycles); } data <<= 1; } P1OUT &= ~0x10; } void philips_rc5_send(uint16_t data) { const uint16_t bit_cycles = 889 - 6; // us TACTL = TASSEL1 | TACLR; TACCTL2 = 0; TACCR0 = 27; // ~36kHz (round(1000000/36000) - 1) TACCR2 = 0; TACTL |= MC_1; __delay_cycles(bit_cycles * 2); uint8_t bit = 14; while (bit--) { if (data & (1 << 13)) { TACCTL2 = 0; __delay_cycles(bit_cycles); TACCTL2 = OUTMOD_4; __delay_cycles(bit_cycles); } else { TACCTL2 = OUTMOD_4; __delay_cycles(bit_cycles); TACCTL2 = 0; __delay_cycles(bit_cycles); } data <<= 1; } P1OUT &= ~0x10; TACCTL2 = 0; } int main() { // Disable watchdog WDTCTL = WDTPW | WDTHOLD; // 1MHz internal timer BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; P1DIR |= 0x01 | 0x10; P1SEL |= 0x10; P1SEL2 |= 0x10; P1REN |= 0x08; P1OUT |= 0x08; P1OUT &= ~(0x10 | 0x01); uint8_t toggle = 0; while (1) { uint8_t times; //for (times = 5; times; times--) { philips_rc5_send(mute ^ (toggle << 11)); //delay_ms(200); //} wait_for_button(); toggle ^= 1; delay_ms(100); P1OUT |= 0x01; delay_ms(100); P1OUT &= ~0x01; } return 0; }