#include "wiring_private.h" // utili funzioni sbi e cbi
#define MUX7S 32
volatile uint8_t my_counter=1, imux7s=0, dig4[4];
// Decoder SW da decimale a 7 segmewnti:
const uint8_t dec27[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void setup() {
DDRB = 0x3F; // a,b,c,d,e,f
DDRD |= 0xF8; // PORTD3-D4 = DigN PORTD7=g
TIMSK0=0x05;
PORTB=0;
PORTD=0;
}
void loop() {
int a = analogRead(0);
cli(); // zona critica alimento
for(int8_t i = 0; i<4; i++){
dig4[i]=dec27[a%10]; // divisioni successive e converto 7 segmenti
a=a/10;
}
sei(); // fine zona critica
}
ISR(TIMER0_COMPB_vect){ // pocessi in Backgrond
if(--my_counter == 0) {
uint8_t j=imux7s;
uint8_t i=dig4[j]; // carico decoder s7 cifra
PORTD |= 0x78; // Spengo tutto (catodo comune)
PORTB=i&0x3F;
if(i&0x40)sbi(PORTD,7); else cbi(PORTD,7);
cbi(PORTD, 3+j); // accendo solo il digit di turno
imux7s=(++j)&3;
my_counter=MUX7S;
}
}