Management of a 8x8 LED matrix by pixel
published: 28 December 2019 / updated 28 December 2019
Gestion par pixels
Dans ces deux articles:
nous avons appris à communiquer avec l'afficheur matriciel 8x8 LEDs et afficher des motifs.
Maintenant, voyons comment gérer l'affichage des LEDs comme si c'était des pixels sur un écran, certes un écran de dimension très limitée, c'est à dire 8x8 pixels.
Coordonnées des axes X et Y
Nous avons arbitrairement décidé d'organiser les coordonnées de notre matrice LED 8x8 selon ce schéma:
Cette disposition obéit au sens de lecture, à savoir de gauche à droite sur l'axe X, de haut en bas sur l'axe Y.
Si vous souhaitez utiliser une orientation différente des axes X et Y, nous vous laissons le soin d'adapter le programme en langage FORTH à votre convenance. C'est l'occasion d'un excellent exercice pratique.
-8x8g marker -8x8g \ c1 register \ c2 data : max7219.send ( c1 c2 -- ) mSS1 slave.select swap spi.csend spi.csend mSS1 slave.deselect ; : disp.normal ( -- ) $0c $01 max7219.send ; : disp.shutdown ( -- ) $0c $00 max7219.send ; : disp.intensity ( c -- ) $0a swap max7219.send ; : disp.decode ( c -- ) $09 swap max7219.send ; : disp.scan.limit ( c -- ) $0b swap max7219.send ; : disp.set.digit ( cbits cdigit -- ) swap max7219.send ; -square marker-square ram \ buffer for manage content of 8x8 LED display create graphic-array ( --- n ) %00000000 c, %00000000 c, %00000000 c, %00000000 c, %00000000 c, %00000000 c, %00000000 c, %00000000 c, \ clean the display buffer : clean.buffer ( ---) 8 for 0 graphic-array r@ + c! next ; \ display content of buffer : disp.buffer ( ---) 8 for graphic-array r@ + c@ r@ 1+ disp.set.digit next ; \ x and y coordinates start to 0: [0..7] ( +--------> x ) ( | ) ( v y ) \ calculate real adress in graphic-array : pixel.AT ( x y --- mask addr) 1 swap lshift \ y shift first bit to transform in byte mask swap graphic-array + ; \ turn ON one pixel on ccordiante x y : pixel.ON ( x y ---) pixel.AT mset ; \ turn OFF one pixel on ccordinate x y : pixel.OFF ( x y ---) pixel.AT mclr ; -test marker -test : set.square ( n ---) \ n between [1..8] clean.buffer dup for 0 r@ pixel.ON r@ 0 pixel.ON dup 1- r@ pixel.ON r@ over 1- pixel.ON next drop ; : disp.init ( ---) spi.init disp.normal $01 disp.intensity $07 disp.scan.limit $00 disp.decode ; : disp.close ( ---) disp.shutdown spi.close ; : disp ( -- ) \ draw graphic clean.buffer disp.init begin 8 for 7 r@ - 1+ set.square disp.buffer 100 ms next 8 for r@ 1+ set.square disp.buffer 100 ms next key? until ;