You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向函数传递对象?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");
}

二、关于对象的疑问及传递方法

  1. lcd确实是对象:你声明的LiquidCrystal lcd(...)是LiquidCrystal类的实例,也就是对象,它封装了LCD硬件的操作逻辑(比如begin()、print()、setCursor()等成员函数)。

  2. 向函数传递对象的三种常用方式:
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:29:54