Nesse post (clique aqui) foi mostrado como criar uma classe pra facilitar o uso do registrador de deslocamento 74HC595 com o Arduino.
Apesar de funcionar perfeitamente, a classe ocupava muita memória para armazenar o estados de todas as saídas.
o código abaixo, foi reescrito de forma a ocupar menos memória e ser mais simples. Alguns métodos foram renomeados.
segue código-fonte:
class Expansor74HC595 {
private:
int _pin_clock;
int _pin_latch;
int _pin_data;
int _num_cis;
byte* _pins;
int _auto_send;
public:
Expansor74HC595(int pin_clock, int pin_latch, int pin_data, int num_cis){
_pin_clock = pin_clock;
_pin_latch = pin_latch;
_pin_data = pin_data;
_num_cis = num_cis;
_auto_send = true;
_pins = new byte[_num_cis];
pinMode(_pin_clock,OUTPUT);
pinMode(_pin_latch,OUTPUT);
pinMode(_pin_data, OUTPUT);
clear();
};
void startWrite() {
_auto_send = false;
};
void clear() {
for (int i=0; i<_num_cis; i++){
_pins[i] = 0b00000000;
}
send();
};
int read(int pin) {
if (pin >= _num_cis * 8) {return LOW;}
int pos = pin / 8;
pin = pin % 8;
return (_pins[pos] & (1 << pin)) != 0;
};
byte readByte(int num_ci) {
return _pins[num_ci];
};
void send(){
digitalWrite(_pin_latch, LOW);
for(int i=_num_cis-1; i>=0; i--) { shiftOut(_pin_data, _pin_clock, MSBFIRST, readByte(i) ); }
digitalWrite(_pin_latch, HIGH);
_auto_send = true;
};
void writeByte(int num_ci, byte b, int first = MSBFIRST) {
if (first == MSBFIRST){
byte reversed;
for(int i=0;i<8;i++){
reversed |= ((b>>i) & 0b1)<<(7-i);
}
b = reversed;
}
_pins[num_ci] = b;
if (_auto_send) { send(); }
} ;
void write(int pin, int value) {
if (pin >= _num_cis * 8) { return; }
int pos = pin / 8;
pin = pin % 8;
if (value){
_pins[pos] |= (1 << pin); //set a bit HIGH
} else {
_pins[pos] &= ~(1 << pin); //set a bit LOW
}
if (_auto_send) { send(); }
};
};
const int PIN_CLOCK = 2;
const int PIN_LATCH = 3;
const int PIN_DATA = 4;
Expansor74HC595 *exp1;
void setup() {
exp1 = new Expansor74HC595(PIN_CLOCK, PIN_LATCH, PIN_DATA, 3);
Serial.begin(9600);
}
void loop() {
for (byte b=0; b<=255; b++) { //i=0-> B00000000 i=255-> B11111111
exp1->startWrite();
exp1->writeByte(0, b);
exp1->writeByte(1, b, LSBFIRST);
exp1->write(23, HIGH);
exp1->send();
delay(500);
}
exp1->clear();
delay(500);
}




