Arduino LED Display (7 / 12 steg)
Steg 7: Programvara - målning på displayen
Displayen består av några LED-moduler, men form API perspektiv de är
sammankopplade till en kontinuerlig duk. Du kan placera på denna duk bitmapp på vilken position som ges av (x, y) koordinater från bilden ovan.
Metoden paint har följande syntax: paint (pixel_t x pixel_t y, pixel_t bredd, pixel_t höjd, uint8_t data).
Det kan du måla en bitmapp på givna koordinater med begränsad bredd och höjd. Så kan du till exempel måla en bitmapp på (3,4) som har 25 x 3 pixlar. Det kan vara större än en faktisk visningsstorlek - i detta fall det kommer att få trimmas.
Detta är självklar och enkel, men det finns en hake - du har rätt uppgifter. Detta är 2D array, där första dimensionen visar vertikala och andra horisontella position på displayen. Tekniskt sett data är platt matris med pekare och varje pekaren pekar på array som representerar en vågrät linje på displayen.
Flytta över första dimensionen av data korsar över linjer på displayen. Den andra dimensionen av data representerar horisontella pixlar inom enskild rad, där varje byte representerar 8 pixlar. Eftersom våra displayen består av enkla lysdioder de kan vara antingen på eller av staten, så varje pixel är inte återges av en byte, men av en bit. För att täcka 16 pixlar i horisontellt läge behöver vi två bytes, 24 bildpunkter kräver 3 byte, och så vidare.
Till exempel att fullt skaldisplayen bestående av 8 x 3 LED Kit (som används i våra exempel) behöver vi data [3] [8]. Vanligtvis kommer du att ta array liten nog att passa din bitmapp och inte en som täcker upp hela displayen.
Metoden paint(...) uppdaterar intern buffert, för att skicka innehållet i denna buffert till MAX marker du måste ringa flush(). Tanken bakom är att ge dig möjlighet att visa några bitmappar på displayen och efter att måla resultatet. Du kan programmera några oberoende rutiner, som kommer att uppdatera olika delar av skärmen och spola alla förändringar på en gång.
Kommunikation med MAX marker är inte mycket snabb och skickar innehållet i hela displayen med varje flush() är tidskrävande. Du skulle kunna påskynda processen genom att aktivera dubbel buffring (set DEOUBLE_BUFFER i Display.h till true). I detta fall skickar flush() metoden endast byte som har ändrats, så att du kan ringa flush() med varje ögla och inte behöva oroa förlora prestanda. Den enda nackdelen är ökad användning av RAM: vi skapar 2D array som allokerar 8 byte per varje LED Kit plus några tips som vanligtvis krävs för att upprätthålla matriser.
2D matriser i detta projekt har minskat minne footprint, eftersom skapa dynamisk 2D array, skapar vi faktiskt 2 matriser med beräknade offset (se: alloc2DArray8(...) i Util.h).