【问题标题】:Convert if statements to for loop? [closed]将 if 语句转换为 for 循环? [关闭]
【发布时间】:2011-05-01 22:10:45
【问题描述】:

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

有没有办法把这个算法变成循环?

【问题讨论】:

  • 您的代码似乎没有意义。您正在设置PORTB 的值,然后检查PORTB 的值是否在某个其他 值集中。这是怎么回事?
  • 实际上,我使用的是中断(PORTB 中断),这段代码是我经过多次尝试后得到的。现在,我有兴趣将此代码转换为循环

标签: c matrix pic keypad mikroc


【解决方案1】:

是的。 (至少假设您实际上并不打算在 ifs 的每个块之前进行这些分配。我假设它们在那里进行测试?否则您的代码没有意义。)

至少,您可以将每个二进制值放入一个数组中,然后像这样构造一个循环:

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

【讨论】:

  • +1 优雅的解决方案。
  • +1:但是数组索引错误(索引前需要减1)。
  • 实际上,我想我现在理解了 OP 的代码(嗯,有点)。在 PIC 上,端口不仅是双向的,而且还有各种神奇的外围设备。我认为在读取之前设置寄存器是为了设置某种中断。所以很可能需要它。
  • @Oli:是的,谢谢。此外,有趣的是 PIC 端口。虽然会导致逻辑混乱的代码。
【解决方案2】:

当然可以。

首先用你的值做一些数组。 我们称它为 t[] 第二个是 d[][] // 二维数组

让我们做双循环

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

希望对您有所帮助。

不知道一维数组是否只需要d值,没有检查每个数字

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多