Danger001 Creative Commons License 2025.01.09 0 0 4900

Sziasztok! Készíteni szeretnék egy dupla "BCD" bemenetű dekódert ami 2x7 szegmenses kijelzőn mutatná az aktuális bemeneti értéket 0-F-ig, és ezt pedig tárolva LE funkcióval mint egy cd4511 negatív élre triggerelve. A multiplexelt kijelző 5ms időben váltogatja egymást. A kijelzők 330ohmos ellenállással lesznek korlátozva, a közös pontjuk pedig tranzisztorral kapcsolva. Szerintetek helyes a mellékelt kód? Z80-as számítógéphez lenne, és ezekkel jeleníteném meg az aktuális busz állapotokat.


#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 8000000UL // 8 MHz az órajel

// A szegmensek kódjai (7 szegmenses kijelzőhöz)
const uint8_t segment_code[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x77, // A
0x7C, // B
0x58, // C
0x5E, // D
0x79, // E
0x71 // F
};

// BCD bemenetek
uint8_t bcd1_latched = 0x00; // Első BCD érték
uint8_t bcd2_latched = 0x00; // Második BCD érték

// Funckió a BCD bemenetek kezelésére
void updateDisplay(uint8_t bcd1, uint8_t bcd2) {
PORTB = segment_code[bcd1]; // Első kijelző frissítése
PORTC &= ~(1 << PC1); // Első kijelző kikapcsolása
PORTC |= (1 << PC2); // Második kijelző bekapcsolása
PORTB = segment_code[bcd2]; // Második kijelző frissítése
}

void setup() {
// BCD bemenetek (PD0-PD3, PD4-PD7)
DDRD &= ~(0xFF); // Az összes PD0-PD7 bemenet, így bcd1 és bcd2
// Kijelző szegmensek (PB0-PB6)
DDRB = 0x7F; // PB0-PB6 a szegmensek (kimenet)
// Kijelző választás (PC1, PC2)
DDRC |= (1 << PC1) | (1 << PC2); // Kimenet a kijelző választásához
// Latch láb (PC3)
DDRC |= (1 << PC3); // Latch láb kimenet
PORTC |= (1 << PC3); // Alapértelmezett állapot: latch alaphelyzetbe

// Kijelzők kezdeti állapota
PORTC &= ~(1 << PC1); // Az első kijelző kikapcsolása
PORTC &= ~(1 << PC2); // A második kijelző kikapcsolása
}

void loop() {
uint8_t bcd1_input = PIND & 0x0F; // BCD1 (PD0-PD3)
uint8_t bcd2_input = (PIND >> 4) & 0x0F; // BCD2 (PD4-PD7)

// Latch funkció
if (PINC & (1 << PC3)) { // Ha a latch láb magas
bcd1_latched = bcd1_input; // Frissíti az első BCD értéket
bcd2_latched = bcd2_input; // Frissíti a második BCD értéket
PORTC &= ~(1 << PC3); // Alacsony élre tárolja az adatokat
}

// Kijelző frissítése a latched értékekkel
updateDisplay(bcd1_latched, bcd2_latched);

_delay_ms(5); // Rövid idő a kijelzők frissítéséhez
}

int main() {
setup();
while (1) {
loop();
}
}