Minicomputer aus Arduino-Micro, Tastenfeld und Anzeigeelement
(EN google-translate)
(PL google-translate)
Tastenmatrix-Zuordnung:
| Tastenmatrix-Pin | Arduino-Micro A | entspricht digital.. |
|---|---|---|
| 1 | A0 | D18 |
| 2 | A1 | D19 |
| 3 | A2 | D20 |
| 4 | A3 | D21 |
| 5 | A4 | D22 |
| 6 | A5 | D23 |
| 7 | - | D2 |
Tabelle 0-1: Verbindungen zwischen Tastenmatrix und Arduino-Micro
4-stellige-ASCII-Display-Zuordnung:
| SLG2016 Pin | SLG2016 Funktion | Arduino |
|---|---|---|
| 5 | D0 | PB0 |
| 6 | D1 | PB1 |
| 7 | D2 | PB2 |
| 8 | D3 | PB3 |
| 9 | D4 | PB4 |
| 10 | D5 | PB5 |
| 11 | D6 | PB6 |
| 1 | ~WRITE | PB7 |
| 3 | A0 | D7 |
| 2 | A1 | D12 |
Tabelle 0-2: 4-stellige-ASCII-Display-Zuordnung
Funktionstest
#define MAX 11
char puffer[]="1234567890";
int INDEX=0;
int INDEX_GLOBAL=0;
int INDEX_SCHREIBEN=0;
char zeichen;
void initAnzeige()
{
DDRB=255;
PORTB=0b10000000;
pinMode(7, OUTPUT);
pinMode(12,OUTPUT);
digitalWrite(7,0);
digitalWrite(12,0);
}
void initTastenmatrix()
{
pinMode(18, INPUT); //1
pinMode(19, INPUT); //2
pinMode(20, INPUT); //3
pinMode(21, INPUT); //4
pinMode(22, INPUT); //5
pinMode(23, INPUT); //6
pinMode(2, INPUT); //7
//Pullups:
digitalWrite(18,1);
digitalWrite(19,1);
digitalWrite(20,1);
}
void setzeZeichen(char zeichen, int stelle)
{
digitalWrite(7,(3-stelle)%2);
digitalWrite(12,(3-stelle)/2);
PORTB&=0b10000000;
PORTB|=zeichen;
delay(5);
PORTB&=0b01111111;
delay(5);
delay(5);
PORTB|=0b10000000;
}
void zeigePuffer(int stelle)
{
setzeZeichen(puffer[stelle%MAX],0);
setzeZeichen(puffer[(stelle+1)%MAX],1);
setzeZeichen(puffer[(stelle+2)%MAX],2);
setzeZeichen(puffer[(stelle+3)%MAX],3);
}
void laufschrift()
{
INDEX=INDEX_GLOBAL;
setzeZeichen(puffer[INDEX],0);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],1);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],2);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],3);
INDEX_GLOBAL++;
if(INDEX_GLOBAL>=MAX)
INDEX_GLOBAL=0;
if(puffer[INDEX_GLOBAL]=='\0')
INDEX_GLOBAL=0;
}
char leseZeichen()
{
pinMode(21,OUTPUT);
digitalWrite(21,0);
delay(1);
if(digitalRead(18)==0) return '1';
if(digitalRead(19)==0) return '2';
if(digitalRead(20)==0) return '3';
digitalWrite(21,1);
pinMode(21,INPUT);
pinMode(22,OUTPUT);
digitalWrite(22,0);
delay(1);
if(digitalRead(18)==0) return '4';
if(digitalRead(19)==0) return '5';
if(digitalRead(20)==0) return '6';
digitalWrite(22,1);
pinMode(22,INPUT);
pinMode(23,OUTPUT);
digitalWrite(23,0);
delay(1);
if(digitalRead(18)==0) return '7';
if(digitalRead(19)==0) return '8';
if(digitalRead(20)==0) return '9';
digitalWrite(23,1);
pinMode(23,INPUT);
pinMode(2,OUTPUT);
digitalWrite(2,0);
delay(1);
if(digitalRead(18)==0) return '*';
if(digitalRead(19)==0) return '0';
if(digitalRead(20)==0) return '#';
digitalWrite(2,1);
pinMode(2,INPUT);
return ' ';
}
void setup()
{
initAnzeige();
initTastenmatrix();
}
void loop()
{
laufschrift();
delay(50);
zeichen = leseZeichen();
if(zeichen!=' ')
{
puffer[INDEX_SCHREIBEN]=zeichen;
INDEX_SCHREIBEN++;
INDEX_SCHREIBEN%=(MAX-1);
while(zeichen!=' ')
{
zeichen = leseZeichen();
}
}
}
Code 0-1: Funktionstest.
Kindercomputer
#define MAX 21
//>=0 == Zahl
//<0: -1==ENDE -2=='=', -3=='+' -4=='-' -5=='*' -6=='/'
int ausdruck[MAX];
char puffer[MAX];
char puffer2[MAX];
int INDEX=0;
int INDEX_GLOBAL=0;
int INDEX_SCHREIBEN=0;
int INDEX_SCHREIBEN_ALT=0;
int STELLE=0;
int STELLE_ALT=0;
char zeichen;
int GLEICH_OFT=0;
//------------- RECHNER ---------------------
//Liefert ggf. Stelle des Gleichheitszeichens:
int analysieren(int* ausdruck,char* text)
{
int* zeiger;
int zahl=0;
zeiger = &ausdruck[0];
while(*text!='\0')
{
if(*text<'0' || *text>'9')
{
*zeiger=zahl;
zeiger++;
zahl=0;
if(*text=='=')
{
*zeiger=-2;
}
if(*text=='+') *zeiger=-3;
if(*text=='-') *zeiger=-4;
if(*text=='*') *zeiger=-5;
if(*text=='/') *zeiger=-6;
zeiger++;
}
else
{
zahl*=10;
zahl+=*text-48;
}
text++;
}
*zeiger=zahl;
zeiger++;
*zeiger=-1;
}
int findeStelleGleich(int* ausdruck)
{
int index=0;
while(ausdruck[index]!=-1)
{
if(ausdruck[index]==-2)
return index;
index++;
}
return -1;
}
int auswertenLinks(int* ausdruck)
{
int* zeiger = ausdruck;
int erg=zeiger[0];
zeiger++;
while(*zeiger!=-1 && *zeiger!=-2)
{
if(*zeiger<0)
{
if(*zeiger==-3)
{
zeiger++;
erg+=*zeiger;
}
else if(*zeiger==-4)
{
zeiger++;
erg-=*zeiger;
}
}
zeiger++;
}
return erg;
}
int auswertenRechts(int* ausdruck)
{
int* zeiger = ausdruck;
int erg = 0;
while(*zeiger!=-1 && *zeiger!=-2)
zeiger++;
if(*zeiger==-2)
{
zeiger++;
erg = *zeiger;
zeiger++;
}
while(*zeiger!=-1)
{
if(*zeiger<0)
{
if(*zeiger==-3)
{
zeiger++;
erg+=*zeiger;
}
else if(*zeiger==-4)
{
zeiger++;
erg-=*zeiger;
}
}
zeiger++;
}
return erg;
}
//------------- ENDE RECHNER ----------------
void initAnzeige()
{
DDRB=255;
PORTB=0b10000000;
pinMode(7, OUTPUT);
pinMode(12,OUTPUT);
digitalWrite(7,0);
digitalWrite(12,0);
}
void initTastenmatrix()
{
pinMode(18, INPUT); //1
pinMode(19, INPUT); //2
pinMode(20, INPUT); //3
pinMode(21, INPUT); //4
pinMode(22, INPUT); //5
pinMode(23, INPUT); //6
pinMode(2, INPUT); //7
//Pullups:
digitalWrite(18,1);
digitalWrite(19,1);
digitalWrite(20,1);
}
void setzeZeichen(char zeichen, int stelle)
{
digitalWrite(7,(3-stelle)%2);
digitalWrite(12,(3-stelle)/2);
PORTB&=0b10000000;
PORTB|=zeichen;
delay(5);
PORTB&=0b01111111;
delay(5);
delay(5);
PORTB|=0b10000000;
}
void zeigePuffer(int stelle)
{
setzeZeichen(puffer[stelle%MAX],0);
setzeZeichen(puffer[(stelle+1)%MAX],1);
setzeZeichen(puffer[(stelle+2)%MAX],2);
setzeZeichen(puffer[(stelle+3)%MAX],3);
}
void laufschrift()
{
INDEX=INDEX_GLOBAL;
setzeZeichen(puffer[INDEX],0);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],1);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],2);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],3);
INDEX_GLOBAL++;
if(INDEX_GLOBAL>=MAX)
INDEX_GLOBAL=0;
if(puffer[INDEX_GLOBAL]=='\0')
INDEX_GLOBAL=0;
}
char leseZeichen()
{
pinMode(21,OUTPUT);
digitalWrite(21,0);
delay(1);
if(digitalRead(18)==0) return '1';
if(digitalRead(19)==0) return '2';
if(digitalRead(20)==0) return '3';
digitalWrite(21,1);
pinMode(21,INPUT);
pinMode(22,OUTPUT);
digitalWrite(22,0);
delay(1);
if(digitalRead(18)==0) return '4';
if(digitalRead(19)==0) return '5';
if(digitalRead(20)==0) return '6';
digitalWrite(22,1);
pinMode(22,INPUT);
pinMode(23,OUTPUT);
digitalWrite(23,0);
delay(1);
if(digitalRead(18)==0) return '7';
if(digitalRead(19)==0) return '8';
if(digitalRead(20)==0) return '9';
digitalWrite(23,1);
pinMode(23,INPUT);
pinMode(2,OUTPUT);
digitalWrite(2,0);
delay(1);
if(digitalRead(18)==0) return '+';
if(digitalRead(19)==0) return '0';
if(digitalRead(20)==0)
{
GLEICH_OFT++;
return '=';
}
digitalWrite(2,1);
pinMode(2,INPUT);
return ' ';
}
void copyPuffer()
{
int i;
for(i=0;i<MAX-1;i++)
puffer2[i]=puffer[i];
for(i=MAX-1;i>=0;i--)
{
if(puffer2[i]=='=')
{
puffer2[i]='\0';
break;
}
}
}
void initialisieren()
{
int i;
INDEX=0;
INDEX_GLOBAL=0;
INDEX_SCHREIBEN=0;
STELLE=0;
STELLE_ALT=0;
for(i=0;i<MAX-1;i++)
puffer[i]=' ';
puffer[MAX-1]='\0';
}
void setup()
{
initAnzeige();
initTastenmatrix();
initialisieren();
}
void auswerten()
{
int erg1,erg2;
copyPuffer();
analysieren(ausdruck,puffer2);
erg1 = auswertenLinks(ausdruck);
erg2 = auswertenRechts(ausdruck);
initialisieren();
if(erg1==erg2)
{
setzeZeichen(':',0);
setzeZeichen('-',1);
setzeZeichen(')',2);
}
else
{
setzeZeichen(':',0);
setzeZeichen('-',1);
setzeZeichen('(',2);
}
delay(2000);
initialisieren();
}
void loop()
{
STELLE=INDEX_SCHREIBEN-3;
if(STELLE<0)
STELLE=0;
if(INDEX_SCHREIBEN!=INDEX_SCHREIBEN_ALT)
{
zeigePuffer(STELLE);
INDEX_SCHREIBEN_ALT=INDEX_SCHREIBEN;
}
delay(50);
zeichen = leseZeichen();
if(zeichen!=' ')
{
puffer[INDEX_SCHREIBEN]=zeichen;
INDEX_SCHREIBEN++;
INDEX_SCHREIBEN%=(MAX-1);
while(zeichen!=' ')
{
zeichen = leseZeichen();
}
}
if(GLEICH_OFT>=2)
{
GLEICH_OFT=0;
auswerten();
}
}
Code 0-2: Kindercomputer.
Kindercomputer mit Punkt und Strichrechnung
Die Operatoren werden durch Kombinationen von * und einer Ziffer gewählt:
|
#define MAX 100
//>=0 == Zahl
//<0: -1==ENDE -2=='=', -3=='+' -4=='-' -5=='*' -6=='/'
int ausdruck[MAX];
int ausdruck_neu[MAX];
char puffer[MAX];
char puffer2[MAX];
int INDEX=0;
int INDEX_GLOBAL=0;
int INDEX_SCHREIBEN=0;
int INDEX_SCHREIBEN_ALT=0;
int STELLE=0;
int STELLE_ALT=0;
char zeichen;
int GLEICH_OFT=0;
int AUFSCHUB=0;
//------------- RECHNER ---------------------
//Liefert ggf. Stelle des Gleichheitszeichens:
int analysieren(int* ausdruck,char* text)
{
int* zeiger;
int zahl=0;
zeiger = &ausdruck[0];
while(*text!='\0')
{
if(*text<'0' || *text>'9')
{
*zeiger=zahl;
zeiger++;
zahl=0;
if(*text=='=')
{
*zeiger=-2;
}
if(*text=='+') *zeiger=-3;
if(*text=='-') *zeiger=-4;
if(*text=='*') *zeiger=-5;
if(*text=='/') *zeiger=-6;
zeiger++;
}
else
{
zahl*=10;
zahl+=*text-48;
}
text++;
}
*zeiger=zahl;
zeiger++;
*zeiger=-1;
}
int findeStelleGleich(int* ausdruck)
{
int index=0;
while(ausdruck[index]!=-1)
{
if(ausdruck[index]==-2)
return index;
index++;
}
return -1;
}
int auswertenLinks(int* ausdruck)
{
int* zeiger = ausdruck;
int erg=zeiger[0];
zeiger++;
while(*zeiger!=-1 && *zeiger!=-2)
{
if(*zeiger<0)
{
if(*zeiger==-3)
{
zeiger++;
erg+=*zeiger;
}
else if(*zeiger==-4)
{
zeiger++;
erg-=*zeiger;
}
}
zeiger++;
}
return erg;
}
int auswertenRechts(int* ausdruck)
{
int* zeiger = ausdruck;
int erg = 0;
while(*zeiger!=-1 && *zeiger!=-2)
zeiger++;
if(*zeiger==-2)
{
zeiger++;
erg = *zeiger;
zeiger++;
}
while(*zeiger!=-1)
{
if(*zeiger<0)
{
if(*zeiger==-3)
{
zeiger++;
erg+=*zeiger;
}
else if(*zeiger==-4)
{
zeiger++;
erg-=*zeiger;
}
}
zeiger++;
}
return erg;
}
//------------- ENDE RECHNER ----------------
void initAnzeige()
{
DDRB=255;
PORTB=0b10000000;
pinMode(7, OUTPUT);
pinMode(12,OUTPUT);
digitalWrite(7,0);
digitalWrite(12,0);
}
void initTastenmatrix()
{
pinMode(18, INPUT); //1
pinMode(19, INPUT); //2
pinMode(20, INPUT); //3
pinMode(21, INPUT); //4
pinMode(22, INPUT); //5
pinMode(23, INPUT); //6
pinMode(2, INPUT); //7
//Pullups:
digitalWrite(18,1);
digitalWrite(19,1);
digitalWrite(20,1);
}
void setzeZeichen(char zeichen, int stelle)
{
digitalWrite(7,(3-stelle)%2);
digitalWrite(12,(3-stelle)/2);
PORTB&=0b10000000;
PORTB|=zeichen;
delay(5);
PORTB&=0b01111111;
delay(5);
delay(5);
PORTB|=0b10000000;
}
void zeigePuffer(int stelle)
{
setzeZeichen(puffer[stelle%MAX],0);
setzeZeichen(puffer[(stelle+1)%MAX],1);
setzeZeichen(puffer[(stelle+2)%MAX],2);
setzeZeichen(puffer[(stelle+3)%MAX],3);
}
void laufschrift()
{
INDEX=INDEX_GLOBAL;
setzeZeichen(puffer[INDEX],0);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],1);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],2);
INDEX++;
if(INDEX>=MAX)
INDEX=0;
if(puffer[INDEX]=='\0')
INDEX=0;
setzeZeichen(puffer[INDEX],3);
INDEX_GLOBAL++;
if(INDEX_GLOBAL>=MAX)
INDEX_GLOBAL=0;
if(puffer[INDEX_GLOBAL]=='\0')
INDEX_GLOBAL=0;
}
char leseZeichen()
{
pinMode(21,OUTPUT);
digitalWrite(21,0);
delay(1);
if(digitalRead(18)==0) return '1';
if(digitalRead(19)==0) return '2';
if(digitalRead(20)==0) return '3';
digitalWrite(21,1);
pinMode(21,INPUT);
pinMode(22,OUTPUT);
digitalWrite(22,0);
delay(1);
if(digitalRead(18)==0) return '4';
if(digitalRead(19)==0) return '5';
if(digitalRead(20)==0) return '6';
digitalWrite(22,1);
pinMode(22,INPUT);
pinMode(23,OUTPUT);
digitalWrite(23,0);
delay(1);
if(digitalRead(18)==0) return '7';
if(digitalRead(19)==0) return '8';
if(digitalRead(20)==0) return '9';
digitalWrite(23,1);
pinMode(23,INPUT);
pinMode(2,OUTPUT);
digitalWrite(2,0);
delay(1);
if(digitalRead(18)==0) return '*';
if(digitalRead(19)==0) return '0';
if(digitalRead(20)==0)
{
GLEICH_OFT++;
return '=';
}
digitalWrite(2,1);
pinMode(2,INPUT);
return ' ';
}
void copyPuffer()
{
int i;
for(i=0;i<MAX-1;i++)
puffer2[i]=puffer[i];
for(i=MAX-1;i>=0;i--)
{
if(puffer2[i]=='=')
{
puffer2[i]='\0';
break;
}
}
}
void initialisieren()
{
int i;
INDEX=0;
INDEX_GLOBAL=0;
INDEX_SCHREIBEN=0;
STELLE=0;
STELLE_ALT=0;
for(i=0;i<MAX-1;i++)
puffer[i]=' ';
puffer[MAX-1]='\0';
}
void setup()
{
initAnzeige();
initTastenmatrix();
initialisieren();
}
//Vorab alle Ausdrücke mit * und / auswerten:
void auswertenPunkt(int* ausdruck_neu,int* ausdruck)
{
int* zeiger = ausdruck;
int* zeiger_neu = ausdruck_neu;
int zahl=0;
while(*zeiger!=-1)
{
if(*zeiger==-5 || *zeiger==-6)
{
zeiger_neu--;
zeiger--;
zahl=*zeiger;
zeiger++;
while(*zeiger==-5 || *zeiger==-6)
{
if(*zeiger==-5)
{
zeiger++;
zahl*=*zeiger;
}
else if(*zeiger==-6)
{
zeiger++;
zahl/=*zeiger;
}
zeiger++;
}
zeiger--;
*zeiger_neu=zahl;
}
else
{
*zeiger_neu=*zeiger;
}
zeiger++;
zeiger_neu++;
}
*zeiger_neu=-1;
}
void auswerten()
{
int erg1,erg2;
copyPuffer();
analysieren(ausdruck,puffer2);
auswertenPunkt(ausdruck_neu,ausdruck);
erg1 = auswertenLinks(ausdruck_neu);
erg2 = auswertenRechts(ausdruck_neu);
initialisieren();
if(erg1==erg2)
{
setzeZeichen(':',0);
setzeZeichen('-',1);
setzeZeichen(')',2);
}
else
{
setzeZeichen(':',0);
setzeZeichen('-',1);
setzeZeichen('(',2);
}
delay(2000);
initialisieren();
}
void loop()
{
STELLE=INDEX_SCHREIBEN-3;
if(STELLE<0)
STELLE=0;
if(INDEX_SCHREIBEN!=INDEX_SCHREIBEN_ALT)
{
zeigePuffer(STELLE);
INDEX_SCHREIBEN_ALT=INDEX_SCHREIBEN;
}
delay(50);
zeichen = leseZeichen();
if(zeichen=='*')
{
while(zeichen!=' ')
{
zeichen = leseZeichen();
}
while(zeichen<'1' || zeichen>'4')
{
zeichen = leseZeichen();
}
if(zeichen=='1') zeichen='+';
if(zeichen=='2') zeichen='-';
if(zeichen=='3') zeichen='*';
if(zeichen=='4') zeichen='/';
puffer[INDEX_SCHREIBEN]=zeichen;
INDEX_SCHREIBEN++;
INDEX_SCHREIBEN%=(MAX-1);
while(zeichen!=' ')
{
zeichen = leseZeichen();
}
}
else if(zeichen!=' ')
{
puffer[INDEX_SCHREIBEN]=zeichen;
INDEX_SCHREIBEN++;
INDEX_SCHREIBEN%=(MAX-1);
while(zeichen!=' ')
{
zeichen = leseZeichen();
}
}
if(GLEICH_OFT>=2)
{
GLEICH_OFT=0;
auswerten();
}
}
Code 0-3: Kindercomputer mit Grundrechenarten.