en | de

keyboard image

Spielkonsole

eine Videospielkonsole basiert auf einem atmega328 microcontroller

Teile Zweck
Atmega328 Controller
64 LEDs Display
4 Buttons Input
1 Lautsprecher Audio

Code

Das Gerät hat ein kompaktes Betriebssystem, das hauptsächlich von Timer-Interrupts gesteuert wird.
das Display Rendert so automatisch die Pixel aus dem gfx Buffer.

für Audio wird der Sound-buffer genutzt.
in dem Frequenz und Dauer pro Ton gespeichert wird

Das Spiel wird aus einer Liste aller Programme ausgewählt.
um ein Spiel hinzuzufügen. definiere es in einer C-Funktion.
und hänge den pointer an das Programm-Array an.

GFX

Die Anzeige wird aus einem Pixelbuffer gerendert.
Es gibt 3 verschiedene Buffer, Eine pro Helligkeit.

union {
    struct {
            uint8_t bright[8];
            uint8_t medium[8];
            uint8_t faint[8];
            }array;
    uint64_t number[3];
} gfx_buffer;

nun wird das Bild auf dem Bildschirm angezeigt.

ISR(TIMER0_OVF_vect){ // gfx
    counter++;
    PORTB = 0;
    PORTD = ~(1 < (counter%8)) ;
    PORTB = gfx_buffer.array.faint[(counter % 8) ];
}

ISR(TIMER0_COMPA_vect){ // gfx
    PORTB = gfx_buffer.array.medium[(counter % 8) ];
}

ISR(TIMER0_COMPB_vect){ // gfx
    PORTB = gfx_buffer.array.bright[(counter % 8) ];
}

der Pointer zum Spiel wird in ein Array eingefügt,
der Name für das Auswahlmenü in ein anderes Array, mit gleichem Index.

die Namen müssen im Bereich
hex 30-5a (dez 48-90)
die Kodierung ist:

//  0x40 ........................................... 0x5a
//       0123456789!      ABCDEFGHIJKLMNOPQRSTUVWXYZ

Ascii / utf-8:

//  0x40 ........................................... 0x5a
//       0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

die Schriftart ist als 5x4 Glyphen mit einem Bit pro Pixel
und 1 Byte pro Zeile der Glyphe definiert. (4 Bits pro Zeile sind ungenutzt)

uint8_t numbers[] = {
// 0
   0b0010,
   0b0101,
   0b0111,
   0b0101,
   0b0010,
// 1
   0b0110,
   0b0010,
   0b0010,
   0b0010,
   0b0111,
// ...
// Z
   0b0111,
   0b0001,
   0b0010,
   0b0100,
   0b0111,
};
void (*games[])() ={ // function pointers to each program
    game_snake,
    game_paint,
    game_alphabet,
    game_music,
};

char* game_names[] = {
    "==SNAKE==",
    "==PAINT==",
    "==ABC==",
    "==MUSIC==",
// the '=' will be displayed as empty space
};

das Spiel lässt sich jetzt im Startmenü auswählen

<= zurück
aus Markdown generiert
source
2026 / Feb / 06