//////////////////////////////////////////////////////////////////////////// // // Canon RC-1/RC-2 Clone. // // copyright by rubidesu 2016 // http://www.gatelink.co.jp/hw/ // //////////////////////////////////////////////////////////////////////////// #include <12f683.h> //#define _SERIAL_DEBUG_ #undef _SERIAL_DEBUG_ #fuses INTRC_IO, NOWDT, PUT, NOPROTECT, NOMCLR, NOBROWNOUT #rom 0x7FF = {0x3400} #use delay(clock=8000000) #ifdef _SERIAL_DEBUG_ #use rs232(BAUD=9600, XMIT=PIN_A5) #endif //_SERIAL_DEBUG_ typedef unsigned int1 BIT; typedef unsigned int16 WORD; typedef unsigned int32 DWORD; #define HIGH 1 #define LOW 0 struct tagPORTA{ short bit0; short bit1; short bit2; short bit3; short bit4; short bit5; short bit6; short bit7; }PORTA; #byte PORTA = 5 #define LED_PORT PORTA.bit2 #define PUSH_SW1 PORTA.bit3 #define PUSH_SW2 PORTA.bit4 //////////////////////////////////////////////////////////////////////////// #INT_RA void int_ra_isr(void) { BYTE bDummy; bDummy = PORTA; //Dummy Read(Wakeup only). } //////////////////////////////////////////////////////////////////////////// BIT get_sw1() { BIT sw_state = LOW; if(PUSH_SW1 == LOW){ //DOWN delay_ms(10); if(PUSH_SW1 == LOW){ for(;;){ if(PUSH_SW1 == HIGH){ break; } } sw_state = HIGH; } } return sw_state; } //////////////////////////////////////////////////////////////////////////// BIT get_sw2() { BIT sw_state = LOW; if(PUSH_SW2 == LOW){ //DOWN delay_ms(10); if(PUSH_SW2 == LOW){ for(;;){ if(PUSH_SW2 == HIGH){ break; } } sw_state = HIGH; } } return sw_state; } //////////////////////////////////////////////////////////////////////////// void SendPulse() { BYTE i; for(i = 0; i < 16; i++){ LED_PORT = HIGH; delay_us(15); LED_PORT = LOW; delay_us(11); #asm nop #endasm } } //////////////////////////////////////////////////////////////////////////// void SendDataInstant() { SendPulse(); delay_us(7330); SendPulse(); } //////////////////////////////////////////////////////////////////////////// void SendDataDelay() { SendPulse(); delay_us(5360); SendPulse(); } //////////////////////////////////////////////////////////////////////////// // ƒƒCƒ“. // // IN: // // OUT: // // RETURN: // //////////////////////////////////////////////////////////////////////////// main() { setup_oscillator(OSC_8MHZ); set_tris_a(0b00011000); port_a_pullups(0b00000000); //Pullup. setup_comparator(NC_NC_NC_NC); //Disable Comparator. setup_adc(adc_off); //Disable AD Converter. setup_adc_ports(NO_ANALOGS); //Disable AD Converter. output_low(PIN_A0); output_low(PIN_A1); output_low(PIN_A2); #ifndef _SERIAL_DEBUG_ output_low(PIN_A5); #endif //_SERIAL_DEBUG_ enable_interrupts(INT_RA3); enable_interrupts(INT_RA4); enable_interrupts(GLOBAL); while(1){ if(get_sw1() == HIGH){ #ifdef _SERIAL_DEBUG_ putc('A'); #endif //_SERIAL_DEBUG_ delay_ms(10); SendDataInstant(); } if(get_sw2() == HIGH){ #ifdef _SERIAL_DEBUG_ putc('B'); #endif //_SERIAL_DEBUG_ delay_ms(10); SendDataDelay(); } #ifdef _SERIAL_DEBUG_ putc('S'); #endif //_SERIAL_DEBUG_ enable_interrupts(INT_RA3); enable_interrupts(INT_RA4); sleep(); #asm nop #endasm disable_interrupts(INT_RA3); disable_interrupts(INT_RA4); #ifdef _SERIAL_DEBUG_ putc('W'); #endif //_SERIAL_DEBUG_ } }