HCMAX7219 Library update – Now you can create a moving dot matrix display!

blog-lib-dmd-1

We’ve now updated our HCMAX7219 led driver library to support serial dot matrix displays such as our dot matrix module shown in the above image. The library supports multiple drivers connected in series and a built-in alphanumeric font to make displaying text and numbers simple. With the new added commands it is easy to make a scrolling message display!

An additional update includes using the hardware SPI interface for faster updates.

You can download the new V0.2 of the library from our support forum here.

Or from Github here

There are 3 new added commands for led matrix displays. See the example sketch below for an example of how to use them:
[cpp]
HCMAX7219.printMatrix("TEXT STRING", Offset)
[/cpp]

Writes a string of text to the output buffer at position starting at Offset. A value of 1 for offset starts the text at column 1 on the display of driver 1, 8 will start the text from column 8 of driver one, 9 will start the text from column 1 of driver 2 etc. Offset numbers beyond the maximum column number can be set to allow for text to be positioned beyond the ends of the display.
[cpp]
HCMAX7219.printMatrix(Value, Offset)
[/cpp]

Writes a positive or negative integer to the display. If negative a ‘-‘ sign will be appended to the beginning of the number. See above of description of Offset.
[cpp]
HCMAX7219.printMatrix(Value, Decimal_Position, Offset)
[/cpp]

Writes a positive or negative integer to the display. If negative a ‘-‘ sign will be appended to the beginning of the number. Decimal_Position allows the option to specify the position of a decimal point.
See above of description of Offset.
[cpp]
HCMAX7219.Invert(Mode);
[/cpp]

Turns inverted text on or off. Mode is of type boolean and can be one of the following pre-defined values:
INVERTOFF
INVERTON

HCOPTO0014 Arduino Diagram

 

 

Example sketch:
[cpp]
/* FILE: HCMODU0082_Serial_Dot_Matrix_Example
DATE: 19/03/15
VERSION: 0.1
AUTHOR: Andrew Davies

REVISIONS:

19/03/15 Created version 0.1

This is an example of how to use the Hobby Components 8×8 serial dot matrix
module (HCOPTO0014). To use this example sketch you will need to download
and install the HCMAX7921 library available from the software section of our
support forum (forum.hobbycomponents.com) or on github:
(https://github.com/HobbyComponents)

The library assumes you are using one module. If you have more than one module
connected together then you will need to change the following line in the
libraries HCMAX7219.h header file to the number of drivers you have connected:

#define NUMBEROFDRIVERS 1 <- Change this number

PINOUT:

MODULE…..UNO/NANO…..MEGA
VCC……..+5V……….+5V
GND……..GND……….GND
DIN……..11………..51
CS (LOAD)..10………..10
CLK……..13………..52

You may copy, alter and reuse this code in any way you like, but please leave
reference to HobbyComponents.com in your comments if you redistribute this code.
This software may not be used directly for the purpose of promoting products that
directly compete with Hobby Components Ltd’s own range of products.

THIS SOFTWARE IS PROVIDED "AS IS". HOBBY COMPONENTS MAKES NO WARRANTIES,
WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ACCURACY OR
LACK OF NEGLIGENCE. HOBBY COMPONENTS SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE
FOR ANY DAMAGES INCLUDING, BUT NOT LIMITED TO, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES FOR ANY REASON WHATSOEVER. */

/* Include the HCMAX7219 and SPI library */
#include <HCMAX7219.h>
#include "SPI.h"

/* Set the LOAD (CS) digital pin number*/
#define LOAD 10

/* Create an instance of the library */
HCMAX7219 HCMAX7219(LOAD);

void setup()
{
}

