Download:
Módulo com 01 CI: https://docs.google.com/uc?export=download&id=0B9ZzXhiNwNSrV2tMNGNBNkpDV1E
Módulo com 02 CI: https://docs.google.com/uc?export=download&id=0B9ZzXhiNwNSrZk1oVGZyV3VYSU0
Vídeo demonstrando os módulos funcionando.
Fotos:
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 = 13; const int PIN_LATCH = 12; const int PIN_DATA = 11; 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->writeByte(2, b); exp1->send(); delay(500); } exp1->clear(); delay(500); }
Nenhum comentário:
Postar um comentário