kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




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:

  • * und dann 1 liefert +
  • * und dann 2 liefert -
  • * und dann 3 liefert *
  • * und dann 4 liefert /

#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.