/* Main program */
void loop()
{
byte Loopcounter;
int Position;

/* Clear the output buffer */
HCMAX7219.Clear();

/* SCROLL SOME TEXT 2 TIMES BEFORE MOVING ON */
for (Loopcounter = 0; Loopcounter <= 2; Loopcounter++)
{
for(Position=0; Position <= 64; Position++)
{
HCMAX7219.printMatrix("HELLO!! ", Position);
HCMAX7219.Refresh();
delay(80);
}
}

/* SCROLL SOME INVERTED TEXT 2 TIMES BEFORE MOVING ON */
HCMAX7219.Invert(INVERTON);
for (Loopcounter = 0; Loopcounter <= 2; Loopcounter++)
{
for(Position=0; Position <= 64; Position++)
{
HCMAX7219.Clear();
HCMAX7219.printMatrix("HELLO!! ", Position);
HCMAX7219.Refresh();
delay(80);
}
}
HCMAX7219.Invert(INVERTOFF);

/* SCROLL AN INTEGER NUMBER */
for(Position=0; Position <= 80; Position++)
{
HCMAX7219.Clear();
HCMAX7219.printMatrix(-12345678, Position);
HCMAX7219.Refresh();
delay(80);
}

/* SCROLL AN INTEGER NUMBER WITH DECIMAL PLACE */
for(Position=0; Position <= 96; Position++)
{
HCMAX7219.Clear();
HCMAX7219.printMatrix(-12345678, 2, Position);
HCMAX7219.Refresh();
delay(80);
}

}
[/cpp]

What you’ll need to make a moving message display:

An Arduino such as this one

One or more serial LED matrix modules

Optional:

Interconnecting cables are supplied with the modules. If you require additional cable to connect from your Arduino to the message display see this item.

