Skip to content

Commit 5ef0bd6

Browse files
Create AutoPlex7.cpp
1 parent a497513 commit 5ef0bd6

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

AutoPlex7.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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

Comments
 (0)