From 951e493896fa91ea3188589c3e14bea725754220 Mon Sep 17 00:00:00 2001 From: TheJLifeX <44620382+TheJLifeX@users.noreply.github.com> Date: Mon, 22 Jun 2020 20:03:11 +0200 Subject: [PATCH] Implement display character. --- README.md | 23 +++++++++++++++++ ScrollingText8x8Display.cpp | 41 +++++++++++++++++++----------- ScrollingText8x8Display.h | 1 + docs/images/font-8x8-overview.png | Bin 0 -> 29210 bytes keywords.txt | 1 + 5 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 docs/images/font-8x8-overview.png diff --git a/README.md b/README.md index 2c61a62..31452ab 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,28 @@ ___ void displayText(String text, unsigned long scrollingSpeed); ``` +___ + +### Display a character on a 8x8 LED display. +* @param `index` - The index of the character to be displayed. The value is between 0 (0x00) and 255 (0xFF). You can find the characters corresponding to each index in the section below: +* @param `scrollingSpeed` - optional - The scrolling speed is between 1.0 (lowest speed) and 100.0 (highest speed). 90.0 is the default value. +```c++ + void displayCharacter(int index, unsigned long scrollingSpeed); +``` + +#### 8x8 Characters Overview +![](docs/images/font-8x8-overview.png) + +[image source][5] + +To know the index of a character we combine the column index with the row index. Both column and row index are hexadecimal values. + +For example the heart ❤ (column index: **0x** and row index: **x3**) is at index **0x03**. +```c++ + int heartIndex = 0x03; + render.displayCharacter(heartIndex); // display a scrolling heart ❤. +``` + --- ### ScrollingDirection enumeration @@ -110,3 +132,4 @@ enum CharacterOrientation [2]: https://osoyoo.com/2017/07/15/arduino-lesson-8x8-led-matrix [3]: https://mega.nz/folder/TI1QgAKQ#DpCOElh-b6mnEuqUMAVcqQ/folder/aAlUDCwZ [4]: http://arduino.cc/en/Guide/Libraries +[5]: http://www.gammon.com.au/forum/?id=11516 diff --git a/ScrollingText8x8Display.cpp b/ScrollingText8x8Display.cpp index 5d08ba0..3af42fe 100644 --- a/ScrollingText8x8Display.cpp +++ b/ScrollingText8x8Display.cpp @@ -62,6 +62,23 @@ void ScrollingText8x8Display::setCharacterInBuffer(byte newCharacter[DISPLAY_SIZ * @param scrollingSpeed - The scrolling speed is between 1.0 (lowest speed) and 100.0 (highest speed). 90.0 is the default value. */ void ScrollingText8x8Display::displayText(String text, unsigned long scrollingSpeed) +{ + int textLength = text.length(); + for (int i = 0; i < textLength; i++) + { + int charAsInt = (int)(text.charAt(i)); + + displayCharacter(charAsInt, scrollingSpeed); + } +} + +/** + * Display a character on a 8x8 LED display. + * + * @param index - The index of the character to be displayed. The value is between 0 (0x00) and 255 (0xFF). You can find the characters corresponding to each index here: https://github.com/TheJLifeX/ScrollingText8x8Display#8x8-characters-overview + * @param scrollingSpeed - The scrolling speed is between 1.0 (lowest speed) and 100.0 (highest speed). 90.0 is the default value. + */ +void ScrollingText8x8Display::displayCharacter(int index, unsigned long scrollingSpeed) { float duration = map( scrollingSpeed, @@ -70,24 +87,18 @@ void ScrollingText8x8Display::displayText(String text, unsigned long scrollingSp MAXIMAL_DURATION_FOR_ONE_CHARACTER, minimalDurationForOneCharacter); - int textLength = text.length(); - for (int i = 0; i < textLength; i++) + if (index < 0 || index >= NUMBER_OF_CHARACTERS) { - int charAsInt = (int)(text.charAt(i)); - - if (charAsInt < 0 || charAsInt >= NUMBER_OF_CHARACTERS) - { - charAsInt = UNKNOW_CHARACTER; - } + index = UNKNOW_CHARACTER; + } - byte asciiCharacter[DISPLAY_SIZE]; - for (int k = 0; k < DISPLAY_SIZE; k++) - { - // `pgm_read_byte` function documentation, see: https://www.arduino.cc/reference/en/language/variables/utilities/progmem/ - asciiCharacter[k] = pgm_read_byte(&(font_8x8[charAsInt][k])); - } - displayScrolling_8x8_AsciiCharacter(asciiCharacter, duration); + byte asciiCharacter[DISPLAY_SIZE]; + for (int k = 0; k < DISPLAY_SIZE; k++) + { + // `pgm_read_byte` function documentation, see: https://www.arduino.cc/reference/en/language/variables/utilities/progmem/ + asciiCharacter[k] = pgm_read_byte(&(font_8x8[index][k])); } + displayScrolling_8x8_AsciiCharacter(asciiCharacter, duration); } /** diff --git a/ScrollingText8x8Display.h b/ScrollingText8x8Display.h index c954ac8..5de9847 100644 --- a/ScrollingText8x8Display.h +++ b/ScrollingText8x8Display.h @@ -48,6 +48,7 @@ class ScrollingText8x8Display ScrollingDirection scrollingDirection = RIGHT_TO_LEFT, CharacterOrientation characterOrientation = TOP); void displayText(String text, unsigned long scrollingSpeed = DEFAULT_SCROLLING_SPEED); + void displayCharacter(int index, unsigned long scrollingSpeed = DEFAULT_SCROLLING_SPEED); private: // Time to wait after one frame is displayed. In a frame a single row of LEDs (8 LEDs) are diplayed. diff --git a/docs/images/font-8x8-overview.png b/docs/images/font-8x8-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..8b241f2b8b708fc9a1000da1c12c4ba62afebd95 GIT binary patch literal 29210 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%0DqtHjDw@Y}1I0Z;vmC?^6pE?Q*B%k(OXPFr(6e`R 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 TRow@BxQ}V5Tv4u2v<>?|zD0-v literal 0 HcmV?d00001 diff --git a/keywords.txt b/keywords.txt index 645d8b0..901dce6 100644 --- a/keywords.txt +++ b/keywords.txt @@ -3,6 +3,7 @@ ScrollingText8x8Display KEYWORD1 init KEYWORD2 displayText KEYWORD2 +displayCharacter KEYWORD2 ScrollingDirection KEYWORD3 TOP_TO_BOTTOM LITERAL1