我在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;
}
有没有办法将此算法转换为循环?
答案 0 :(得分:5)
是。 (至少假设你实际上并不是指在每个if
块之前进行这些分配。我假设他们在那里进行测试?否则你的代码没有意义。)
至少,您可以将每个二进制值放入一个数组中,并构造一个这样的循环:
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)
当然可以。
首先使用您的值做一些数组。 我们称之为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值是否只需要1维数组,没有检查每个数字