byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte numSegments = 8;
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
byte tabDeco7seg[] = {0x3f, 0x06, 0x5b, 0x4F, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
byte digits[] = {0, 0, 0, 0};
byte dots = 0x0A;
int val = 0;
void setup() {
Serial.begin(115200);
Serial.println("debut");
for (int i = 0; i < numDigits; i++)
{
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH);
}
for (int i = 0; i < numSegments; i++)
{
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW);
}
pinMode(A3, OUTPUT);
analogWrite(A3, LOW);
setupTimer2();
}
void setDigitHAL(unsigned char nDigitActif, unsigned char nSegsActif)
{
PORTC = PORTC | 0x08;
//désactiver tous les digits avant de changer les segments
for (int i = 0; i < numDigits; i++)
{
digitalWrite(digitPins[i], HIGH);
}
//piloter les segments en utilisant les valeurs des bits de nSegsActif
for (int i = 0; i < numSegments; i++)
{
if (nSegsActif & 0x01 == 1)
{
digitalWrite(segmentPins[i], HIGH);
}
else
{
digitalWrite(segmentPins[i], LOW);
}
nSegsActif = nSegsActif >> 1;
}
//activer le bon digit
digitalWrite(digitPins[nDigitActif], LOW);
PORTC = PORTC & 0xF7;
}
void setDigit(unsigned char nDigitActif, unsigned char nSegsActif)
{
PORTC = PORTC | 0x08;
//désactiver tous les digits avant de changer les segments
PORTD = PORTD | 0x3C;
//piloter les segments en utilisant les valeurs des bits de nSegsActif
PORTD = PORTD | ((nSegsActif<< 6) & 0xC0);
PORTD = PORTD & ((nSegsActif<< 6) | 0x3F);
PORTB = PORTB | ((nSegsActif >>2) & 0x3F);
PORTB = PORTB & ((nSegsActif >>2) | 0xC0);
//activer le bon digit
//PORTD = PORTD & ((0xFB << nDigitActif) | (0xFF >> 6-nDigitActif));
switch(nDigitActif)
{
case 0 :
PORTD = PORTD & 0xFB;
break;
case 1 :
PORTD = PORTD & 0xF7;
break;
case 2 :
PORTD = PORTD & 0xEF;
break;
case 3 :
PORTD = PORTD & 0xDF;
break;
}
PORTC = PORTC & 0xF7;
}
void setNumber(unsigned int val)
{
byte valDigit;
for (int i = numDigits - 1; i >= 0; i-- )
{
valDigit = val % 10;
digits[i] = valDigit;
val = val / 10;
}
}
void tache1() {
cli();
val++;
setNumber(val);
sei();
}
void tache2() {
static int numDigit = 3;
setDigit(numDigit, tabDeco7seg[digits[numDigit]]);
if(numDigit == 0)
{
numDigit = 3;
}
else
{
numDigit--;
}
}
void setupTimer2(){
cli(); // disable all interrupts
TCCR2A = (1<<WGM21)|(0<<WGM20); // Mode CTC
TIMSK2 = (1<<OCIE2A); // Local interruption OCIE2A
TCCR2B = (0<<WGM22)|(1<<CS22)|(1<<CS21); // prediviser /256
OCR2A = 250; //250*256*1/16000000 = 4ms
sei(); // enable all interrupts
}
//appelée toutes les 4ms:
ISR(TIMER2_COMPA_vect){ // timer compare interrupt service routine
tache2();
}
void loop() {
unsigned int periodiciteTache1 = 100; //100ms entre chaque incrémentation de la valeur à afficher
unsigned int periodiciteTache2 = 4; //4ms pour l'affichage de chaque digit
static unsigned long timerTache1 = millis();
static unsigned long timerTache2 = millis();
if (millis() - timerTache1 >= periodiciteTache1) {
timerTache1 += periodiciteTache1;
tache1();
}
}
/*
void loop() {
byte dotsTempo = dots;
for(int i = 0; i<4;i++)
{
if(digits[i] <= 15)//on verifie de ne pas depasser 15
{
//on utilise la fonction pour activer les digits i
//les digits utilisés, on utilise la LUT pour afficher
//les valeurs que l'on veut du tab digits
setDigit(i,tabDeco7seg[digits[i]]);
}
if(dotsTempo & 0x01 == 1)//On lit le bit de poid faible correspondant au digit à allumer
{
setDigit(i,0x80); //On allume le point du digit i en question
}
dotsTempo = dotsTempo >> 1;
}
setNumber(7895);
setDigit(2, 0x80);
}
*/