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); }
Olá tudo bem Fabiano, posso transforma sua classe em uma biblioteca e colocar os créditos referenciando o seu trabalho e contatos dos canais do youtube, blog e pagina do facebook?
ResponderExcluirBoa noite Fabiano! Sou, simplesmente, um super-interessado nessas coisas de eletrônica, portanto, eu te pergunto: o que faz ou, qual o objetivo dessa "classe" que vc criou? Obrigado
ResponderExcluirFabiano como posso setar apenas um bit pelo writeByte sem setar os outros bits? Estou prendendo e essa class me ajudou muito! descomplicou tudo!!
ResponderExcluir