|
| 1 | +#include "AutoPlex7.h" |
| 2 | + |
| 3 | +void Display::blankSegments() { |
| 4 | + digitalWrite(A, OFF); digitalWrite(B, OFF); digitalWrite(C, OFF); |
| 5 | + digitalWrite(D, OFF); digitalWrite(E, OFF); digitalWrite(F, OFF); |
| 6 | + digitalWrite(G, OFF); digitalWrite(DP, OFF); |
| 7 | +} |
| 8 | + |
| 9 | +void Display::activateDigit(int digitIndex){ |
| 10 | + digitalWrite(D1, digitIndex==0?OFF:ON); |
| 11 | + digitalWrite(D2, digitIndex==1?OFF:ON); |
| 12 | + digitalWrite(D3, digitIndex==2?OFF:ON); |
| 13 | + digitalWrite(D4, digitIndex==3?OFF:ON); |
| 14 | +} |
| 15 | + |
| 16 | +void Display::showDigitSegments(int val){ |
| 17 | + switch(val){ |
| 18 | + case 0: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,ON); digitalWrite(G,OFF); break; |
| 19 | + case 1: digitalWrite(A,OFF); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,OFF); digitalWrite(E,OFF); digitalWrite(F,OFF); digitalWrite(G,OFF); break; |
| 20 | + case 2: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,OFF); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,OFF); digitalWrite(G,ON); break; |
| 21 | + case 3: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,OFF); digitalWrite(F,OFF); digitalWrite(G,ON); break; |
| 22 | + case 4: digitalWrite(A,OFF); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,OFF); digitalWrite(E,OFF); digitalWrite(F,ON); digitalWrite(G,ON); break; |
| 23 | + case 5: digitalWrite(A,ON); digitalWrite(B,OFF); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,OFF); digitalWrite(F,ON); digitalWrite(G,ON); break; |
| 24 | + case 6: digitalWrite(A,ON); digitalWrite(B,OFF); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,ON); digitalWrite(G,ON); break; |
| 25 | + case 7: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,OFF); digitalWrite(E,OFF); digitalWrite(F,OFF); digitalWrite(G,OFF); break; |
| 26 | + case 8: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,ON); digitalWrite(G,ON); break; |
| 27 | + case 9: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,OFF); digitalWrite(F,ON); digitalWrite(G,ON); break; |
| 28 | + } |
| 29 | +} |
| 30 | + |
| 31 | +void Display::begin(){ |
| 32 | + int pins[] = {D1,D2,D3,D4,A,B,C,D,E,F,G,DP}; |
| 33 | + for(int i=0;i<12;i++) pinMode(pins[i], OUTPUT); |
| 34 | + clearDisplay(); |
| 35 | + |
| 36 | + // Set up Timer2 for ~1kHz multiplexing |
| 37 | + TCCR2A = 0; |
| 38 | + TCCR2B = 0; |
| 39 | + TCNT2 = 0; |
| 40 | + OCR2A = 249; // 16MHz/(64*1000Hz)-1 |
| 41 | + TCCR2A |= (1 << WGM21); |
| 42 | + TCCR2B |= (1 << CS22); // prescaler 64 |
| 43 | + TIMSK2 |= (1 << OCIE2A); // enable compare match interrupt |
| 44 | + sei(); // enable global interrupts |
| 45 | +} |
| 46 | + |
| 47 | +void Display::blankDigit(){ blankSegments(); } |
| 48 | + |
| 49 | +void Display::clearDisplay(){ |
| 50 | + for(int i=0;i<4;i++){ digitsToDisplay[i]=-1; decimalFlags[i]=false; } |
| 51 | + blankSegments(); |
| 52 | + digitalWrite(D1,OFF); digitalWrite(D2,OFF); digitalWrite(D3,OFF); digitalWrite(D4,OFF); |
| 53 | +} |
| 54 | + |
| 55 | +void Display::showDecimal(){ decimalFlags[currentDigit]=true; } |
| 56 | +void Display::clearDecimal(){ decimalFlags[currentDigit]=false; } |
| 57 | + |
| 58 | +void Display::testDisplay(){ |
| 59 | + for(int i=0;i<4;i++){ digitsToDisplay[i]=8; decimalFlags[i]=true; } |
| 60 | +} |
| 61 | + |
| 62 | +void Display::showNumber(int num){ |
| 63 | + int tmp[4]; |
| 64 | + tmp[0] = (num/1000)%10; tmp[1] = (num/100)%10; |
| 65 | + tmp[2] = (num/10)%10; tmp[3] = num%10; |
| 66 | + |
| 67 | + bool nonZero=false; |
| 68 | + for(int i=0;i<4;i++){ |
| 69 | + if(tmp[i]!=0 || nonZero || i==3){ digitsToDisplay[i]=tmp[i]; nonZero=true; } |
| 70 | + else digitsToDisplay[i]=-1; |
| 71 | + } |
| 72 | +} |
| 73 | + |
| 74 | +void Display::setDigit(int number){ currentDigit = number>3?0:number; } |
| 75 | + |
| 76 | +void Display::multiplexStep(){ |
| 77 | + blankSegments(); |
| 78 | + activateDigit(currentDigit); |
| 79 | + |
| 80 | + int val = digitsToDisplay[currentDigit]; |
| 81 | + if(val != -1) showDigitSegments(val); |
| 82 | + digitalWrite(DP, decimalFlags[currentDigit]?ON:OFF); |
| 83 | + |
| 84 | + currentDigit++; |
| 85 | + if(currentDigit>3) currentDigit=0; |
| 86 | +} |
| 87 | + |
| 88 | +Display display; |
| 89 | + |
| 90 | +ISR(TIMER2_COMPA_vect){ |
| 91 | + display.multiplexStep(); |
| 92 | +} |
0 commit comments