#define LED_ON RA1_bit = 1 //Turn ON LED pin RA1 #define LED_OFF RA1_bit = 0 //Turn OFF LED pin RA1 #define ON_OFF 0x1B //Code transmitted when press RB1 #define VOLUME_UP 0x87 //Code transmitted when press RB2 #define VOLUME_DOWN 0x9C //Code transmitted when press RB3 #define MUTE 0x2D //Code transmitted when press RB4 #define CHANNELS_6 0x2E //Code transmitted when press RB5 #define CHANNELS_4 0x3E //Code transmitted when press RB6 #define CHANNELS_2 0x4E //Code transmitted when press RB7 void Flash (unsigned char N); void noFlash(unsigned char N); void Octet (unsigned char B); main() { //Oscillator OSCCON = 0b11101001; //4Mhz //PORTA PORTA = 0b00000000; TRISA = 0b00000000; //outputs ANSELA = 0b00000000; //RA0-RA7 digital WPUA = 0b00000000; //No WPU //PORTB PORTB = 0b11111111; TRISB = 0b11111111; //inputs ANSELB = 0b00000000; //RA0-RA7 digital WPUB = 0b11111111; //Weak pull-up enable //Peripherals CM1CON0 = 0; //Comparator 1 disabled CM2CON0 = 0; //Comparator 1 disabled CM2CON0 = 0; //Comparator 2 disabled CM2CON1 = 0; //Comparator 2 disabled INTCON = 0b00001000; //Interrupt control register IOCBP = 0b00000000; IOCBN = 0b11111111; IOCBF = 0b00000000; while(1) { delay_ms(10); if(PORTB==0xff) { IOCBF = 0; delay_ms(10); asm{ sleep nop } } delay_ms(10); switch (~PORTB) { case 0b00000010: { Octet (ON_OFF); Octet (ON_OFF); Octet (ON_OFF); while(RB1_bit==0); delay_ms(10); break; } case 0b00000100: { while(RB2_bit==0) { Octet (VOLUME_UP); Octet (VOLUME_UP); Octet (VOLUME_UP); delay_ms(100); } break; } case 0b00001000: { while (RB3_bit==0) { Octet (VOLUME_DOWN); Octet (VOLUME_DOWN); Octet (VOLUME_DOWN); delay_ms(100); } break; } case 0b00010000: { Octet (MUTE); Octet (MUTE); Octet (MUTE); while(RB4_bit==0); delay_ms(10); break; } case 0b10000000: { Octet (CHANNELS_2); Octet (CHANNELS_2); Octet (CHANNELS_2); while(RB7_bit==0); delay_ms(10); break; } case 0b01000000: { Octet (CHANNELS_4); Octet (CHANNELS_4); Octet (CHANNELS_4); while(RB6_bit==0); delay_ms(10); break; } case 0b00100000: { Octet (CHANNELS_6); Octet (CHANNELS_6); Octet (CHANNELS_6); while(RB5_bit==0); delay_ms(10); break; } default: { delay_ms(10); break; } } delay_ms(10); } } void Flash(unsigned char N) { while (N > 0) { LED_ON; delay_us(12); LED_OFF; delay_us(6); N -= 0x01; } } void noFlash(unsigned char N) { while (N > 0) { LED_OFF; delay_us(12); LED_OFF; delay_us(6); N -= 0x01; } } void Octet (unsigned char B) { unsigned char numbit; Flash(0x1E); //Start bit for (numbit = 0; numbit < 0x08; numbit++) //Data bits { if ((B & 0x01) == 0x01) { noFlash(0x1E); } else { Flash(0x1E); } B = B >> 1; } noFlash(0x1E); //Stop bits noFlash(0x1E); }