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.