/* TV Rimote BY M.Kikuchi Tiny13a 9.6MHz 2014/2/15 Last Mod 2014/2/20 ROM 674(28) Bytes config=1E 7A */ sbit Inf_LED at PORTB0_bit; char SW_data[]={ 0x02,0xfd,0x48,0xb7 // Power 0-3 }; void Inf_PS(char Pcunt){ char l; // 1=26uSec (25.83) for(l=0;l< Pcunt;l++){ Inf_LED=1; Delay_us(4); // 12-12 11-13 10-14 9-15 8-16 7-17 OK Inf_LED=0; // 6-18 5-19 [4-20]3-21 2-22 1-23 OK Delay_us(20); asm { nop ; nop ; nop ; nop ; nop ; } } } void IFR_9000(){ Inf_PS(174); Inf_PS(174); } void Inf_zero(){ //650+450=1100 Inf_PS(25); Delay_us(450); //try } void Inf_one(){ //650+1550=2200 Inf_PS(25); Delay_us(1550); } void Send_Command(){ char l1,l2,Tmp; IFR_9000(); Delay_us(4400); // 32bit for (l1=0;l1<4;l1++){ Tmp=SW_data[l1]; for (l2=0;l2<8;l2++){ if ((Tmp & 0x80)==0x80) Inf_one(); else Inf_zero(); Tmp <<=1; } } Inf_zero(); // 33bit stop Delay_ms(39); } void Repeet_M(){ IFR_9000(); Delay_us(2200); Inf_zero(); //stop bit } void PIN_INT() iv IVT_ADDR_PCINT0 { char TEMP; Delay_ms(1); TEMP=~PINB & 0b00111110; // SW in if(TEMP==2){ SW_DATA[0]=0X02; // Power SW_DATA[1]=0Xfd; SW_DATA[2]=0X48; SW_DATA[3]=0Xb7; } if(TEMP==4){ SW_DATA[0]=0X02; // Freeze SW_DATA[1]=0Xfd; SW_DATA[2]=0X0a; SW_DATA[3]=0Xf5; } if(TEMP==8){ SW_DATA[0]=0Xc2; // "d" SW_DATA[1]=0X3d; SW_DATA[2]=0X28; SW_DATA[3]=0Xd7; } if(TEMP==16){ SW_DATA[0]=0X02; // "CH+" SW_DATA[1]=0Xfd; SW_DATA[2]=0Xd8; SW_DATA[3]=0X27; } if(TEMP==32){ SW_DATA[0]=0X02; // "CH-" SW_DATA[1]=0Xfd; SW_DATA[2]=0Xf8; SW_DATA[3]=0X07; } Send_Command(); // IFR-LED on Repeet_M(); // END do { Delay_ms(100); Repeet_M(); } while ((~PINB & 0b00111110)!=0); // SW over! } void main() { DDRB =0b00000001; // 4bit=IFR LED 1=OUT 0=IN PORTB=0b00111110; // Pull up PCMSK=0b00111110; // Pin Change Interrupt PCIE_bit=1; // GIMSK PCI-Enable sm1_bit=1; // set of Power-down mode sm0_bit=0; // // while(1){ Delay_ms(100); while((~PINB & 0b00111110)!=0); // SW over ? SREG_I_bit=1; // Global Interrupt Enable SE_bit=1; // Sleep enable asm sleep; // wait SW-ON SE_bit=0; // Sleep off SREG_I_bit=1; // Interrupt off } }