#include <12F683.h>
#device adc=8
#FUSES XT,NOWDT,NOMCLR,PUT,INTRC_IO,PROTECT
//GPIO
#byte GP = 0x05
#define TX PIN_A0
#bit BTPLAY = GP.1
#bit D3 = GP.2
#bit D2 = GP.3
#bit D1 = GP.4
#bit D0 = GP.5
#use delay(clock=8000000)
#use fast_io(a)
#use rs232(baud=19200, xmit=TX)
//Leer http://nuxx.net/wiki/Apple_Accessory_Protocol
//Algunos botones tienen una funcion diferente segun sea una pulsacion corta o larga.
//Para simular una pulsacion larga hay que enviar SOLO UNA VEZ el comando
//y este se mantendra "presionado" hasta que se envie el comando "released"
// | Header |Len |Mode| Command |Check (0x100-Len-Mode-Command)
char INIT[] = {0xFF,0x55,0x03,0x00,0x01,0x02,0xFA}; //inicializar "simple remote"
char RELEASED[] = {0xFF,0x55,0x03,0x02,0x00,0x00,0xFB}; //fin de pulsacion
char PLAY[] = {0xFF,0x55,0x03,0x02,0x00,0x01,0xFA}; //play/pause
char VOLUP[] = {0xFF,0x55,0x03,0x02,0x00,0x02,0xF9}; //volumen +
char VOLDW[] = {0xFF,0x55,0x03,0x02,0x00,0x04,0xF7}; //volumen -
char NEXT[] = {0xFF,0x55,0x03,0x02,0x00,0x08,0xF3}; //cancion siguiente/fast foward
char PREV[] = {0xFF,0x55,0x03,0x02,0x00,0x10,0xEB}; //cancion anterior/rewind
//Rutinas
void Send_AAP(char *APP);
void main() {
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC);
setup_vref(FALSE);
setup_oscillator(OSC_8MHZ);
set_tris_a(0b00111110);
Send_AAP(&INIT[0]); //inicializar el ipod en modo "simple remote"
do{
if(BTPLAY == 0){
Send_AAP(&PLAY[0]);
Send_AAP(&RELEASED[0]);
while(BTPLAY == 0){delay_ms(20);} //antirebote
}
if(D0 == 1){
Send_AAP(&VOLUP[0]); //comando volumen +
while(D0 == 1){delay_ms(20);} //espera a que se deje de presionar (mientas el volumen sigue subiendo)
Send_AAP(&RELEASED[0]); //detiene la subida de volumen
}
if(D1 == 1){
Send_AAP(&VOLDW[0]); //comando volumen -
while(D1 == 1){delay_ms(20);} //espera a que se deje de presionar (mientas el volumen sigue bajando)
Send_AAP(&RELEASED[0]); //detiene la bajada de volumen
}
if(D2 == 1){ //pulsacion corta: skip>> ; pulsacion larga: fast foward
Send_AAP(&NEXT[0]);
while(D2 == 1){delay_ms(20);}
Send_AAP(&RELEASED[0]);
}
if(D3 == 1){ //pulsacion corta: <<skip ; pulsacion larga: rewind
Send_AAP(&PREV[0]);
while(D3 == 1){delay_ms(20);}
Send_AAP(&RELEASED[0]);
}
}while(TRUE);
}
void Send_AAP(char *AAP){
int x;
for(x=0;x<7;x++){
}
}