Reading/writing on 27c512 EEPROM

Hi, recently I bought 27c512 512kb EEPROM. I reprogramed Arduino, from which I want to write data on it, several times for the past week (deleting code, writing it again) and without surprises, it didn't work every time. I was looking into its datasheet on the internet.

I got all the circuits: 5 volts, 13 volts(needed for writing data) and GND to chip enable (CE) and switching between 5 and 6.5 volts on Vcc line with the button. I am 5/13 volts / GND switching with optocouplers but 6.5 volts with the button. I just press it when in serial monitor counts to 0 (you will see in code). I get 6.5 volts from resistor divider.

So, I think I manage to read data from EEPROM but not write it on it. Last time I program the Arduino to do it I got weird data from it (writing binary 10, giving me binary 8 ).

I am programming it from Arduino Mega and I have only 8 address pins connected to Arduino, other address lines are hooked up to GND.

Here is my last code witch works best from all. Here is the code:

#define CE 52
#define OE5 50
#define OE13 51
void setup() {
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT); //address
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);
  pinMode(A6, OUTPUT);
  pinMode(A7, OUTPUT);

  pinMode(A8, OUTPUT);
  pinMode(A9, OUTPUT);
  pinMode(A10, OUTPUT);
  pinMode(A11, OUTPUT);
  pinMode(A12, OUTPUT); //data
  pinMode(A13, OUTPUT);
  pinMode(A14, OUTPUT);
  pinMode(A15, OUTPUT);


  pinMode(CE, OUTPUT); //chip enable (CE (enable low!))
  digitalWrite(CE, HIGH);

  pinMode(OE5, OUTPUT); //5V  into OE
  pinMode(OE13, OUTPUT); //13V into OE
  digitalWrite(OE5, HIGH);
  digitalWrite(OE13, LOW);


  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
  digitalWrite(A6, LOW);
  digitalWrite(A7, LOW);

  digitalWrite(A8, LOW);
  digitalWrite(A9, LOW);
  digitalWrite(A10, LOW);
  digitalWrite(A11, LOW);
  digitalWrite(A12, LOW);
  digitalWrite(A13, LOW);
  digitalWrite(A14, LOW);
  digitalWrite(A15, LOW);
  
  Serial.begin(9600);
}

void loop() {
  Serial.println("READY"); //counts down so I can press button...
  delay(2000);
  Serial.println("3");
  delay(1000);
  Serial.println("2");
  delay(1000);
  Serial.println("1"); //...here
  delay(1000);
  Serial.println("WRITING...");
  eeFlash(0, 10);
  Serial.println("DONE - reading in 2s");
  delay(2000);
  Serial.println();
  Serial.println(eeRead(0));
  while (true);
}








void toAddress(int adr) {
  digitalWrite(A0, HIGH && (adr & B00000001));
  digitalWrite(A1, HIGH && (adr & B00000010));
  digitalWrite(A2, HIGH && (adr & B00000100));
  digitalWrite(A3, HIGH && (adr & B00001000)); //setting address lines from int to binary
  digitalWrite(A4, HIGH && (adr & B00010000));
  digitalWrite(A5, HIGH && (adr & B00100000));
  digitalWrite(A6, HIGH && (adr & B01000000));
  digitalWrite(A7, HIGH && (adr & B10000000));
}

void setData(int dat) {
  pinMode(A8, OUTPUT);
  pinMode(A9, OUTPUT);
  pinMode(A10, OUTPUT);
  pinMode(A11, OUTPUT);
  pinMode(A12, OUTPUT); //data
  pinMode(A13, OUTPUT);
  pinMode(A14, OUTPUT);
  pinMode(A15, OUTPUT);

  digitalWrite(A8, HIGH && (dat & B00000001));
  digitalWrite(A9, HIGH && (dat & B00000010));
  digitalWrite(A10, HIGH && (dat & B00000100));
  digitalWrite(A11, HIGH && (dat & B00001000)); //setting data lines from int to binary
  digitalWrite(A12, HIGH && (dat & B00010000));
  digitalWrite(A13, HIGH && (dat & B00100000));
  digitalWrite(A14, HIGH && (dat & B01000000));
  digitalWrite(A15, HIGH && (dat & B10000000));
}

int chk;
int eeCheck() {
  chk = 0;
  pinMode(A8, INPUT);
  pinMode(A9, INPUT);
  pinMode(A10, INPUT);
  pinMode(A11, INPUT);
  pinMode(A12, INPUT); //data
  pinMode(A13, INPUT);
  pinMode(A14, INPUT);
  pinMode(A15, INPUT);
  delay(10);
  chk = chk+digitalRead(A8);
  chk = chk << 1;
  chk = chk+digitalRead(A9);
  chk = chk << 1;
  chk = chk+digitalRead(A10);
  chk = chk << 1;
  chk = chk+digitalRead(A11); //shifting data and combining signals to number
  chk = chk << 1;
  chk = chk+digitalRead(A12);
  chk = chk << 1;
  chk = chk+digitalRead(A13);
  chk = chk << 1;
  chk = chk+digitalRead(A14);
  chk = chk << 1;
  chk = chk+digitalRead(A15);
  Serial.println(nibbleShift(chk), BIN);
  return nibbleShift(chk);
}

int data;
void eeFlash(int adr, int val) {
  digitalWrite(OE5, LOW);
  digitalWrite(OE13, HIGH);
  digitalWrite(CE, HIGH);
  toAddress(adr);
  setData(val);
  delay(10);
  digitalWrite(CE, LOW);
  delay(100);
  digitalWrite(CE, HIGH); //I thing here somewhere is a problem
  delay(10);
  digitalWrite(OE5, LOW);
  digitalWrite(OE13, LOW);
  delay(10);
  digitalWrite(CE, LOW);
  delay(10);
  data = eeCheck();
  Serial.print(data, BIN);
  Serial.println(" --> " + String(data));
  digitalWrite(CE, HIGH);
  digitalWrite(OE5, HIGH);
}

int eeRead(int adr) {
  toAddress(adr);
  digitalWrite(CE, LOW);
  digitalWrite(OE5, LOW);
  digitalWrite(OE13, LOW);
  delay(5);
  data = eeCheck();
  digitalWrite(CE, HIGH);
  digitalWrite(OE5, HIGH);
  return data;
}

int nibbleShift(int num) { //function for inverting byte (ex.: 10100011 --> 11000101)
 int var = 0;    
 int i, x, y, p;
 int s = 8;    // number of bits in 'num'. (This case a 8bit nibble)

 for (i = 0; i < (s / 2); i++) {
   p = s - i - 1;
   x = num & (1 << p);
   x = x >> p;  
   y = num & (1 << i);
   y = y >> i;
 
   var = var | (x << i);
   var = var | (y << p);
 }
 return var;
}

And this is what I get on Serial:

READY
3
2
1
WRITING...
1010
1010 --> 10
DONE - reading in 2s

1000
8

Am I doing it right? I checked it several times from datasheet and it looks ok from my perspective.