/************************************* * arduino-library-er1400 * Author: Michel Bats * Website: www.batssoft.nl * File name: ER1400.cpp *************************************/ #include "ER1400.h" // ER1400 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(); } // 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 (acceptAddress -> read -> shiftDataOut) int ER1400::readData(int adr) { acceptAddress(adr); read(); return shiftDataOut(); } // writeData (acceptAddress -> erase -> acceptData -> write) void ER1400::writeData(int adr, int data) { acceptAddress(adr); erase(); acceptData(data); write(); } // eraseData (acceptAddress -> erase -> write) void ER1400::eraseData(int adr) { acceptAddress(adr); erase(); 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) { 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(); }