// ================================================================
// Futaba 8-MD-06INKM – ESP32-S3 DevKitC-1
// Oparty na kodzie Floriana Schäffera (blafusel.de, 2/2023)
//
// Protokół własny Futaba: LSB first, CS aktywny LOW
//
// Pinout ESP32-S3:
// DIN = GPIO 11
// CLK = GPIO 12
// CS = GPIO 10
// RES = GPIO 2
// EN = GPIO 3
// ================================================================
#define PIN_DIN 11
#define PIN_CLK 12
#define PIN_CS 10
#define PIN_RES 2
#define PIN_EN 3
// Komendy VFD
const uint8_t cDisplayNormal = 0xE8;
const uint8_t cDisplayOff = 0xEA;
const uint8_t cBrightLevel = 0xE4;
const uint8_t cDigitSet = 0xE0;
// Wysyłanie bajtu LSB first (bitbang)
void VFD_write(uint8_t w_data) {
delayMicroseconds(2);
for (uint8_t i = 0; i < 8; i++) {
digitalWrite(PIN_CLK, LOW);
digitalWrite(PIN_DIN, (w_data & 0x01) ? HIGH : LOW);
delayMicroseconds(1);
digitalWrite(PIN_CLK, HIGH);
delayMicroseconds(1);
w_data >>= 1;
}
delayMicroseconds(1);
}
void VFD_cmd(uint8_t command) {
digitalWrite(PIN_CS, LOW);
VFD_write(command);
delayMicroseconds(1);
digitalWrite(PIN_CS, HIGH);
}
// Display ON (odświeżenie)
void VFD_show(void) {
digitalWrite(PIN_CS, LOW);
VFD_write(0xE8);
digitalWrite(PIN_CS, HIGH);
}
void VFD_init() {
// Set Digit Count: 8 cyfr
digitalWrite(PIN_CS, LOW);
VFD_write(cDigitSet);
delayMicroseconds(5);
VFD_write(0x07);
digitalWrite(PIN_CS, HIGH);
delayMicroseconds(5);
// Set Dimming: 0x40 (ok. 25%)
digitalWrite(PIN_CS, LOW);
VFD_write(cBrightLevel);
delayMicroseconds(5);
//VFD_write(0x40); // 25% jasność
VFD_write(0xFF); // max jasność
digitalWrite(PIN_CS, HIGH);
delayMicroseconds(5);
// Display ON
VFD_cmd(cDisplayNormal);
}
// Wypisz jeden znak na pozycji x (0–7)
// chr: indeks w tabeli – wyświetli znak chr+0x30 (ASCII)
void S1201_WriteOneChar(uint8_t x, uint8_t chr) {
digitalWrite(PIN_CS, LOW);
VFD_write(0x20 + x);
VFD_write(chr + 0x30);
digitalWrite(PIN_CS, HIGH);
VFD_show();
}
// Wypisz string od pozycji x
void VFD_WriteStr(uint8_t x, const char *str) {
digitalWrite(PIN_CS, LOW);
VFD_write(0x20 + x);
while (*str) VFD_write(*str++);
digitalWrite(PIN_CS, HIGH);
VFD_show();
}
void setup() {
Serial.begin(115200);
pinMode(PIN_EN, OUTPUT);
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_DIN, OUTPUT);
pinMode(PIN_CS, OUTPUT);
pinMode(PIN_RES, OUTPUT);
digitalWrite(PIN_EN, HIGH);
digitalWrite(PIN_CS, HIGH);
digitalWrite(PIN_CLK, HIGH);
// Reset
delay(2);
digitalWrite(PIN_RES, LOW);
delayMicroseconds(10);
digitalWrite(PIN_RES, HIGH);
delay(2);
VFD_init();
Serial.println("VFD gotowy");
}
void loop() {
// Test 1: cyfry 0–7
S1201_WriteOneChar(0, 0);
S1201_WriteOneChar(1, 1);
S1201_WriteOneChar(2, 2);
S1201_WriteOneChar(3, 3);
S1201_WriteOneChar(4, 4);
S1201_WriteOneChar(5, 5);
S1201_WriteOneChar(6, 6);
S1201_WriteOneChar(7, 7);
delay(1000);
// Test 2: string ASCII
VFD_WriteStr(0, "ABCDEFGH");
delay(1000);
// Test 3: scan wszystkich znaków ROM 02 (i*8+x, i=1..31)
for (int16_t i = 1; i <= 31; i++) {
for (int16_t x = 0; x <= 7; x++) {
digitalWrite(PIN_CS, LOW);
VFD_write(0x20 + x);
VFD_write(i * 8 + x);
digitalWrite(PIN_CS, HIGH);
VFD_show();
delay(50);
}
delay(500);
}
delay(1000);
}