Вольтметр можно прикрутить:
http://www.compcar.ru/forum/showthread.php?t=4463
http://www.arduino.cc/cgi-bin/yabb2/...num=1292921201
Нейтраль пока "H".
Динамическую индикацию на ардуино не проверял, может быть частоту таймера поменять придется. А код проверенный, должно работать:
PHP код:
#include <avr/interrupt.h>
#include <avr/io.h>
//connected to ST_CP
int latchPin = 3;
//connected to SH_CP
int clockPin = 4;
//connected to DS
int dataPin = 2;
int gear =0;

#define digit1 7
#define digit2 6
#define digit3 5

char digit_out[3], cur_dig; 

int digits[] = 
{
  
0b11000000, //0
  
0b11111001, //1
  
0b10100100, //2
  
0b10110000, //3
  
0b10011001, //4
  
0b10010010, //5
  
0b10000010, //6
  
0b11111000, //7
  
0b10000000, //8
  
0b10010000, //9
  
0b01000000, //0.
  
0b01111001, //1.
  
0b00100100, //2.
  
0b00110000, //3.
  
0b00011001, //4.
  
0b00010010, //5.
  
0b00000010, //6.
  
0b01111000, //7.
  
0b00000000, //8.
  
0b00010000, //9.
  
0b11111111, //пустота
  
0b10001001, //H нейтраль
  
0b10000011  //задний ход как-то надо отобразить b - back
};

void display()
{
  
digit_out[2]=0;
  
digit_out[1]=0;
  
digit_out[0]=gear;  
}

ISR(TIMER2_OVF_vect)
{
  
digitalWrite(latchPin, LOW);
  
shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111);  
  
digitalWrite(latchPin, HIGH);
  switch (
cur_dig)
  {
    case 
0:
      
digitalWrite(digit3, LOW);
      
digitalWrite(digit1, HIGH);
      break;
    case 
1:
      
digitalWrite(digit1, LOW);
      
digitalWrite(digit2, HIGH); 
      break; 
    case 
2:
      
digitalWrite(digit2, LOW);
      
digitalWrite(digit3, HIGH);
      break;
  } 
  
digitalWrite(latchPin, LOW);
  
shiftOut(dataPin, clockPin, MSBFIRST,digits[digit_out[cur_dig]]);  
  
digitalWrite(latchPin, HIGH);
  
cur_dig++;
  if(
cur_dig==3) cur_dig=0;  
}

void setup() 
{
  
ASSR=0x00;
  
TCCR2A=0x00;
  
TCCR2B=0x04;
  
TCNT2=0x00;
  
OCR2A=0x00;
  
OCR2B=0x00;
  
TIMSK2=0x01;
  
pinMode(latchPin, OUTPUT);
  
pinMode(clockPin, OUTPUT);
  
pinMode(dataPin, OUTPUT);
  
pinMode(digit1, OUTPUT);
  
pinMode(digit2, OUTPUT);
  
pinMode(digit3, OUTPUT);
  
PORTB = 0xFF;
  
DDRB = 0x00;
}

void loop() 
{
    
gear=21;
    if(
digitalRead(8)==0)gear=1;
    if(
digitalRead(9)==0)gear=2;
    if(
digitalRead(10)==0)gear=3;
    if(
digitalRead(11)==0)gear=4;
    if(
digitalRead(12)==0)gear=5;
    
delay(80);
    
display();
}