#include <Arduino.h>
// Definicje pinów (zgodnie z Twoim ustaleniem)
#define PIN_PL 3 // Pin 1 układu (PL)
#define PIN_CP 2 // Pin 2 układu (CP)
#define PIN_D4 11 // Pin 3 układu (D4)
#define PIN_D5 10 // Pin 4 układu (D5)
#define PIN_D6 1 // Pin 5 układu (D6)
#define PIN_D7 0 // Pin 6 układu (D7)
#define PIN_Q7_N 7 // Pin 7 układu (Q7_N)
#define PIN_Q7 21 // Pin 9 układu (Q7)
#define PIN_DS 20 // Pin 10 układu (DS)
#define PIN_D0 19 // Pin 11 układu (D0)
#define PIN_D1 18 // Pin 12 układu (D1)
#define PIN_D2 9 // Pin 13 układu (D2)
#define PIN_D3 13 // Pin 14 układu (D3)
#define PIN_CE 12 // Pin 15 układu (CE)
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n74HC165 - Test wszystkich 256 kombinacji (Tabela wyników)\n");
// Konfiguracja pinów sterujących jako wyjścia z perspektywy ESP32
pinMode(PIN_PL, OUTPUT);
pinMode(PIN_CP, OUTPUT);
pinMode(PIN_CE, OUTPUT);
pinMode(PIN_DS, OUTPUT);
// Piny D0-D7 jako wyjścia do sterowania stanami wejściowymi
pinMode(PIN_D0, OUTPUT);
pinMode(PIN_D1, OUTPUT);
pinMode(PIN_D2, OUTPUT);
pinMode(PIN_D3, OUTPUT);
pinMode(PIN_D4, OUTPUT);
pinMode(PIN_D5, OUTPUT);
pinMode(PIN_D6, OUTPUT);
pinMode(PIN_D7, OUTPUT);
// Odczyt szeregowy
pinMode(PIN_Q7, INPUT);
pinMode(PIN_Q7_N, INPUT);
// Aktywacja zegara
digitalWrite(PIN_CE, LOW);
// Idealnie dopasowany nagłówek tabeli
Serial.println("+-----+------+----------+--------+");
Serial.println("| Dec | Hex | Binarny | Status |");
Serial.println("+-----+------+----------+--------+");
bool all_passed = true;
for (int i = 0; i < 256; i++) {
uint8_t test_val = (uint8_t)i;
// Wystawiamy kombinację na piny D0-D7
digitalWrite(PIN_D0, (test_val & 0x01) ? HIGH : LOW);
digitalWrite(PIN_D1, (test_val & 0x02) ? HIGH : LOW);
digitalWrite(PIN_D2, (test_val & 0x04) ? HIGH : LOW);
digitalWrite(PIN_D3, (test_val & 0x08) ? HIGH : LOW);
digitalWrite(PIN_D4, (test_val & 0x10) ? HIGH : LOW);
digitalWrite(PIN_D5, (test_val & 0x20) ? HIGH : LOW);
digitalWrite(PIN_D6, (test_val & 0x40) ? HIGH : LOW);
digitalWrite(PIN_D7, (test_val & 0x80) ? HIGH : LOW);
delayMicroseconds(10);
// Odczytujemy stan z rejestru
uint8_t read_val = 0;
digitalWrite(PIN_PL, LOW);
delayMicroseconds(5);
digitalWrite(PIN_PL, HIGH);
delayMicroseconds(5);
for (int b = 0; b < 8; b++) {
if (digitalRead(PIN_Q7) == HIGH) {
read_val |= (1 << (7 - b));
}
digitalWrite(PIN_CP, HIGH);
delayMicroseconds(5);
digitalWrite(PIN_CP, LOW);
delayMicroseconds(5);
}
// Formatowanie wyświetlania bitów binarnie (zawsze równe 8 znaków)
char bin_str[9];
for (int b = 7; b >= 0; b--) {
bin_str[7 - b] = (test_val & (1 << b)) ? '1' : '0';
}
bin_str[8] = '\0';
const char* status = (read_val == test_val) ? " OK " : " BŁĄD ";
if (read_val != test_val)
all_passed = false;
// Wypisanie wiersza tabeli z zachowaniem stałej szerokości kolumn
Serial.printf("| %3d | 0x%02X | %s | %s |\n", i, test_val, bin_str, status);
}
Serial.println("+-----+------+----------+--------+");
if (all_passed) {
Serial.println("\nPodsumowanie: Wszystkie 256 testów przeszło pomyślnie!");
} else {
Serial.println("\nPodsumowanie: Wykryto błędy w testach!");
}
}
void loop() {
// Test wykonuje się jednorazowo po uruchomieniu
}