我为图形 LCD 制作的库中的一些函数遇到了一个非常奇怪的问题,该 LCD 通过硬件串行与我的 arduino 通信。它只是屏幕使用的串行协议的简单包装器。
基本上,每当我从这个库中调用某些函数时,我都会收到“未定义的引用...”错误。但是,其他功能工作正常,我无法辨别正在工作的功能和不工作的功能之间的任何语法差异。
例如,我有一个盒子功能。当我调用它并给它四个整数时,它期望它可以正常工作。fill_box
, 和circle
, 和 也是如此erase_box
。
但是像backlight
或者offset
甚至被调用的函数arg
(以反映我当时的感受......)会导致代码触发未定义的引用。我不知道为什么......我的错误是什么?
这是一个运行良好的代码示例:
#include <gLCD.h>
gLCD obj = gLCD();
void setup(){
obj.fill_box(0,0,60,60);
obj.erase_box(5,5,15,15);
obj.circle(50,50,25);
}
void loop(){delay(1000);}
但是只要我添加任何类似的东西obj.line
,就像这样
#include <gLCD.h>
gLCD obj = gLCD();
void setup(){
obj.fill_box(0,0,60,60);
obj.erase_box(5,5,15,15);
obj.circle(50,50,25);
obj.line(0,0,40,40);
}
void loop(){
delay(1000);
}
然后我得到一个未定义的引用。与obj.offset
、obj.blacklight
和相同pixel
。
我只是不知道为什么会这样。而且我开始感到非常沮丧,因为我什至不能编写一个简单的库......无论如何,这是有问题的库:
这是gLCD.cpp
:
#include "gLCD.h"
HardwareSerial Uart = HardwareSerial();
gLCD::gLCD(){
Uart.begin(115200);
}
void gLCD::box(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x0F);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0x01);
}
void gLCD::fill_box(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x12);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0xFF);
}
void gLCD::circle(int x1, int y1, int rad){
Uart.write(0x7C);
Uart.write(0x03);
Uart.write(x1);
Uart.write(y1);
Uart.write(rad);
Uart.write(0x01);
}
void gLCD::erase_block(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x05);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
}
void arg(){
Uart.print("this is bullsh*t!");
}
void offset(int x1, int y1){
Uart.write(0x7C);
Uart.write(0x18);
Uart.write(x1);
Uart.write(0x7C);
Uart.write(0x19);
Uart.write(y1);
}
void backlight(int duty_cycle){
Uart.write(0x7C);
Uart.write(0x02);
Uart.write(duty_cycle);
}
void line(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x0C);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0x01);
}
void pixel(int x ,int y ,int sr){
Uart.write(0x7C);
Uart.write(0x10);
Uart.write(x);
Uart.write(y);
Uart.write(sr);
}
这是 gLCD.h:
#ifndef gLCD_h
#define gLCD_h
#include <Arduino.h>
class gLCD{
public:
gLCD();
void box(int x1, int y1, int x2, int y2);
void fill_box(int x1, int y1, int x2, int y2);
void circle(int x1, int y1, int rad);
void offset(int x1, int y1);
void backlight(int duty_cycle);
void line(int x1, int y1, int x2, int y2);
void pixel(int x ,int y ,int sr);
void erase_block(int x1, int y1, int x2, int y2);
void arg();
};
#endif