/*
Wokwi | general
sang — 9/5/25 at 12:28 PM
https://wokwi.com/projects/441220824338119681
help me. why does the button i press not work
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 7-seg LED (dùng common cathode trong Wokwi)
const int segPins[7] = {16, 4, 2, 15, 14, 12, 13}; // a,b,c,d,e,f,g
const int digitPins[4] = {19, 18, 5, 17}; // 4 digits
// Nút bấm
#define BTN_A 27
#define BTN_B 26
#define BTN_RST 25
int scoreA = 0;
int scoreB = 0;
// map số ra 7-seg
const byte segMap[10] = {
B1111110, //0
B0110000, //1
B1101101, //2
B1111001, //3
B0110011, //4
B1011011, //5
B1011111, //6
B1110000, //7
B1111111, //8
B1111011 //9
};
/*
void showNumber(int num) {
int digits[4];
for (int i = 3; i >= 0; i--) {
digits[i] = num % 10;
num /= 10;
}
for (int d = 0; d < 4; d++) {
digitalWrite(digitPins[d], LOW);
for (int s = 0; s < 7; s++) {
bool on = segMap[digits[d]] & (1 << (6 - s));
digitalWrite(segPins[s], on ? HIGH : LOW);
}
delayMicroseconds(50); // multiplex delay
digitalWrite(digitPins[d], HIGH);
}
}
*/
void showNumber(int num) {
int digits[4];
for (int i = 3; i >= 0; i--) {
digits[i] = num % 10;
num /= 10;
}
for (int d = 0; d < 4; d++) {
for (int seg = 0; seg < 7; seg++) {
// bitRead is LSB first
digitalWrite(segPins[seg], bitRead(segMap[digits[d]], 6 - seg));
}
digitalWrite(digitPins[d], LOW);
digitalWrite(digitPins[d], HIGH);
}
}
void setup() {
//Serial.begin(115200);
Wire.begin();
for (int i = 0; i < 7; i++) pinMode(segPins[i], OUTPUT);
for (int i = 0; i < 4; i++) pinMode(digitPins[i], OUTPUT);
pinMode(BTN_A, INPUT_PULLUP);
pinMode(BTN_B, INPUT_PULLUP);
pinMode(BTN_RST, INPUT_PULLUP);
display.setRotation(2); // flip OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Court 1");
display.display();
}
void loop() {
// đọc nút
if (digitalRead(BTN_A) == LOW) {
scoreA++;
delay(200);
}
if (digitalRead(BTN_B) == LOW) {
scoreB++;
delay(200);
}
if (digitalRead(BTN_RST) == LOW) {
scoreA = 0;
scoreB = 0;
delay(200);
}
// Hiển thị OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print("Court 10 - Match 10");
display.setCursor(0, 20);
display.setTextSize(2);
display.print("A:");
display.print(scoreA);
display.setCursor(0, 45);
display.print("B:");
display.print(scoreB);
display.display();
// Hiển thị 7-seg: ghép score A và B thành 4 số
int displayNum = scoreA * 100 + scoreB;
showNumber(displayNum);
//showNumber(1234);
}
A
B
Reset