Automatic gearbox shifter & display

Hello all,

First post here and also first arduino project, and I suspect quite an ambitious one too! What I would like is to make a car's automatic gearbox "shifterless" - so there's no actual gearstick, just up & down paddles on a steering wheel to select the gears. So, the gearbox has 4 physical positions; Park, Reverse, Neutral, and Drive - these are normally operated by a cable attached to the gearstick and is just a linear movement with some quite positive notches within the gearbox to retain it's selected position.
The plan is to use a dc motor (taken from an electric seat base so already has a reasonably powerful linear movement via a worm drive) controlled by the arduino. I understand I'll need an H-Bridge for this which is on order. Feedback of it's position will be from a linear slide pot.
That's the PHYSICAL shifts taken care of, I also need electrical shifts past the "Drive" position which limit the gearbox to using just the top 4, 3 or 2 gears as opposed to all 5 when it's in "Drive". I think this can be taken care of with transistors that will switch on inputs to the gearbox's standalone ECU.
But that's not all! I'd also like a display on the dash to show selected gear when the vehicle is stationary (P, R, N or D). When the vehicle is moving I wanted to compare engine speed to gearbox ouptut shaft speed and therefore calculate it's either in 1st, 2nd, 3rd, 4th or 5th and have that displayed instead. I have a 16 segment display and a TLC5940 IC for this purpose. The engine has a 5v pulse to the ignition coils which I could use, for the gearbox I will probably use an inductive pickup on the bolts of the propshaft coupling.

As I said, maybe a bit ambitious for a first attempt at programming bit I'm trying to break it down into individual sections which will then be combined at the end. I'm sure the arduino is capable of doing the things I want it to and I've already learnt a fair bit just doing some of the easier examples first.

At the moment I only have the display and some push buttons to play with, and I've actually got them doing what I want, but even I can see that the code is quite long! I've prevented PHYSICAL shifts from happening unless the brake pedal is pressed for safety reasons - simulated by a button. However, the display flickers; "P" and "R" are pretty steady, "N" is steady unless the brake pedal button is pressed, then it flickers and "D" does the opposite! So it flickers unless the brake pedal button is pressed which makes it steady?! I have added decoupling caps across the TLC chip and also tried running from an external 5v supply but the same happens.

Brace yourselves, here is my code for the display (I couldn't post the whole thing in one hit!):

if (requestedGearPosition ==1) {
//Insert PWM instruction
Tlc.set (6, 2000);
Tlc.set (4, 2000);
Tlc.set (3, 2000);
Tlc.set (2, 2000);
Tlc.set (13, 2000);
Tlc.set (1, 2000);
Tlc.set (11, 2000);
//Displays "P"

Tlc.update();
}
if (requestedGearPosition ==2) {
//Insert PWM instruction
Tlc.set (4, 2000);
Tlc.set (6, 2000);
Tlc.set (3, 2000);
Tlc.set (2, 2000);
Tlc.set (13, 2000);
Tlc.set (1, 2000);
Tlc.set (11, 2000);
Tlc.set (9, 2000);
//Displays "R"

Tlc.update();
}
if (requestedGearPosition ==3) {
//Insert PWM instruction
Tlc.set (6, 2000);
Tlc.set (4, 2000);
Tlc.set (5, 2000);
Tlc.set (9, 2000);
Tlc.set (14, 2000);
Tlc.set (13, 2000);
//Displays "N"

Tlc.update();
}
if (requestedGearPosition ==4) {
//Insert PWM instruction
Tlc.set (3, 2000);
Tlc.set (2, 2000);
Tlc.set (7, 2000);
Tlc.set (13, 2000);
Tlc.set (14, 2000);
Tlc.set (8, 2000);
Tlc.set (0, 2000);
Tlc.set (15, 2000);
//Displays "D"

Tlc.update();
}
if (requestedGearPosition ==5) {
digitalWrite(manual, HIGH);
digitalWrite(fourth, HIGH);
Tlc.set (4, 2000);
Tlc.set (1, 2000);
Tlc.set (11, 2000);
Tlc.set (13, 2000);
Tlc.set (14, 2000);
//Displays "4"

Tlc.update();
} else {
digitalWrite(manual, LOW);
digitalWrite(fourth, LOW);
}
if (requestedGearPosition ==6) {
digitalWrite(manual, HIGH);
digitalWrite(third, HIGH);
Tlc.set (3, 2000);
Tlc.set (2, 2000);
Tlc.set (13, 2000);
Tlc.set (11, 2000);
Tlc.set (14, 2000);
Tlc.set (15, 2000);
Tlc.set (0, 2000);
//Displays "3"

Tlc.update();
} else {
digitalWrite(manual, LOW);
digitalWrite(third, LOW);
}if (requestedGearPosition ==7) {
digitalWrite(manual, HIGH);
digitalWrite(second, HIGH);
Tlc.set (3, 2000);
Tlc.set (2, 2000);
Tlc.set (13, 2000);
Tlc.set (11, 2000);
Tlc.set (1, 2000);
Tlc.set (6, 2000);
Tlc.set (0, 2000);
Tlc.set (15, 2000);
//Displays "2"

Tlc.update();
} else {
digitalWrite(manual, LOW);
digitalWrite(second, LOW);
}
{
Tlc.clear();
Tlc.update();
}
}

It does work, but if anyone would be kind enough to tidy a section up and explain what they did and why, it would be much appreciated. I've read about Arrays and assume this would help me, but I'm afraid I just can't get my head around what I'd have to do to implement it.