62 thoughts on “HCMAX7219 Library update – Now you can create a moving dot matrix display!

  1. thank you for the good description.
    but the connections in the picture HCOPTO0014_Arduino_Diagram.png are not correct:
    the arduino D11 must be connected to the DIN of the first module, the DOUT goes to DIN of the second module,…

    1. I’ve just given it a check but I’m not seeing any problems with. One thing I should point out is that if set NUMBEROFDRIVERS to a lower number than the amount of modules you have connected the extra modules will still do something but they will just mirror first few. If you still have no luck can you give me a little more information about what you mean when you say it doesn’t work, i.e. is changing it having no effect or if it is what exactly is it doing? Also how many modules do you have connected and what are you setting NUMBEROFDRIVERS to ?

  2. hello good I set driver number 8, I wanted to text bearing with 8 dies, it is difficult thanks.

    1. hi, maybe you have to connect an external power supply (7.5V to 10V) to your arduino. if it is only connected to usb, the required current of more than 4 modules is too much…
      i hope this info will help you.

    1. Maddi is correct in that 8 modules may be overloading your Arduino’s 5V supply. Try connecting less modules and reducing the value for NUMBEROFDRIVERS to match.

      In the picture for this post you can see we have 5 modules connected. Try this amount or less. If it works with less then this is the problem and you will need an external power supply to power your 8 modules.

  3. hi,excus me. In the picture for this post using 5 modules or 4 modules?
    because im confused,in the first picture using 5 modules but inthe picture png. using 4 modules,
    maybe you can explain,thanks 🙂

  4. hi,excus me. In the picture for this post using 5 modules or 4 modules?
    because im confused,in the first picture using 5 modules but inthe picture png. using 4 modules,
    maybe you can explain,thanks

    1. You can add as many modules as you like, there is no fixed amount. The only requirement is that you need too change the value of NUMBEROFDRIVERS (see comments in sketches) to match the number of modules you have.

  5. Please help me: how can I build a real time Clock with 4 pcs 8×8 matrix, showing the time for example like this 09 35. (I even have a RTC-module DS3231N)

    1. For the Hardware you just need some serial dot matrix modules and an Arduino. You can then just connect them together as shown in this blog post.

      We have a library that is compatible with the DS3231. There is an example of how to use it in out support forum here:

      http://forum.hobbycomponents.com/viewtopic.php?f=80&t=1946

      I would suggest having a play with this library and sketch to try and understand how it works. Once you figure it out you can do the same with the HCMAX7219 library and example in this blog post. If you can understand the example sketches you can try to combine the two so that you can read the time from the DS3231 and display it on the dot matrix modules.

  6. HCMAX7219.printMatrix(“TEXT STRING”, Offset)

    Can you please elaborate this function??
    I am using 2 drivers and when i give the offset value as 16, the display gets stucked with the 2nd character of the String.
    I also changed the number of drivers in the .h library file.

  7. With two drivers and an offset of 16 you should see the first character displayed on the first driver and the second character on the second driver. Although I may be misunderstanding what you mean by stuck on the second character, if the number of drivers in the .h file was still somehow set to 1 you would see the second character on both displays.

    Are you absolutely sure that you have changed and saved the the value in the .h header file?

    1. yeah I am absolutely sure that i have changed the number from 1 to 2 in the .h file.
      Stuck in the sense, the string of characters, which i place inside the function HCMAX7219.printMatrix(“HELLO!! “, Position);
      Now if i replace the position value with 16(since 2 Drivers = (8 * 2) = 16 Columns. So starting from 16th Column, it should scroll to 1st column of 1st Driver right???

      But when i replace the Position value with 16, i am getting the output as ‘E’ displayed on both driver..

      1. If you replace the position variable with a fixed number then the text will not scroll, it will just stay in a fixed position. In the example sketch in this blog post you will see that the printMaxtric() function is inside a loop where the position variable ticks up by one each time it runs through the loop.

        This still doesn’t explain why you see the same character on both drivers but this is probably a separate issue.

        Does the example sketch work ?

        1. Example sketch works fine but the String is repeated in the same manner. not one character after the other.
          i just want to scroll the name on my matrix driver. it also worked fine once. i just made some logic in it. But now its not working fine.
          Can u guide me how do i scroll my name from one driver to other using 2 drivers??

          i already changed the NUMBEROFDRIVERS as 2 in .h file.

          my query is what value should i change the position to or shouldn’t i change it???

          if not, how to get out of the problem…

          1. With the example sketch you should defiantly see the text scroll across both displays, each character passing from one display to the other. Sorry to be persistent but the NUMBEROFDRIVERS not being set is the only thing I can think of at the moment that would cause exactly what you are reporting. Could you just try uploading this sketch to confirm it is set correctly:

            [cpp]
            #include <HCMAX7219.h>

            void setup()
            {
            Serial.begin(9600);
            }

            void loop()
            {
            Serial.print("Number of drivers: ");
            Serial.println(NUMBEROFDRIVERS);
            while(1);
            }
            [/cpp]

            Once uploaded, open the monitor window in the Arduino IDE (Tools->Serial Monitor). In the monitor window make sure the BAUD rate is set to 9600 and tell me what value it reports for the number of drivers.

  8. You are correct. It is displaying NUMBEROFDRIVERS in my Serial monitor as 1 only.
    But as soon as I open my .h file, when i scroll down to the #define NUMBEROFLINES, I find it already to be 2. I am also saving that file again…

    I really dont understand what is going wrong

    1. Ok that makes sense then. It’s probably one of two things, the file you’re editing is either not being saved to your Arduino library folder, or you have two copies of the library in your Library folder and it’s using the other one.

      Assuming you are using windows go to your Library folder:

      C:\Users\username\Documents\Arduino\libraries\HCMAX7219\

      Open the .h file from there with a text editor and change the NUMBEROFDRIVERS value.

      If that doesn’t work go to the \Arduino\libraries\ folder and check you don’t have any other copies.

      1. I tried to follow what you informed me for, in another arduino ide installed pc. It worked PERFECT. But
        i am facing problem in my PC still. May be its because I have different Arduino IDE versions.

        But am really thankful to you for guiding me on the same. Thanks a lot !! 🙂

        1. No problem. With regards to the issue it’s very likely you have more than one copy of the library. Just do a file search on your computer for the HCMAX7219.h header file and see if it finds more than one copy.

          1. yeah!! you are correct. The Problem is solved now. Once again Thanking you for the right guidance 🙂

  9. Hie. May I know how do I print the Characters which i send serially on my Serial Monitor of arduino on the Drivers??

    I am trying to send a character serially and print it on my serial monitor and same character should be printed on the Driver…

    I tried but it is showing the Decimal equivalent of the Character on my Driver.

    1. If you’re using the Serial.read() function then this returns each received ASCII character as an integer whereas the dot matrix print function expects any text to be passed to it as a null terminated character array. This is untested but should work:

      At the top of your sketch or main loop define this two character array:

      [cpp]char a[2] = {‘0′,’\0’};[/cpp]

      The first character of this array will hold the value received by the Serial.Read() function, the second character is a null termination which signifies that this is the end of the string of text.

      To display the text received from the Serial.print() function do this:

      [cpp]a[0] = ReceivedCharacter;
      HCMAX7219.printMatrix(a, 8);[/cpp]

      Where ReceivedCharacter is the integer variable that holds the character received by the Serial.print function. remember that the Serial.print function can return a ‘-1’ if no characters are received so you should test for this before passing it to the HCMAX7219.printMatrix() function.

        1. It shouldn’t be able to do that as it can only pass one character (digit) at a time and the decimal equivalent will be at least two digits. Something else must be going on. Either your passing the received value and not the array ‘a’ to the HCMAX7219.printMatrix() function or you are receiving something else. In the monitor window do you have the same Baud rate set as in your sketch and have you disabled the New Line & Cartridge Return (NL+CR) ?

  10. Hello,
    a function is expected in the future to
    display sprites and manage them through “progmem”?

    1. Ok we’ll keep your suggestion in mind when the library is next updated. There are however a couple of existing ways you can do this:

      You can simply write directly to the libraries display buffer. For the following example it will draw an outlined box to the first display:

      [cpp] HCMAX7219.DisplayBuffer[0] = 0xff;
      HCMAX7219.DisplayBuffer[1] = 0x81;
      HCMAX7219.DisplayBuffer[2] = 0x81;
      HCMAX7219.DisplayBuffer[3] = 0x81;
      HCMAX7219.DisplayBuffer[4] = 0x81;
      HCMAX7219.DisplayBuffer[5] = 0x81;
      HCMAX7219.DisplayBuffer[6] = 0x81;
      HCMAX7219.DisplayBuffer[7] = 0xff;
      HCMAX7219.Refresh();[/cpp]

      Each index of the array writes to one column on the display. To write to the second display just use array indexes of 8 to 15 instead of 0 to 7. Be careful not to index outside of the array though. Its maximum index will be (NUMBEROFDRIVERS * 8) – 1.

      Alternatively you could modify one of the less useful characters in the font that you don’t need.

      1. [cpp]/* Include the HCMAX7219 and SPI library */
        #include
        #include
        #include "SPI.h"

        /* Set the LOAD (CS) digital pin number*/
        #define LOAD 10

        /* Create an instance of the library */
        HCMAX7219 HCMAX7219(LOAD);
        byte buffer[10];
        const byte smile_bmp[] PROGMEM = {
        B00111100,
        B01000010,
        B10100101,
        B10000001,
        B10100101,
        B10011001,
        B01000010,
        B00111100 };

        void setup() {
        for (int k=0; NUMBEROFDRIVERS; k++) {
        HCMAX7219.Shutdown(MAX7219ON,k);
        HCMAX7219.Intensity(4,k);
        HCMAX7219.Clear();
        }
        }

        /* Main program */
        void loop() {
        HCMAX7219.Clear();
        BitMAP(smile_bmp);
        HCMAX7219.Refresh();
        delay(2000);
        }

        //Disegna lo sprite
        void BitMAP(const byte *sprite) {
        for (int k=0;8;k++) {
        buffer[k] = pgm_read_byte_near(sprite + k);
        HCMAX7219.DisplayBuffer[k]=buffer[k];
        HCMAX7219.Refresh();
        }
        }[/cpp]

  11. Actually I am reading the character through Serial.read() function and loading that character inside a ReceivedCharacter variable of integer type. Then i am printing that character whatever i type on my keyboard to my serial monitor through Serial.print(RecievedCharacter); statement.
    Then.. i am doing the same as in you told me….
    a[0] = ReceivedCharacter;
    HCMAX7219.printMatrix(a, 8);

    by these two lines..

    Can u tell me clearly where am i going wrong???

    1. Can you post your code from receiving the character via the Serial.read() function to outputting it via the HCMAX7219.printMatrix() function.

      Edit:

      Can you also confirm that in your serial monitor window you don’t have New Line and/or Cartridge Return set? If either or both are set it will send extra characters.

      1. [cpp]while(!Serial.available());
        {
        int ReceivedCharacter = Serial.read();
        Serial.print(ReceivedCharacter);
        a[0] = ReceivedCharacter;
        HCMAX7219.printMatrix(a[0], 8);
        }[/cpp]

        and in the serial monitor, what i have selected is no line ending

        1. Your indexing the array inside the HCMAX7219.printMatrix() function. You need to pass the array itself, not one element of it. Change this line:

          [cpp]HCMAX7219.printMatrix(a[0], 8);[/cpp]

          To:

          [cpp]HCMAX7219.printMatrix(a, 8);[/cpp]

          1. yup!!! That worked !!! But on my Serial monitor its still showing me the decimal equivalents of the character what i send serially.

            Now may I know how can i scroll that character on my drivers???

            what i am doing for this is as follows but am not getting the scrolling effect on my drivers :

            int ReceivedCharacter;

            char a[2] = {‘0′,’/n’};

            void setup()
            {
            Serial.begin(9600);
            delay(100);
            }

            /* Main program */
            void loop()
            {

            int Position;

            while(!Serial.available());
            {
            int ReceivedCharacter = Serial.read();
            Serial.print(ReceivedCharacter);
            a[0] = ReceivedCharacter;

            /* Clear the output buffer */
            HCMAX7219.Clear();

            for( Position=0; Position <= 20; Position++)
            {
            HCMAX7219.printMatrix(a, 8);
            HCMAX7219.Refresh();
            delay(80);
            }

            }

  12. and for any long message to display on my drivers, should i define a buffer array to store the message in that array and print that array itself like i am printing a single character???

    1. Yes that is correct. Just remember to make it a character array (char) and that you need to make the array (dimension it) one character longer than the text you need to hold and make sure that last value is a null character. I would recommend googling how arrays work in c++ and how strings can be stored within them. It will give you a much better understanding of what is going on. Here are a good couple of examples:

      http://www.cplusplus.com/doc/tutorial/arrays/
      http://www.cplusplus.com/doc/tutorial/ntcs/

  13. [cpp]/* FILE: MODULO7219_RTC_Clock
    DATE: 03/04/2016
    VERSION: 1.0
    AUTOR: Michieli Fabrizio

    REVISIONS:

    03/04/2016 Created version 1.0 IT

    you can translate English!!!

    The library assumes you are using one module. If you have more than one module
    connected together then you will need to change the following line in the
    libraries HCMAX7219.h header file to the number of drivers you have connected:

    #define NUMBEROFDRIVERS 4 &lt;- Change this number…..USE 4 MODULES

    PINOUT:

    MODULE…..UNO/NANO…..MEGA
    VCC……..+5V……….+5V
    GND……..GND……….GND
    DIN……..11………..51
    CS (LOAD)..10………..10
    CLK……..13………..52
    */

    #include //Include the HCMAX7219 library
    #include "SPI.h" //Include the SPI library
    #include //Include the Wire library for the RTClib…
    #include "RTClib.h" //Include the RTCLib library (standard library for DS1307 RTC clock chip)

    //Set the LOAD (CS) digital pin number
    #define LOAD 10

    HCMAX7219 HCMAX7219(LOAD); //Create an instance of the library
    RTC_DS1307 rtc; //Create an instance of the library

    byte Loopcounter;
    int Position;
    int deci , unit = 0; //Extract tens and unit….

    void setup() {
    for (int k=0; NUMBEROFDRIVERS; k++) {
    HCMAX7219.Shutdown(MAX7219ON,k);
    HCMAX7219.Intensity(4,k);
    HCMAX7219.Clear();
    }

    if (!rtc.begin()) {
    for(Position=0; Position = 80; Position++) {
    HCMAX7219.printMatrix(RTC ERROR, Position);
    HCMAX7219.Refresh();
    delay(80);
    }
    while (1);
    }

    if (!rtc.isrunning()) {
    for(Position=0; Position = 80; Position++) {
    HCMAX7219.printMatrix(RTC ERROR, Position);
    HCMAX7219.Refresh();
    delay(80);
    }
    // following line sets the RTC to the date time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    }
    }

    void loop() {
    //display the clock for four time
    for(Loopcounter = 0; Loopcounter = 3; Loopcounter++) {
    DateTime now = rtc.now();
    for(Position = 0; Position = 75; Position++) {
    HCMAX7219.Clear();
    HCMAX7219.printMatrix(now.hour(),Position);
    HCMAX7219.printMatrix(: ,Position-16); //……a trick to scroll multiple lines
    deci = now.minute() / 10;
    unit = now.minute() % 10;
    if (deci == 0) {
    HCMAX7219.printMatrix(0,Position-24);
    HCMAX7219.printMatrix(unit,Position-32);
    } else {
    HCMAX7219.printMatrix(now.minute(),Position-24);
    }
    HCMAX7219.Refresh();
    delay(80);
    }
    }
    for (Position=0; Position ;= 200; Position++) {
    DateTime now = rtc.now();
    HCMAX7219.Clear();
    switch (now.dayOfTheWeek()) {
    case 0:
    HCMAX7219.printMatrix(Dom,Position-45); //Sun
    break;
    case 1:
    HCMAX7219.printMatrix(Lun,Position-45); //Mon
    break;
    case 2:
    HCMAX7219.printMatrix(Mar,Position-45); //Tue
    break;
    case 3:
    HCMAX7219.printMatrix(Mer,Position-45); //Wed
    break;
    case 4:
    HCMAX7219.printMatrix(Gio,Position-45); //Thu
    break;
    case 5:
    HCMAX7219.printMatrix(Ven,Position-45); //Fri
    break;
    case 6:
    HCMAX7219.printMatrix(Sab,Position-45); //Sat
    break;
    }
    HCMAX7219.printMatrix(now.day(),Position-75);
    switch (now.month()) {
    case 1:
    HCMAX7219.printMatrix(Gen ,Position-90); //Jan
    break;
    case 2:
    HCMAX7219.printMatrix(Feb ,Position-90); //Feb
    break;
    case 3:
    HCMAX7219.printMatrix(Mar ,Position-90); //Mar
    break;
    case 4:
    HCMAX7219.printMatrix(Apr ,Position-90); //Apr
    break;
    case 5:
    HCMAX7219.printMatrix(Mag ,Position-90); //May
    break;
    case 6:
    HCMAX7219.printMatrix(Giu ,Position-90); //Jun
    break;
    case 7:
    HCMAX7219.printMatrix(Lug ,Position-90); //Jul
    break;
    case 8:
    HCMAX7219.printMatrix(Ago ,Position-90); //Aug
    break;
    case 9:
    HCMAX7219.printMatrix(Set ,Position-90); //Sep
    break;
    case 10:
    HCMAX7219.printMatrix(Ott ,Position-90); //Oct
    break;
    case 11:
    HCMAX7219.printMatrix(Nov ,Position-90); //Nov
    break;
    case 12:
    HCMAX7219.printMatrix(Dic ,Position-90); //Dec
    break;
    }
    HCMAX7219.printMatrix(now.year() ,Position-120);
    HCMAX7219.Refresh();
    delay(80);
    }
    }[/cpp]

  14. Hello Andrew;
    Thank you for this library, it’s very useful,
    I am using the Arduino UNO,(Atmel368p)
    But its memory is not enough, when I use “hcmax7219.printmatrix”
    Memory is not enough to give the error,
    Because there are a lot of libraries and approximately 900 lines code
    I had to use the Arduino UNO.

    1. I just want to use these characters. (A, D, E, F, N, R, S, T, U, 0,1,2,3,4,5,6,7,8,9,.,-)
    2. How can I change the font, (thinner)
    thank you.

    Sorry my English

    1. The fonts can be found in the HCMAX7219.h header file. There are two of them, one for the seven segment displays and one for dot matrix displays. The fonts are stored in two character arrays called SevenSegChar[] and Font8x8[][8] respectively. Each row of data in the arrays represent a single character. The SevenSegChar[] array is labeled so you can see which line represents which character. The SevenSegChar[] array isn’t labeled but the order should be the same. You can simply delete the lines for characters you don’t need. The only problem is that the remaining characters no longer be mapped correctly to your text. I.e. printing a space will display probably display a 0 after you have modified the arrays.

      What memory are you running out of btw,? Program storage or dynamic memory? It should tell you which in the bottom of the Arduno IDE when you compile your sketch.

  15. Hello Andrew;
    SRAM insufficient,
    I solved,
    I deleted the space characters lines,
    I made a new characters recognition with Pixel font editor.
    Because the characters were printed at 90 degrees and bold.
    Fix both, the characters and memory usage
    Thank you

    Thank you.

  16. I occasionally read your latest projects – as with amateur radio, professionals aren’t the only ones with ideas.

    Although I am more of a hardware man and author articles, I must congratulate you on your prompt replies, depth of knowledge and patience, You also appear to have an educated readership.

    So many project columns turn into requests for personal design requests.

    Great work!

Leave a Reply

Your email address will not be published. Required fields are marked *