Files
arduino-library-er1400/ER1400.cpp
T
2023-10-21 14:03:09 +02:00

176 lines
3.8 KiB
C++

/*!
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();
}