利用proteus仿真使用Arduino控制 OLED 显示屏ili9341 ,在屏幕上显示一个尽可能大的时钟表盘,包含12个刻度和对应的1~12数字,以及一个秒针。秒针最初向上指向数字12。 Arduino 上连接1个按钮。按钮第一次按下,秒表开始计时,秒针 要准确地转动。按钮第二次按下,秒针暂停,在时钟表盘旁边用数字显示过 去了多少秒(精确到0.01秒)。按钮第三次按下,秒针接着继续转动。第四 次按下,秒针再次暂停,在时钟表盘旁边换行用数字显示过去了多少秒(精 确到0.01秒) 。第五次按下,同第三次· ·如此重复。使用定时器进行准确的计时。 Arduino 上再加1个按钮,此按钮按 下时,秒针归零。全部重新开始。
时间: 2023-12-30 12:06:28 浏览: 79
这个问题可以分为以下几个步骤来解决:
1. 确定硬件连接。首先需要确定如何将Arduino和OLED显示屏以及按钮连接在一起。根据电路图连接硬件,使用Proteus进行仿真。
2. 编写Arduino代码。在Arduino IDE中编写控制OLED显示屏和按钮的代码。需要使用Adafruit GFX库和Adafruit ILI9341库来控制OLED显示屏。使用定时器进行准确的计时。在按钮按下时,控制秒针转动或暂停,并在OLED显示屏上显示计时器的值。
3. 仿真测试。在Proteus中进行仿真测试,确保硬件和代码能够正常工作。可以使用虚拟按钮模拟实际按钮按下。
以下是一个简单的代码示例,用于控制OLED显示屏和按钮,并在OLED上显示一个时钟和计时器的值:
```c++
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <TimerOne.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
#define BUTTON_PIN 2
#define RESET_PIN 3
volatile int count = 0;
volatile boolean paused = true;
volatile boolean reset = false;
volatile unsigned long startTime = 0;
volatile unsigned long pauseTime = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressed, FALLING);
pinMode(RESET_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(RESET_PIN), resetPressed, FALLING);
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(60, 60);
tft.print("12");
tft.setCursor(110, 80);
tft.print("1");
// ...
tft.setCursor(110, 200);
tft.print("11");
tft.setCursor(60, 220);
tft.print("12");
tft.drawCircle(120, 160, 80, ILI9341_WHITE);
}
void loop() {
if (reset) {
count = 0;
paused = true;
reset = false;
startTime = 0;
pauseTime = 0;
tft.fillRect(240, 0, 80, 40, ILI9341_BLACK);
}
if (!paused) {
count = (millis() - startTime) / 10;
}
tft.setCursor(260, 10);
tft.print(count / 100);
tft.print(".");
tft.print(count % 100);
if (!paused) {
drawHand(count % 6000 / 100);
}
}
void buttonPressed() {
if (paused) {
paused = false;
if (startTime == 0) {
startTime = millis();
} else {
startTime += millis() - pauseTime;
}
} else {
paused = true;
pauseTime = millis();
}
}
void resetPressed() {
reset = true;
}
void drawHand(int seconds) {
int x1 = 120, y1 = 160;
int x2 = x1 + 60 * sin(seconds * 2 * PI / 60);
int y2 = y1 - 60 * cos(seconds * 2 * PI / 60);
tft.drawLine(x1, y1, x2, y2, ILI9341_WHITE);
}
```
在此示例中,我们在OLED显示屏上绘制了一个时钟表盘,包括12个刻度和对应的数字。我们还使用了定时器来计时,并在按钮按下时控制秒针转动或暂停,并在OLED上显示计时器的值。在第二个按钮按下时,我们将计时器重置为零。
请注意,这只是一个简单的示例,可能需要根据具体情况进行修改和调整。
阅读全文