Código:
ATENÇÃO:
o código abaixo foi melhorado, e publicado em um novo post. Clique aqui para o código atualizado.
class Expansor74HC595 { private: int _pin_clock; int _pin_latch; int _pin_data; int _num_cis; int* _pins; int _envio_automatico; public: Expansor74HC595(int pin_clock, int pin_latch, int pin_data, int num_cis=1); void startWrite() { _envio_automatico = false; }; int get_num_portas() { return _num_cis * 8; }; void limpar() { for (int i=0;i < _num_cis * 8;i++){ _pins[i] = LOW; } enviar(); }; int read(int pin) { if (pin >= get_num_portas()) {return LOW;} return _pins[pin]; }; void enviar(); void writeByte(int num_ci, byte values, bool q0=true); void write(int pin, int value); }; Expansor74HC595::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; _envio_automatico = true; _pins = new int[_num_cis*8]; pinMode(_pin_clock,OUTPUT); pinMode(_pin_latch,OUTPUT); pinMode(_pin_data, OUTPUT); limpar(); } void Expansor74HC595::writeByte(int num_ci, byte b, bool q0) { for(int i=(num_ci*8-1),j=q0?7:0; i>=(num_ci-1)*8; i--, q0?j--:j++) { _pins[i] = (b & (1 << j)) ? HIGH : LOW; } if (_envio_automatico) { enviar(); } } void Expansor74HC595::write(int pin, int value) { if (pin >= get_num_portas()) {return;} _pins[pin] = value ? HIGH : LOW; if (_envio_automatico) { enviar(); } } void Expansor74HC595::enviar(){ digitalWrite(_pin_latch, LOW); for (int i=(_num_cis*8-1); i>=0; i-- ) { digitalWrite(_pin_clock, LOW); digitalWrite(_pin_data, _pins[i]); digitalWrite(_pin_clock, HIGH); digitalWrite(_pin_data, LOW); } digitalWrite(_pin_latch,HIGH); _envio_automatico = true; } /*----------------------*/ 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, 16); Serial.begin(9600); } void conta_tempo(void(*p)(), String descricao){ long m1, m2; m1 = millis(); (*p)(); //executa a função m2 = millis(); Serial.print(descricao + ": m1= "); Serial.print(m1); Serial.print(" - m2 = "); Serial.print(m2); Serial.print(" - dif = "); Serial.print(m2 - m1); Serial.println(" milissegundos"); } void enviar(){ exp1->enviar(); } void loop() { for (int i=0; i<=255; i++) { //i=0-> B00000000 i=255-> B11111111 exp1->startWrite(); exp1->writeByte(1, i); //q0 será o menos significativo exp1->writeByte(3, i, false); //q7 será o menos significativo exp1->write(8, 1); exp1->write(9, 0); exp1->write(10, 1); exp1->write(11, 0); conta_tempo(enviar, "teste"); //exp1->enviar(); delay(500); exp1->startWrite(); exp1->write(8, 0); exp1->write(9, 1); exp1->write(10, 0); exp1->write(11, 1); exp1->enviar(); delay(500); exp1->limpar(); delay(300); } }