Hello all,

I want briefly mention that I had similar code a long time ago.. but since Ivanrosale posted his I will give him the credit.

Its been a while since my last Article. This project was a long time coming for one of my home projects.

I have recently come across a bulk quantity of PIC16F628A in the SSOP package. if you are not familiar with the SSOP package the processor is about the size of your pinky fingernail.

This board was designed for the sole reason to turn on and off an RF switch. The RF lamp switch I acquired years ago was from radio shack and has long been discontinued. but any RF remote wall outlet has potential.
The Board features a Micrel 3.0 Amp adjustable voltage regulator (29302WU) and is set to 5Vdc Output and is also protected by a fuse. The Mini USB jack is not for usb but is ICSP. it allows the board to be programmed through my modified U2 programmer. Pic Kit 3 ICSP pin header was also added.

The PIC16F628A receives input to PORTA.2 from sparkfun Electronics IR Receiver Diode. The footprint for the Surface mount IR Receiver is also available in the same location on the board. The PIC's output drives a 7 bit Darlington array (ULN2003). the primary function for this is to close a switch to ground.
By setting any pin on PortB [5:0], PortA.1 to high will cause the output of the array to go to ground in turn lighting the corresponding LED attached to that output.

For this project the Radio shack uses a 12v battery for power. I tried powering the remote from this board but the RF chip requires 12v. Not a problem. I noticed the switches on this remote contact ground. Did i tell you that this board was designed around this remote. By attaching our outputs to both sides of the switches on the remote it basically acts as an extended switch. So instead of pushing the buttons on the remote the IR board is gonna do it. Just keep in mind that since the remote uses a battery a common ground between both systems is needed.

My modified code will learn the First IR code it receives and stores it as long as there is power. the reason for this is because, this is going into my theater room and want to turn off the lights with the button I dedicate. what better way than to learn the Button you want to use.

(the project case is a travel soap container.. LOL)

Code:
define osc 20
CMCON = 7

low porta.4
low portb.3
low portb.2
high porta.3

Pulse       var byte[12]
Command     var byte
Start       var byte
Stored      var byte
Device      var byte
Counter     var Byte
Compare1    var byte
Compare2    var byte
LampStatus  var byte
X           var byte


'*********************** Receive IR Signal *************************************

'The PULSIN resolution is 2uS with PIC running at 20MHz

WaitForStart:                       'Wait for Start signal
PuLSIN PORTA.2,0,start               'Check the low pulse width
if start < 180 then WaitForStart    'If the Start pulse < 1.8mS repeat the loop

for counter = 0 to 11                 'Get the 12 pulses of the signal
    pulsin PORTA.2,0,pulse[counter]
next 
if stored = 1 then Verify        'Check to see if any signal has been received.

'********************** Learn First IR Signal **********************************

StoreBits: 
command = 0
device = 0
low porta.3
for counter = 0 to 6
    if pulse[counter] < 90 then     'Determine if the pulse represents 0 or 1
       command.0[counter] = 0       
    Else    
       command.0[counter] = 1
    endif
next
for counter=7 to 11
    if pulse[counter] < 90 then
       device.0[counter-7] = 0 
    Else    
       device.0[counter-7] = 1
    endif
next
stored = 1 
goto waitforstart

'********************** Compare to Stored IR signal ****************************

Verify:
compare1 = 0 
compare2 = 0
for counter = 0 to 6
    if pulse[counter] < 90 then     'Determine if the pulse represents 0 or 1
       compare1.0[counter] = 0      'Storing new signal in Compare variable. 
    Else    
       compare1.0[counter] = 1
    endif
next
for counter=7 to 11
    if pulse[counter] < 90 then
       compare2.0[counter-7] = 0 
    Else    
       compare2.0[counter-7] = 1
    endif
next

for counter = 0 to 6           ' Compare incoming signal to the stored signal
 if compare1.0[counter] <> command.0[counter] then Bad_signal
next
for counter = 7 to 11
 if compare2.0[counter - 7] <> device.0[counter - 7] then bad_signal
next

GoodSignal:
if LampStatus = 1 then LampOff       ' Check the Lamp Status

LampOn:
high portb.3
pause 1000
low portb.3
pause 3000
Lampstatus = 1       ' Set the lamp Status to 1 stating the lamp is on. 
goto waitforstart


LampOff:             'Lamp Control 
High portb.2
pause 1000
low portb.2
pause 3000 
Lampstatus = 0
goto waitforstart

Bad_Signal   'Flash the Front LED for bad signal received. This my get annoying
for x = 0 to 10
pulsout porta.3,20000
pause 750
low porta.3
next 
goto waitforstart