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();
}