c - 如何计算开关数量并通过应用屏蔽来开关相应数量的LED?

标签 c bitwise-and

我正在使用 DE0 板,想要计算处于 ON 位置的滑动开关的数量(其中有 10 个),然后点亮板上相应数量的 LED(也是 10 个)。但是我不知道如何使用 IOWR 的屏蔽结果。谢谢您

alt_u16 sw;

volatile int i = 0;

alt_u16 count = 0x0;

alt_u16 mask = 0x0001;

alt_u16 sw2;

int CountSWITCHES(alt_u16 sw);

int alt_main (void)
{
    while(1)
    {   
        sw = IORD_ALTERA_AVALON_PIO_DATA(SWITCHES_BASE); 

        IOWR_ALTERA_AVALON_PIO_DATA(LEDS_BASE, sw2);
    }
    return 0;
}

int CountSWITCHES(alt_u16 sw)
{
    for(i = 0; i < 10; i++)
    {
        if (sw & mask)
        {
            count++;
        }

        mask = mask >> 1;
    }
    return count;    
}

void TurnLedsON(alt_u16 sw2)
{
    sw2 = CountSWITCHES(sw);
}

最佳答案

函数CountSWITCHES不正确,应该是:

int CountSWITCHES(alt_u16 sw)
{
    alt_u16 mask = 1;

    for(i = 0; i < 10; i++)
    {
        if (sw & mask)
        {
            count++;
        }

        mask = mask << 1;
    }

    return count;    
}

顺便说一句,此函数返回开关打开的数量,但不返回它们的位置。

IOWR_ALTERA_AVALON_PIO_DATA(base, data) 需要一个位域data:每个设置为 1 的位都会将端口对应的输出设置为 1 (base) >)通过了。 这意味着您必须根据开关位置设置 sw2 变量的位。

关于c - 如何计算开关数量并通过应用屏蔽来开关相应数量的LED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041700/

相关文章:

c - C 中特定格式的输出文件

javascript - 按位 & 在 javascript 中不返回预期结果

c - 按位与运算不清楚

c - 不同宽度数据类型上位移运算符的安全性

c++ - 这 "if(k.c[3] & c)"部分代码在做什么?

c - 使用 void* 指针将未知/混合类型传递给 printf() (一种在运行时推断类型)

c - 使用 argp 解析 C 参数时出现段错误

c - 使用 CUDA C 的 2D 矩阵的积分图像或求和面积表

c - 转义 C 中的 if 语句

c - 按位运算符的幂 2 的模数?