Question

J'ai écrit une fonction mikroC qui analyse la touche enfoncée dans un clavier 4x4

void scan_key()
{
    PORTB = 0B11111110;
    if ( PORTB == 0b11101110){
        Row = 1;
        Column = 1;
        return;
    }
    if ( PORTB == 0b11011110){
        Row = 2;
        Column = 1;
        return;
    }
    if ( PORTB == 0b10111110){
        Row = 3;
        Column = 1;
        return;
    }
    if ( PORTB == 0b01111110){
        Row = 4;
        Column = 1;
        return;
    }

    PORTB = 0B11111101;
    if ( PORTB == 0b11101101){
        Row = 1;
        Column = 2;
        return;
    }
    if ( PORTB == 0b11011101){
        Row = 2;
        Column = 2;
        return;
    }
    if ( PORTB == 0b10111101){
        Row = 3;
        Column = 2;
        return;
    }
    if ( PORTB == 0b01111101){
        Row = 4;
        Column = 2;
        return;
    }

    PORTB = 0B11111011;
    if ( PORTB == 0b11101011){
        Row = 1;
        Column = 3;
        return;
    }
    if ( PORTB == 0b11011011){
        Row = 2;
        Column = 3;
        return;
    }
    if ( PORTB == 0b10111011){
        Row = 3;
        Column = 3;
        return;
    }
    if ( PORTB == 0b01111011){
        Row = 4;
        Column = 3;
        return;
    }

    PORTB = 0B11110111;
    if ( PORTB == 0b11100111){
        Row = 1;
        Column = 4;
        return;
    }
    if ( PORTB == 0b11010111){
        Row = 2;
        Column = 4;
        return;
    }
    if ( PORTB == 0b10110111){
        Row = 3;
        Column = 4;
        return;
    }
    if ( PORTB == 0b01110111){
        Row = 4;
        Column = 4;
        return;
    }

    PORTB = 0B11110000;
}

Y at-il un moyen de convertir cet algorithme en boucle?

Était-ce utile?

La solution

Oui. (Au moins en supposant que vous ne pas réellement signifie avoir ces missions avant chaque bloc de ifs. Je suppose qu'ils étaient là pour tester? Sinon votre code n'a pas de sens.)

À tout le moins, vous pouvez mettre chacune des valeurs binaires dans un tableau, et de construire une boucle comme ceci:

int portValue[4][4] = {{0b11101110, 0b11011110, 0b10111110, 0b01111110}, {//...Rest of values here }}

int loop_col = 0;
int loop_row = 0;

for (loop_col = 0; loop_col < 4; loop_col++){
    for (loop_row = 0; loop_row < 4; loop_row++){
         if ( PORTB == portValue[loop_col][loop_row]){
             Row = loop_row + 1;
             Column = loop_col + 1;
             return;
         }
    }
}

Autres conseils

Oui, bien sûr.

Tout d'abord faire une tableau avec vos valeurs. nous l'appellerons t [] et le second est D [] [] // réseau bidimensionnel

et permet de faire double boucle

for(i=1;i<=4;i++)
{
    cur_value=t[i]; // our value

    for(j=1;j<=4;j++)
    {
        right_side_value=d[i][j];
        if(cur_value==right_side_value)
        {
            rows=i;
            columns=j;
            return;
        }
    }
}

L'espoir qui aide.

Je ne sais pas si 1 tableau à deux dimensions est nécessaire uniquement pour les valeurs d, na pas vérifier chaque numéro

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top