#define VCC_MIN 0
#define VCC_MAX 1023
#define OUT_MIN -1
#define OUT_MAX 1
int count = 10;
int time = 100;
int timeOut = 2000;
const int AXIS_Y = A1;
const int LED = 3;
const int SENSOR = 4;
const int DISPLEY_D7 = 7;
const int DISPLEY_D6 = 8;
const int DISPLEY_D5 = 9;
const int DISPLEY_D4 = 10;
const int DISPLEY_E = 11;
const int DISPLEY_RW = 12;
const int DISPLEY_RS = 13;
const int DISPLEY_PORT[4] = { DISPLEY_D4,
DISPLEY_D5,
DISPLEY_D6,
DISPLEY_D7 };
int motion = 0;
int motionOld = 0;
int ledGlow = 0;
int numMin = 2;
int numMax = 10;
int curNum = 2;
int lasNum = 2;
void setup() {
displayInitialization();
writeDisplay(numMin);
pinMode(AXIS_Y, INPUT);
analogReference(DEFAULT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
pinMode(SENSOR, INPUT);
}
void displayInitialization () {
for (int i = 0; i < 4; i++) {
pinMode(DISPLEY_PORT[i], OUTPUT);
}
pinMode(DISPLEY_E, OUTPUT);
pinMode(DISPLEY_RW, OUTPUT);
pinMode(DISPLEY_RS, OUTPUT);
delayMicroseconds(50000);
digitalWrite(DISPLEY_E, LOW);
digitalWrite(DISPLEY_RW, LOW);
digitalWrite(DISPLEY_RS, LOW);
transferToThePort(0x02);
delayMicroseconds(4500);
transferToThePort(0x02);
delayMicroseconds(150);
transferToThePort(0x0C);
transferToThePort(0x00);
transferToThePort(0x0C);
transferToThePort(0x00);
transferToThePort(0x01);
transferToThePort(0x00);
transferToThePort(0x06);
for (int i = 0; i < 7; i++) {
commandDisplay(0x14);
}
}
void commandDisplay(uint8_t value) {
digitalWrite(DISPLEY_RS, LOW);
digitalWrite(DISPLEY_RW, LOW);
transferToThePort(value >> 4);
transferToThePort(value);
}
void writeDisplay(uint8_t value) {
digitalWrite(DISPLEY_RS, HIGH);
digitalWrite(DISPLEY_RW, LOW);
if (value < 10) {
transferToThePort((value + 0x30) >> 4);
transferToThePort(value + 0x30);
transferToThePort(254 >> 4);
transferToThePort(254);
commandDisplay(0x10);
commandDisplay(0x10);
}
else {
transferToThePort((value / 10 + 0x30) >> 4);
transferToThePort(value / 10 + 0x30);
transferToThePort((value % 10 + 0x30) >> 4);
transferToThePort(value % 10 + 0x30);
commandDisplay(0x10);
commandDisplay(0x10);
}
}
uint8_t readDisplay() {
uint8_t value = 0;
for (int i = 0; i < 4; i++) {
pinMode(DISPLEY_PORT[i], INPUT_PULLUP);
}
uint8_t value1 = transferFromThePort();
uint8_t value2 = transferFromThePort();
if (value2 > 0x2F && value2 < 0x3A) {
value = (value1 - 0x30) * 10 + (value2 - 0x30);
}
else {
value = value1 - 0x30;
}
for (int i = 0; i < 4; i++) {
pinMode(DISPLEY_PORT[i], OUTPUT);
}
commandDisplay(0x10);
commandDisplay(0x10);
return value;
}
uint8_t transferFromThePort() {
uint8_t value = 0;
byte bitI;
digitalWrite(DISPLEY_RS, HIGH);
digitalWrite(DISPLEY_RW, HIGH);
digitalWrite(DISPLEY_E, HIGH);
delayMicroseconds(2);
for (int i = 0; i < 4; i++) {
bitI = digitalRead(DISPLEY_PORT[i]);
bitWrite(value, i + 4, bitI);
}
digitalWrite(DISPLEY_E, LOW);
delayMicroseconds(1);
digitalWrite(DISPLEY_E, HIGH);
delayMicroseconds(2);
for (int i = 0; i < 4; i++) {
bitI = digitalRead(DISPLEY_PORT[i]);
bitWrite(value, i, bitI);
}
digitalWrite(DISPLEY_E, LOW);
delayMicroseconds(2);
return value;
}
void transferToThePort (uint8_t bitPort) {
for (int i = 0; i < 4; i++) {
digitalWrite(DISPLEY_PORT[i], bitRead(bitPort, i));
}
digitalWrite(DISPLEY_E, LOW);
delayMicroseconds(1);
digitalWrite(DISPLEY_E, HIGH);
delayMicroseconds(2);
digitalWrite(DISPLEY_E, LOW);
delayMicroseconds(100);
}
int axis(int joystick, int _time) {
long portVCC = 0;
for (int i = 0; i < count; i++) {
portVCC += static_cast<long> (analogRead(joystick));
delay(_time/count);
}
portVCC /= static_cast<long> (count);
return static_cast<int> (map(portVCC, VCC_MIN, VCC_MAX, OUT_MIN, OUT_MAX));
}
void loop() {
motion = digitalRead(SENSOR);
if (motion == HIGH && motion != motionOld) {
digitalWrite(LED, HIGH);
ledGlow = 0;
}
else {
if (ledGlow > timeOut / time) {
digitalWrite(LED, LOW);
ledGlow = 0;
}
ledGlow++;
}
motionOld = motion;
curNum = axis(AXIS_Y, time / 2);
if (lasNum != curNum) {
int readDis = readDisplay();
if (readDis < numMax && curNum > 0) {
readDis++;
}
else if (readDis > numMin && curNum < 0) {
readDis--;
}
writeDisplay(readDis);
timeOut = readDis * 1000;
}
lasNum = curNum;
delay(time / 2);
}