使用一个按钮在OLED显示屏上显示不同的图像

问题描述

我正在使用带有Adafruit_GFXAdafruit_SSD1306库的oled显示器。

我正在尝试在OLED显示屏上创建菜单(一系列不同的图像)。我创建了代码,当按下一个按钮时,屏幕将变为一幅图像,而当再次按下时,屏幕将变为第二幅图像。但是,我想在此添加第三张图像,这样,当您按下按钮时,将显示第一张图像,然后再次按下按钮,将显示第二张图像,然后再次按下按钮,然后显示第三张图像。我已经尝试了好几个小时都没有成功。

这是我的代码,因为图像太大,我没有包含图像的代码。

#include <Adafruit_SSD1306.h>
#include <splash.h>

#define bitmap_height   128
#define bitmap_width    64

#include <Wire.h>
#include <Adafruit_GFX.h>

#define YELLOW 0xFFE0
#define OLED_RESET -1

Adafruit_SSD1306 display(OLED_RESET);

int buttonState1 = 0;
const int BUTTON_PIN1 = 2;
int toggle = 0;

const unsigned char s1 [] PROGMEM = {
    //image code
};

const unsigned char s2 [] PROGMEM = {
    //second image code
};

void setup() {
    pinMode(BUTTON_PIN1,INPUT_PULLUP);
    display.begin(SSD1306_SWITCHCAPVCC,0x3C);
    display.clearDisplay(); 
}
 
void loop() 
{
    buttonState1 = digitalRead(BUTTON_PIN1);
    
    if (buttonState1 == LOW) {
        if (toggle ==0) {
            display.clearDisplay();
            display.drawBitmap(0,s1,bitmap_height,bitmap_width,WHITE);
            display.display();
            toggle = 1;
        } else {
            display.clearDisplay();
            display.drawBitmap(0,s2,WHITE);
            display.display();
            toggle = 0;
        }
    }
}

解决方法

您可以执行以下操作(未经测试):

xmlns:vm="clr-namespace:MyViewModels"
...
<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
         ...
           Command="{Binding Source={RelativeSource AncestorType={x:Type vm:MyViewModel}},Path=MyCommand}"
           CommandParameter="{Binding .}"
,

您将必须将screed data放入数组中。然后,您可以使用其索引访问每个屏幕。

像这样

#define MAX_SCREENS 3

const unsigned char s1[] = { /* image 1 data*/ };
const unsigned char s2[] = { /* image 2 data*/ };
const unsigned char s3[] = { /* image 3 data*/ };

const unsigned char *screen[MAX_SCREEN] =
{
    s1,s2,s3
}; 

并且您需要使用状态变化检测来检测何时按下按钮,如果变量currentScreen小于MAX_SCREEN,则增加变量0,否则将其设置为void loop () { bool state = digitalRead(buttonPIN); static bool previousState = false; static int currentScreen = 0; if(state != previousState && state) { if(currentScreen == MAX_SCREENS) currentScreen = 0; else currentScreen++; // code for displaying the screen } previousState = state; }

将此作为参考

screen[currentScreen]

然后您可以使用 SELECT * FROM EMPLOYEE_HISTORY WHERE supervisor_login_name IN (select login_name from EMPLOYEE_HISTORY WHERE supervisor_login_name IN ('a','b','c','d','e') and is_active_record = 'Y' and is_employed = 'Y' ) and is_active_record = 'Y' and is_employed = 'Y' OR supervisor_login_name IN (select supervisor_login_name from EMPLOYEE_HISTORY WHERE supervisor_login_name IN ('a','e') and is_active_record = 'Y' and is_employed = 'Y') and is_active_record = 'Y' and is_employed = 'Y' OR supervisor_login_name IN (select login_name from EMPLOYEE_HISTORY WHERE supervisor_login_name IN(select login_name from EMPLOYEE_HISTORY WHERE supervisor_login_name in ('a','e') and is_active_record = 'Y' and is_employed = 'Y') and is_active_record = 'Y' and is_employed = 'Y') and is_active_record = 'Y' and is_employed = 'Y' 显示图像(屏幕)。

如果您不知道状态变化检测的工作原理,可以在Arduino ide中的示例中找到它

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...