Domanda

Ho scritto una funzione in mikroC che scansiona il tasto premuto in una tastiera 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;
}

C'è un modo per convertire questo algoritmo in un ciclo?

È stato utile?

Soluzione

SÌ.(Almeno supponendo che tu non intenda effettivamente avere tali incarichi prima di ogni blocco di ifS.Presumo che fossero lì per i test?altrimenti il ​​tuo codice non ha senso.)

Per lo meno, puoi inserire ciascuno dei valori binari in un array e costruire un ciclo come questo:

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;
         }
    }
}

Altri suggerimenti

Sì, naturalmente.

Prima fai un po 'di array con i tuoi valori. Lo chiameremo t [] e secondo è d [] [] // Array bidimensionale

E lasciamo il doppio ciclo

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;
        }
    }
}

Spero possa aiutare.

Non so se l'array a 1 dimensione è necessario solo per i valori D, non ha controllato ogni numero

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top