我正在编程一个Arduino Sketch,它通常是一个使用4个数字系统的计算器:十进制,二进制,八进制和十六进制。 当我向用户询问数字系统时,他将使用键盘输入所需的系统(1代表十进制,2代表十六进制,3代表八进制和4代表二进制),然后在收到此输入后,arduino将在LCD上打印选择的系统。但是代码的这些部分似乎可以无限地重复自身,而无需执行输入数字和操作数的部分。我无法输入不是1、2、3或4的数字,如果我按这些数字之一,它将打印其系统,而完全忽略了先前的输入。
我尝试过布尔开关,以指示程序如果先前已经执行过但不起作用,则不会运行该部分代码
这是代码中接收输入并对其进行验证的部分。开关盒在其他3种情况下重复其自身3次,从而改变了打印的数字系统。
void loop()
{
char base = calcuShift.getKey();
if (base != NO_KEY && (base == '1' || base == '2' || base == '3' || base == '4')) {
switch (base) {
case '1':
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema");
lcd.setCursor(0,1);
lcd.print("Decimal");
delay(3000);
lcd.clear();
break;
切换后,它必须执行以下代码:
char key;
if (digitalRead(A0) == HIGH) {
key = calcuShift.getKey();
} else {
key = calcu.getKey();
}
if (key != NO_KEY &&
(key=='1' || key=='2' || key=='3' || key=='4' || key=='5' || key=='6' || key=='7' || key=='8' || key=='9') &&
base == '1') {
if (inicio == false) {
num1 = num1 + key;
int numLength = num1.length();
lcd.setCursor(15-numLength,0);
lcd.print(num1);
} else {
num2 = num2 + key;
int numLength = num2.length();
lcd.setCursor(15-numLength,1);
lcd.print(num2);
final = true;
}
显然包括其他条件,这些条件根据变量“ base”(用户在开始时输入的条件)而有所不同。如果是1(十进制),则接受数字0到9;如果是2(十六进制),则接受数字0到F,依此类推。 用户用可变键输入他的数字。对象calcuShift只是移位模式下的普通键盘,字母和其他两个操作数而不是数字,而乘法和除法操作数由幂和根操作数代替。
我希望我的计算器接收所需的数字系统,在该系统中接收数字并使用这些数字进行运算,并在先前选择的系统中返回答案,而只是坚持输入指示“ base”的变量使用的数字系统。
答案 0 :(得分:0)
Arduino草图旨在尽可能快地执行loop()
。
任何打算在启动后运行一次的内容都应进入setup()
通常,您定义一种finite state machine
,无论用户应该输入数字基本代码还是数字或操作员键,其行为都不同。并将先前的输入(当前状态)存储在某些全局或静态变量中。
loop()
的结尾没有“程序”完成,但是它只是检查了当前所有可能的状态更改,将其存储并最终进行了更新。
由于loop()
足够快,可以在按下任何按钮时立即做出反应,因此通常不会执行任何操作,因为没有按下新键。
如果您的代码可以永久重复执行某件事,但应该只重复执行一次,那么您根本就不会存储已经完成的事实。 (或者您将“重置”按钮用作用户界面,并仅在setup()
阶段允许使用“选择数字基础”)