Firmware
Hardware & Programming
For this project, we used PIC18F2455 microcontrollers from Microchip. Since we were programming these microcontrollers in C, we used the Microchip C18 compiler in conjunction with the Microchip MPLAB IDE. This software suite gave us everything we needed to write and compile firmware for our PICs. In order to flash the firmware onto the microcontrollers, we used USB-based PIC Kit 2 programming kits. These allowed us to easily download our code to the chip.
Servo Control
The primary function of our device was to aim a camera using a servo-driven assembly. Servos are communicated with using a type of pulse width modulation, about which more can be read on Wikipedia. Essentially, we need to produce precisely timed output pulses on the order of one to two miliseconds every twenty ms in order to control the servo's position.

from http://www.e-radiocontrol.com.ar/vieja/faq/main.html
The PIC182455 has built in hardware CCP modules. They can be used to generate pulses of a specified period with a specified duty cycle, which is precisely the type of signal that drives a servo. Implementing servo control in hardware would have meant unloading a lot of timing work from the software, and allowed for much more precisely timed pulses to control the servos. Unfortunately, the hardware timers off which they are driven do not allow for sufficiently long periods with sufficiently fine enough resolution for our needs. This meant we were stuck implementing servo control in software.
There are a few methods for implementing servo control in software. Originally, we simply set a timer to overflow every 20ms and checked its current position every time through the loop. If it had been the right amount of time for the pulse, we turned the pin off. This technique resulted in a lot of servo jitter, since the precise length of pulses changed every loop.
Ultimately, the method we settled for was based on hardware delays. We set a pin high, put the PIC into a loop for the right amount of time, set the pin low, set the other pin high, put the PIC into a loop for the right amount of time, and set the other pin low. Next time it had been 20ms, we did this again. While not a particularly elegant solution, it got the job done and controlled the servo position without any jitter.
Serial LCD UI
In order to interface with the user, we used a Sparkfun SerLCD serial-enabled LCD module as a display and an array of buttons for input. The buttons enabled the user to interact with the device, and the LCD gave the user an interface through which to navigate. The menu structure we settled on is similar to that of an iPod, where the user can dig down deeper and deeper into sub menues to arrive at the controls she desires.

Gotta Catch Em All
To read more about how we interface the SerLCD with our PIC, read the whitepaper linked to in our sidebar. It includes a number of useful functions we developed in the process, and should essentially make interfacing with a SerLCD in your project a 15 minute job.
A copy of our final code can be downloaded here