我已经编写了以下函数,并使用Arduino MEGA进行了检查。只需读取PORTC并过滤4位代码,函数就根据该位值返回-2到13。
#define PDL_1_BRN 37 //PC0
#define PDL_2_GRN 36 //PC1
#define PDL_3_WHT 35 //PC2
#define PDL_4_YEL 34 //PC3
void setup() {
Serial.begin(9600);
pinMode(PDL_1_BRN, INPUT); //use external pullup
pinMode(PDL_2_GRN, INPUT);
pinMode(PDL_3_WHT, INPUT);
pinMode(PDL_4_YEL, INPUT);
}
uint32_t t = 0;
void loop() {
t = micros();
getPedalState();
Serial.println(micros() - t);
}
int8_t getPedalState() {
uint8_t val = 0;
val = PINC & 0x0F;
switch (val) {
case 0x0F:
return 0;
break;
case 0x0B:
return 1;
break;
case 0x09:
return 2;
break;
case 0x01:
return 3;
break;
case 0x05:
return 4;
break;
case 0x0D:
return 5;
break;
case 0x0C:
return 6;
break;
case 0x04:
return 7;
break;
case 0x00:
return 8;
break;
case 0x08:
return 9;
break;
case 0x0A:
return 10;
break;
case 0x02:
return 11;
break;
case 0x06:
return 12;
break;
case 0x0E:
return 13;
break;
case 0x07:
return -1;
break;
case 0x03:
return -2;
break;
}
}
使用单独的代码,我使用
micros()
测量了PORTC读取执行时间。据我测量,它需要4uS。此代码还读取PORTC,然后使用
switch case
标识端口值。但是,整个功能也只有4uS的时间来执行所有指令(端口读取,屏蔽,开关盒)。
这意味着,切换案例至少无需花费1uS的时间即可执行。
据我所知,夹心案例开始将代码的顶部与底部的代码一一比较。 (这意味着开关盒有更多时间在代码底部返回值。)但是,对于PORTC的任何值,此代码仅获得4uS。
请解释
switch case
如何在Arduino / C ++中工作。 最佳答案
微米功能的分辨率为4uS。这就是为什么您看到相同的值。相反,拨动一个引脚并用示波器观察它,您会更好地了解实际时序。
关于c++ - 开关案例声明如何在Arduino/C++中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58642484/