After being told not to use the output of combinational logic as an input to a clock, we did just that at one point. After putting a D-flip flop driven off the system clock between the logic and the clock, a few of our many glitches cleared up. Also, the hardware for the controllers was initially much, much more complex than it needed to be. After taking Professor Brehob's advice and redrawing what we now knew what we had to do with the hardware, we were able to create a new design that was greatly simplified and less prone to glitches. Using this method again, we were also able to make more dependable LCD interface hardware.
At the software end, we also had some difficulty. Many of these problems were due to the LCD screen. Since it refreshes very slowly as compared to how quickly the rest of our project runs, we had to decrease the sampling rate of our controllers and modify our use of the timers to produce acceptable results. In addition to this, we ran into problems trying to call a C function from interrupt code. Since C always assumes certain registers are volatile, it overwrites these registers at its own convenience. Since an interrupt can happen at any point in the code, these registers were not automatically saved by the caller as they would normally be. After saving all of the proper registers, however, this problem was rectified.