/*! ER1400.cpp v20210423: Initial version */ #include "er1400.h" ER1400::ER1400(uint8_t clockPin, uint8_t c1Pin, uint8_t c2Pin, uint8_t c3Pin, uint8_t outPin, uint8_t inPin) { this->clockPin = clockPin; this->c1Pin = c1Pin; this->c2Pin = c2Pin; this->c3Pin = c3Pin; this->inPin = inPin; this->outPin = outPin; init(); } void ER1400::init() { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 0); digitalWrite(c2Pin, 0); digitalWrite(c3Pin, 0); digitalWrite(outPin, 0); pinMode(clockPin, OUTPUT); pinMode(c1Pin, OUTPUT); pinMode(c2Pin, OUTPUT); pinMode(c3Pin, OUTPUT); pinMode(inPin, INPUT_PULLUP); pinMode(outPin, OUTPUT); } //readData int ER1400::readData(int adr) { acceptAddress (adr); read(); return shiftDataOut(); } //writeData void ER1400::writeData(int adr, int data) { acceptAddress(adr); erase(); acceptData(data); write(); } // STANDBY (C1: 0, C2: 0, C3: 0) void ER1400::standby() { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 0); digitalWrite(c2Pin, 0); digitalWrite(c3Pin, 0); digitalWrite(outPin, 0); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); } // ACCEPT ADDRESS (C1: 0, C2: 1, C3: 1) void ER1400::acceptAddress(int adr) { i; adr1 = 1 << (adr / 10); adr2 = 1 << (adr % 10); for (i = 0; i < 10; i++) { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 0); digitalWrite(c2Pin, 1); digitalWrite(c3Pin, 1); digitalWrite(outPin, !!(adr1 & (1 << (9 - i)))); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); } for (i = 0; i < 10; i++) { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 0); digitalWrite(c2Pin, 1); digitalWrite(c3Pin, 1); digitalWrite(outPin, !!(adr2 & (1 << (9 - i)))); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); } standby(); } // READ (C1: 1, C2: 0, C3: 0) void ER1400::read() { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 1); digitalWrite(c2Pin, 0); digitalWrite(c3Pin, 0); digitalWrite(outPin, 0); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); standby(); } // SHIFT DATA OUT (C1: 1, C2: 0, C3: 1) int ER1400::shiftDataOut() { x = 0; y = 0; for (i = 0; i < 14; i++) { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 1); digitalWrite(c2Pin, 0); digitalWrite(c3Pin, 1); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); y = digitalRead(inPin); y = y << 14; x = x + y; x = x >> 1; delayMicroseconds(delayvalue); } standby(); return x; } // ERASE (C1: 0, C2: 1, C3: 0) void ER1400::erase() { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 0); digitalWrite(c2Pin, 1); digitalWrite(c3Pin, 0); digitalWrite(outPin, 0); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); standby(); } // ACCEPT DATA (C1: 1, C2: 1, C3: 1) void ER1400::acceptData(int data) { x = 0; y = 0; for (i = 0; i < 14; i++) { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 1); digitalWrite(c2Pin, 1); digitalWrite(c3Pin, 1); digitalWrite(outPin, map(bitRead(data, i), 0, 1, 1, 0)); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); } standby(); } // WRITE (C1: 1, C2: 1, C3: 0) void ER1400::write() { digitalWrite(clockPin, 0); digitalWrite(c1Pin, 1); digitalWrite(c2Pin, 1); digitalWrite(c3Pin, 0); digitalWrite(outPin, 0); delayMicroseconds(delayvalue); digitalWrite(clockPin, 1); delayMicroseconds(delayvalue); standby(); }