[英]How do you convert binary 0001,0010,0100,1000 to 0,1,2,3 to index a 4x4 2D array?
我正在从连接到微控制器的 4x4 键盘读取按键,但由于键盘分为行和列,它只能读取 0001 或 1000 等来指定行和列。
我的主要键盘中有一个字符查找表,例如:
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 的表可能会更简单,里面有很多空白,但这看起来不那么令人愉快。
您的switch
语句可以帮助您将索引导出到二维数组中,如下所示:
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;
}
...但是,当按下多个按钮时会发生什么。
您可以编写代码来转换数字格式
# 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.