Как преобразовать двоичный код 0001,0010,0100,1000 в 0,1,2,3 для индексации двумерного массива 4x4? - PullRequest
0 голосов
/ 21 апреля 2020

Я читаю нажатия клавиш с клавиатуры 4x4, подключенной к микроконтроллеру, но, поскольку клавиатура разделена на строки и столбцы, для указания строки и столбца читается только 0001 или 1000 et c.

I у меня в основной таблице есть таблица поиска символов для клавиатуры, например:

char keys[4][4]={
        //       c3  c2  c1  c0
                {'1','2','3','A'},  //row4 PortA4 1000 

                {'4','5','6','B'},  //row3 PortA3 0100

                {'7','8','9','C'},  //row2 PortA2 0010

                {'*','0','#','D'}   //row1 PortA1 0001

                };

Я хочу, чтобы входы, считанные с клавиатуры, могли напрямую индексировать эту таблицу и распечатывать указанный символ, но, естественно, любое число выше 3 выходит за пределы. Я хочу иметь возможность использовать что-то вроде

printf("Key Pressed: %c",keys[indexrow][indexcolumn]);

, но сейчас у меня это жестко закодировано следующим образом:

...

while(1)
    {
        //begin polling
        row_data=0x01;//bottom row
        bus.IOWrite(PortA,row_data);
        column_data=b&bus.IORead(PortB);
        if((column_data & b)!=0)
        {
            //printf("Keypress detected @row %0b @column %0b",row_data,column_data);
            switch(column_data)
            {
                case 0x01:printf("Key Pressed: D");break;
                case 0x02:printf("Key Pressed: #");break;
                case 0x04:printf("Key Pressed: 0");break;
                case 0x08:printf("Key Pressed: *");break;
                default: break;
            }

        }
.
.
.

Полагаю, было бы проще создать таблицу 8x8 с внутри много пустых мест, но на это было бы не так приятно смотреть.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Вы можете написать код для преобразования числового формата

# include <stdio.h>

int main()
{
  int numberToBeConverted = 0x08;
  int i,j;
  for(i=numberToBeConverted, j=1; i!=0;i/=2,j++)
  {
    if(i&1==1)
    {
      printf("%d\n",j);
      //Whatever you want to do with the key thats pressed
    }

  }
  return 0;
}
0 голосов
/ 21 апреля 2020

Вы switch оператор может помочь вам получить индекс в вашем 2-мерном массиве, как это:

            switch(column_data)
            {
                case 0x01:column_index=0;break;
                case 0x02:column_index=1;break;
                case 0x04:column_index=2;break;
                case 0x08:column_index=3;break;
                default: /* probably needs handling here */ break;
            }

... но, что происходит, когда нажимается более одной кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...