我在 mikroC 中编写了一个函数,用于扫描 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;
}
有没有办法把这个算法转换成循环?
最佳答案
是的。 (至少假设您实际上并不打算在每个 if
block 之前进行这些分配。我假设它们是为了测试?否则您的代码就没有意义。)
至少,您可以将每个二进制值放入一个数组中,并构造一个如下所示的循环:
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;
}
}
}
关于将 if 语句转换为 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5851807/