198 lines
4.2 KiB
C++
198 lines
4.2 KiB
C++
/*************************************
|
|
* 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();
|
|
}
|