Вольтметр можно прикрутить:
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(latchPinLOW);
  
shiftOut(dataPinclockPinMSBFIRST0b11111111);  
  
digitalWrite(latchPinHIGH);
  switch (
cur_dig)
  {
    case 
0:
      
digitalWrite(digit3LOW);
      
digitalWrite(digit1HIGH);
      break;
    case 
1:
      
digitalWrite(digit1LOW);
      
digitalWrite(digit2HIGH); 
      break; 
    case 
2:
      
digitalWrite(digit2LOW);
      
digitalWrite(digit3HIGH);
      break;
  } 
  
digitalWrite(latchPinLOW);
  
shiftOut(dataPinclockPinMSBFIRST,digits[digit_out[cur_dig]]);  
  
digitalWrite(latchPinHIGH);
  
cur_dig++;
  if(
cur_dig==3cur_dig=0;  
}

void setup() 
{
  
ASSR=0x00;
  
TCCR2A=0x00;
  
TCCR2B=0x04;
  
TCNT2=0x00;
  
OCR2A=0x00;
  
OCR2B=0x00;
  
TIMSK2=0x01;
  
pinMode(latchPinOUTPUT);
  
pinMode(clockPinOUTPUT);
  
pinMode(dataPinOUTPUT);
  
pinMode(digit1OUTPUT);
  
pinMode(digit2OUTPUT);
  
pinMode(digit3OUTPUT);
  
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();