// LCD1602 to Arduino Uno connection example
#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int TasterGruen=6;
int TasterBlau=5;
int TasterRot=4;
int TasterWeiss=3;
long LSDG;
long SPW=1073741824;//Speicherwert
int m; //Marker
long c= 2097152; //63488; //löscht den LSDG-anteil > momentan incl.2^10> 2^21
int z; // Speichervorgangzähler
byte p=1; //Programm > normal letztes gespeichert in EEPROM..
int SPO=8; //Speicherort;
int SPOl=0;//nied.SPO> Programmabhängig
int SPOh=SPOl+20;// 300;//höchster SPO
//int i=8; //
void setup() {
for(int i=0;i<900;i++){
EEPROM.write(i,0);
} // nur bei Sim. nötig!
eepromWriteLong(SPW,SPO);
pinMode(TasterGruen,INPUT_PULLUP);
pinMode(TasterBlau,INPUT_PULLUP);
pinMode(TasterRot,INPUT_PULLUP);
pinMode(TasterWeiss,INPUT_PULLUP);
lcd.begin(16, 2);
longAufLCDAnzeigen(SPW);
// you can now interact with the LCD, e.g.:
LSDG=SPW& 4194303;//(2^21+..2^0) 2047; //löscht Markierung und Speicherv.zahl aus SPW
//(2047= 2^10+...+2^0)
lcd.print("LSDG= ");
lcd.print(LSDG);
delay(3000);
longAufLCDAnzeigen(LSDG);
delay (2000);
lcd.setCursor(0, 0);
lcd.print("SPW= ");
lcd.print(eepromReadLong(SPO));
lcd.setCursor(0, 1);
lcd.print(eepromReadLong(SPO),BIN);
delay(2000);
/* lcd.clear();
//zu Beginn Speicherort suchen > programmsperifisch
lcd.setCursor(0, 0);
lcd.print("i ");
lcd.setCursor(0, 1);
lcd.print(EEPROM.read(i),BIN );
delay(2000);
lcd.clear();
//zu Beginn Speicherort suchen > programmsperifisch
lcd.setCursor(0, 0);
lcd.print("i+1 ");
lcd.setCursor(0, 1);
lcd.print(EEPROM.read(i+1),BIN );
delay(2000);
lcd.clear();
//zu Beginn Speicherort suchen > programmsperifisch
lcd.setCursor(0, 0);
lcd.print("i+2 ");
lcd.setCursor(0, 1);
lcd.print(EEPROM.read(i+2),BIN );
delay(2000);
lcd.clear();
//zu Beginn Speicherort suchen > programmsperifisch
lcd.setCursor(0, 0);
lcd.print("i+3 ");
lcd.setCursor(0, 1);
lcd.print(EEPROM.read(i+3),BIN );
delay(2000);*/
if (p==1){
for(int i=SPOl;i<SPOh;i=i+4){ //liest nacheinander alle möglichen Anfänge (jeweils bit 30 des long)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print( "i=");
lcd.print(i );
delay(2000);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
m= bitRead(EEPROM.read(i),6);
lcd.clear();
lcd.setCursor(0, 0);
lcd.setCursor(0, 1);
lcd.print("m=");
lcd.print(m);
delay(2000);
if(m==1){
SPO=i;
lcd.setCursor(0, 0);
lcd.print(">SPO ");
lcd.print(SPO);
lcd.setCursor(0, 1);
SPW=eepromReadLong(SPO);
lcd.print(">SPW");
lcd.print(SPW);
lcd.print(" LSDG");
lcd.print(LSDG);
break;
}
}
}
}
void loop() {
if(digitalRead (TasterGruen)==LOW){
LSDG++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LSDG ");
lcd.print(LSDG);
lcd.setCursor(8, 0);
lcd.print(LSDG,BIN);
delay(200);//"Lichtschrankensimulation"
}
if(digitalRead (TasterWeiss)==LOW){ //Abspeichern von LSDG
lcd.clear();
z++;
if(z==4){ // Speicherortwechsel+ alten reseten später bei 500,
//da
z=1;
SPO=SPO+4;
if(SPO==SPOh){
SPO=SPOl;
}
lcd.setCursor(0, 0);
lcd.print(">SPOW ! ");
// lcd.print(SPO);
delay (2000);
lcd.setCursor(0, 1);
// LSDG=eepromReadLong(SPO);
SPW=eepromReadLong(SPO);
lcd.print(">SPW");
lcd.print(SPW);
lcd.print(" LSDG");
lcd.print(LSDG);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SPOrt");
lcd.print(SPO);
delay(1500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AnzahlSp= ");
lcd.print(z);
lcd.setCursor(13, 0);
lcd.print("zl=");
lcd.setCursor(0, 1);
long zl=z<<11; // Anzahl der Speichervorgänge an "freier"Stelle
//später ab 22?
lcd.print(zl,BIN);
delay(4000);
SPW=LSDG|zl ; // Speicherzahl erneuern
bitWrite(SPW,15,1); // Speicherzahl wieder markieren
eepromWriteLong(SPW, SPO); //neue Speicherzahl abspeichern
lcd.setCursor(0, 0);
lcd.print("Sp.Wert: ");
lcd.setCursor(0, 1);
lcd.print(eepromReadLong(SPO),BIN);
delay(2000);
// lcd.clear();
}
if(digitalRead (TasterRot)==LOW){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SPW>cl ");
lcd.print(SPW);
lcd.setCursor(0, 1);
lcd.print(SPW,BIN);
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(c,BIN);
lcd.setCursor(0, 1);
SPW=SPW&c;
lcd.print(SPW,BIN);
lcd.print(SPW);
}
// ...
}
void eepromWriteLong(long lo, int adr) {
// long Wert in das EEPROM schreiben
// Eingabe : adr Speicherplatz
// Eingabe : lo Zahl, Wertebereich -2.147.483.648 bis 2.147.483.647
//
// Matthias Busse 23.5.2014 Version 1.0
byte by;
for(int i=0;i< 4;i++) {
by = (lo >> ((3-i)*8)) & 0x000000ff;
EEPROM.write(adr+i, by);
}
} // eepromWriteLong
long eepromReadLong(int adr) {
// long int Wert aus 4 Byte EEPROM lesen
// Eingabe : adr bis adr+3
// Ausgabe : long Wert
//
// Matthias Busse 23.5.2014 Version 1.0
long lo=0;
for(int i=0;i< 3;i++){
lo += EEPROM.read(adr+i);
lo = lo << 8;
}
lo += EEPROM.read(adr+3);
return lo;
} // eepromReadLong
void longAufLCDAnzeigen(long lo){ //long-Anzeige über 2 Zeilen
lcd.setCursor(0, 0);
long loh=lo&4294901760;//16 low-Bits werden gelöscht
for(int i=31; i>16;i--){
if(loh<pow(2,i)){ //"verschiebt" Anzeige nach hinten
lcd.print(" ") ;
}
}
lcd.print( loh>>16,BIN);//nach rechts verschoben zur Anzeige
lcd.setCursor(0, 1);
long lol=lo&65535; ////verwirft die oberen 16 Bitwerte
for(int i=15; i>0;i--){
if(lol<pow(2,i)){ // fuellt Nullen in der Anzeige auf
lcd.print("0") ;
}
}
lcd.print( lol,BIN);//> zeigt die fehlenden 16 niederen Bits des long
delay(4000);
lcd.clear();
}