打开C

时间:2016-11-17 02:37:30

标签: c

我正在尝试解决以下问题:

“你有一个由LED填充的16x16网格,其中列由0-15位表示,行仅由两个字节0-1表示。编写C脚本以打开任何给定的LED。变量表示LED阵列的名称是LED [16] [2]。“

我真的不确定如何处理这个问题,因为我从来没有在代码中处理位和字节。我知道打开LED的好方法是转到我想要的特定数组索引并将其值设置为“0x01”,但我不知道如何实际索引此数组。我也知道字节通常写为“0x00,0xFF”等,但你会如何表示位?任何帮助将不胜感激。

编辑:抱歉忘记发布代码

int main() {
    char LEDs[16][2];//Assuming char array since chars are 1 byte
    char col, row;

    printf("Enter col and row: \n");
    scanf("%c %c\n", col, row);

    //Turn on LED
    LEDs[col][row] = 0x01;
    //Turn off LED
    LEDs[col][row] = 0x00;
}

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

uint16_t LEDs[16] //Each one is 16 bits
unsigned char row,col;

//Turn on LED
LEDs[row] |= 0x1 << col;
//Turn off LED
LEDs[row] &= ~(0x1 << col);
//Toggle LEDs
LEDs[row] ^= 0x1 << col;

您可能希望检查数字是否在正确的范围内。

答案 1 :(得分:0)

您的阵列是基于行的。也就是说,有16行,每行包含两个字节。由于列值可以是0-15,因此必须先确定它进入的两个字节中的哪一个,以及它对应的位。

也许这使得它更清晰:

col  | 0  1  2  3  4  5  6  7 | 8  9  10 11 12 13 14 15
-----+------------------------+-------------------------
byte | 0  0  0  0  0  0  0  0 | 1  1  1  1  1  1  1  1
bit  | 0  1  2  3  4  5  6  7 | 0  1  2  3  4  5  6  7

这可以通过以下方式实现:

int which_byte = col / 8;
int which_bit = col % 8;
LEDS[row][which_byte] |= (1 << which_bit);

如果需要,可以使用按位运算执行除法和模运算,但这并不像上面的示例那样清晰。

int which_byte = col >> 3;
int which_bit = col & 7;