如何向函数传递对象?Arduino Leonardo LCD显示异常排查求助
问题解答
一、LCD内容不显示的原因及修复
你的代码存在一个致命的大小写拼写错误:
loop()中调用的是output()(put全小写),但函数定义是void outPut(){...}(Put的P大写)。C++是大小写敏感语言,这两个是完全不同的标识符,导致目标函数从未被执行。
修复方法:将调用语句改为outPut(),或者把函数名改为output(),保持调用与定义的名称完全一致。
额外优化建议:为避免旧内容干扰新输出,可在打印前用空格覆盖光标位置的原有内容:
void outPut(){ lcd.print(" "); // 用11个空格覆盖该行后半段区域 lcd.setCursor(10,1); // 重新定位光标到目标位置 lcd.print("Does not show"); }
二、关于对象的疑问及传递方法
lcd确实是对象:你声明的
LiquidCrystal lcd(...)是LiquidCrystal类的实例,也就是对象,它封装了LCD硬件的操作逻辑(比如begin()、print()、setCursor()等成员函数)。向函数传递对象的三种常用方式:
在C++/Arduino环境中,传递对象主要有以下三种方式,各有适用场景:
- 传值:直接传入对象,函数会创建对象的副本,修改副本不会影响原对象。这种方式会额外占用内存,效率较低,不推荐用于硬件操作类对象:
void outPut(LiquidCrystal lcd_copy){ lcd_copy.print("Test Content"); } // 调用方式:outPut(lcd);
- 传引用:在参数前加
&,函数直接操作原对象,无副本开销,是最常用的方式:
void outPut(LiquidCrystal &lcd_ref){ lcd_ref.print("Does not show"); } // 调用方式:outPut(lcd);
这种方式适合需要操作原对象的场景,比如LCD这类绑定硬件的实例。
- 传指针:传递对象的内存地址,通过指针访问原对象,参数前加
*,调用时传入对象地址&lcd:
void outPut(LiquidCrystal *lcd_ptr){ lcd_ptr->print("Does not show"); // 用->访问指针指向对象的成员函数 } // 调用方式:outPut(&lcd);
你的原代码中lcd是全局变量,因此outPut可以直接访问它,这也是可行的写法,但如果需要让函数支持多个LCD实例,传递引用会让代码更通用。
修复后的完整代码示例
#include <LiquidCrystal.h> #include <Keyboard.h> //LCD pin to Arduino const int pin_RS = 8; const int pin_EN = 9; const int pin_d4 = 4; const int pin_d5 = 5; const int pin_d6 = 6; const int pin_d7 = 7; const int pin_BL = 10; int y = 0; int z = 0; LiquidCrystal lcd(pin_RS, pin_EN, pin_d4, pin_d5, pin_d6, pin_d7); void setup() { Keyboard.begin(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Electropeak.com"); lcd.setCursor(0,1); lcd.print("Press Key:"); } void loop() { Keyboard.press('f12'); delay(100); Keyboard.releaseAll(); delay(1000); int x = analogRead(0); lcd.setCursor(10,1); outPut(); // 修正函数名拼写,与定义保持一致 } void outPut(){ lcd.print(" "); lcd.setCursor(10,1); lcd.print("Does not show"); }
内容的提问来源于stack exchange,提问作者techcord
相关产品推荐
相关产品推荐

