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.