Arduino class 初始化执行
Arduino class initialization execution
我正在尝试为 UNO 板编写一个简单的固件,该固件能够在按下按钮时切换 LCD (16x2) 显示器的内容。我尝试使用 classes 和 headers 来编写它,这样我就可以更轻松地向代码中添加更多按钮。问题是我的 class 初始化方法在 while(1)
循环之外不起作用,如下所示。
这根本不起作用:
main.ino
#include "button.h"
#include <avr/io.h>
#include <util/delay.h>
#include <LiquidCrystal.h>
//Buttons PORTX register
#define buttonPortx PORTD
//Buttons DDRx register
#define buttonDdrx DDRD
//Buttons PINx register
#define buttonPinx PIND
//Buttons pins definition
#define B0 PD2
#define B1 PD3
#define B2 PD4
#define B3 PD5
//LCD pins definition
#define RS A5
#define EN A4
#define D4 A3
#define D5 A2
#define D6 A1
#define D7 A0
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
Button button1 = Button();
int main()
{
buttonDdrx = (0 << B0) | (0 << B1) | (0 << B2) | (0 << B3);
buttonPortx = (1 << B0) | (1 << B1) | (1 << B2) | (1 << B3);
//My initialization method:
button1.Initialize(buttonPinx, B0);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Hello!");
while (1)
{
if (button1.IsReleased())
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Pressed!");
while (1);
}
_delay_ms(50);
}
}
但是这个效果很好:
main.ino
#include "button.h"
#include <avr/io.h>
#include <util/delay.h>
#include <LiquidCrystal.h>
//Buttons PORTX register
#define buttonPortx PORTD
//Buttons DDRx register
#define buttonDdrx DDRD
//Buttons PINx register
#define buttonPinx PIND
//Buttons pins definition
#define B0 PD2
#define B1 PD3
#define B2 PD4
#define B3 PD5
//LCD pins definition
#define RS A5
#define EN A4
#define D4 A3
#define D5 A2
#define D6 A1
#define D7 A0
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
Button button1 = Button();
int main()
{
buttonDdrx = (0 << B0) | (0 << B1) | (0 << B2) | (0 << B3);
buttonPortx = (1 << B0) | (1 << B1) | (1 << B2) | (1 << B3);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Hello!");
while (1)
{
//My initialization method:
button1.Initialize(buttonPinx, B0);
if (button1.IsReleased())
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Pressed!");
while (1);
}
_delay_ms(50);
}
}
还有我的 header/cpp 个文件:
button.h
#ifndef Button_h
#define Button_h
class Button
{
public:
Button();
void Initialize(int port, int pin);
bool IsReleased();
private:
bool pressed = false;
int _port;
int _pin;
};
#endif
button.cpp
#include "button.h"
Button::Button()
{
}
void Button::Initialize(int port, int pin)
{
_port = port;
_pin = pin;
}
bool Button::IsReleased()
{
if (!(_port & (1 << _pin)) && (pressed == false))
{
pressed = true;
}
if ((_port & (1 << _pin)) && (pressed == true))
{
pressed = false;
return true;
}
return false;
}
我使用带有参数的 C++ class 构造函数来设置 _port
和 _pin
值,但在查看 this 论坛帖子后我创建了 Initialize(int port, int pin)
方法还是不能解决问题
任何帮助将不胜感激!
您的 _port
变量是简单的 int。它不会从真正的 PINx
寄存器中得到任何东西。它至少应该是指向字节的易失性指针(并取消引用)。
我正在尝试为 UNO 板编写一个简单的固件,该固件能够在按下按钮时切换 LCD (16x2) 显示器的内容。我尝试使用 classes 和 headers 来编写它,这样我就可以更轻松地向代码中添加更多按钮。问题是我的 class 初始化方法在 while(1)
循环之外不起作用,如下所示。
这根本不起作用:
main.ino
#include "button.h"
#include <avr/io.h>
#include <util/delay.h>
#include <LiquidCrystal.h>
//Buttons PORTX register
#define buttonPortx PORTD
//Buttons DDRx register
#define buttonDdrx DDRD
//Buttons PINx register
#define buttonPinx PIND
//Buttons pins definition
#define B0 PD2
#define B1 PD3
#define B2 PD4
#define B3 PD5
//LCD pins definition
#define RS A5
#define EN A4
#define D4 A3
#define D5 A2
#define D6 A1
#define D7 A0
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
Button button1 = Button();
int main()
{
buttonDdrx = (0 << B0) | (0 << B1) | (0 << B2) | (0 << B3);
buttonPortx = (1 << B0) | (1 << B1) | (1 << B2) | (1 << B3);
//My initialization method:
button1.Initialize(buttonPinx, B0);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Hello!");
while (1)
{
if (button1.IsReleased())
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Pressed!");
while (1);
}
_delay_ms(50);
}
}
但是这个效果很好:
main.ino
#include "button.h"
#include <avr/io.h>
#include <util/delay.h>
#include <LiquidCrystal.h>
//Buttons PORTX register
#define buttonPortx PORTD
//Buttons DDRx register
#define buttonDdrx DDRD
//Buttons PINx register
#define buttonPinx PIND
//Buttons pins definition
#define B0 PD2
#define B1 PD3
#define B2 PD4
#define B3 PD5
//LCD pins definition
#define RS A5
#define EN A4
#define D4 A3
#define D5 A2
#define D6 A1
#define D7 A0
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
Button button1 = Button();
int main()
{
buttonDdrx = (0 << B0) | (0 << B1) | (0 << B2) | (0 << B3);
buttonPortx = (1 << B0) | (1 << B1) | (1 << B2) | (1 << B3);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Hello!");
while (1)
{
//My initialization method:
button1.Initialize(buttonPinx, B0);
if (button1.IsReleased())
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Pressed!");
while (1);
}
_delay_ms(50);
}
}
还有我的 header/cpp 个文件:
button.h
#ifndef Button_h
#define Button_h
class Button
{
public:
Button();
void Initialize(int port, int pin);
bool IsReleased();
private:
bool pressed = false;
int _port;
int _pin;
};
#endif
button.cpp
#include "button.h"
Button::Button()
{
}
void Button::Initialize(int port, int pin)
{
_port = port;
_pin = pin;
}
bool Button::IsReleased()
{
if (!(_port & (1 << _pin)) && (pressed == false))
{
pressed = true;
}
if ((_port & (1 << _pin)) && (pressed == true))
{
pressed = false;
return true;
}
return false;
}
我使用带有参数的 C++ class 构造函数来设置 _port
和 _pin
值,但在查看 this 论坛帖子后我创建了 Initialize(int port, int pin)
方法还是不能解决问题
任何帮助将不胜感激!
您的 _port
变量是简单的 int。它不会从真正的 PINx
寄存器中得到任何东西。它至少应该是指向字节的易失性指针(并取消引用)。