Wenn Anweisungen für Schleife konvertieren? [abgeschlossen
Frage
Ich habe eine Funktion in Mikroc geschrieben, die die gedrückte Taste in einer 4x4 -Tastatur scannte
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;
}
Gibt es eine Möglichkeit, diesen Algorithmus in eine Schleife umzuwandeln?
Lösung
Ja. (Zumindest angenommen, Sie bedeuten nicht, diese Aufgaben vor jedem Block von zu haben if
s. Ich gehe davon aus, dass sie zum Testen da waren? Ansonsten macht Ihr Code keinen Sinn.)
Zumindest können Sie jeden der Binärwerte in ein Array einfügen und eine solche Schleife erstellen:
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;
}
}
}
Andere Tipps
Ja, natürlich.
Machen Sie zuerst ein Array mit Ihren Werten. Wir nennen es T [] und zweitens d [] [] // zweidimensionales Array
und lass uns eine Doppelschleife machen
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;
}
}
}
Ich hoffe, das hilft.
Ich weiß nicht, ob 1 dimensionales Array nur für D -Werte benötigt wird. Überprüft nicht jede Zahl