• Navigation überspringen
  • Zur Navigation
  • Zum Seitenende
Organisationsmenü öffnen Organisationsmenü schließen
Friedrich-Alexander-Universität Lehrstuhl für Informatik 4 (Systemsoftware)
  • FAUZur zentralen FAU Website
  1. Friedrich-Alexander-Universität
  2. Technische Fakultät
  3. Department Informatik
Suche öffnen
  • English
  • Campo
  • StudOn
  • FAUdir
  • Stellenangebote
  • Lageplan
  • Hilfe im Notfall
  1. Friedrich-Alexander-Universität
  2. Technische Fakultät
  3. Department Informatik
Friedrich-Alexander-Universität Lehrstuhl für Informatik 4 (Systemsoftware)
Menu Menu schließen
  • Lehrstuhl
    • Team
    • Aktuelles
    • Kontakt und Anfahrt
    • Leitbild
    • 50-jähriges Jubiläum
    Portal Lehrstuhl
  • Forschung
    • Forschungsbereiche
      • Betriebssysteme
      • Confidential Computing
      • Embedded Systems Software
      • Verteilte Systeme
    • Projekte
      • AIMBOS
      • BALu
      • BFT2Chain
      • DOSS
      • Mirador
      • NEON
      • PAVE
      • ResPECT
      • Watwa
    • Projektkampagnen
      • maRE
    • Seminar
      • Systemsoftware
    Portal Forschung
  • Publikationen
  • Lehre
    • Sommersemester 2025
      • Applied Software Architecture
      • Ausgewählte Kapitel der Systemsoftware
      • Betriebssystemtechnik
      • Projekt angewandte Systemsoftwaretechnik
      • System-Level Programming
      • Systemnahe Programmierung in C
      • Systemprogrammierung 1
      • Verteilte Systeme
    • Wintersemester 2024/25
      • Betriebssysteme
      • Middleware – Cloud Computing
      • Systemprogrammierung 2
      • Verlässliche Echtzeitsysteme
      • Virtuelle Maschinen
      • Web-basierte Systeme
    Portal Lehre
  • Examensarbeiten
  1. Startseite
  2. Extern

Extern

Bereichsnavigation: Lehre
  • System-Level Programming
    • Lecture
      • Exercises
        • Slides
        • Assignments
        • libspicboard-doc
          • Linux libc-doc
          • Exam
            • Intern
              • Contact

            libspicboard-doc

            • libspicboard
            display.h
            Go to the documentation of this file.
            1 #ifndef _DISPLAY_H
            2 #define _DISPLAY_H
            3 
            4 #include <stdint.h>
            5 #ifdef _AVR_LIBC_VERSION__
            6 #include <avr/pgmspace.h>
            7 #endif
            8 #include "check.h"
            9 
            10 /**
            11  * \addtogroup Display OLED Display
            12  *
            13  * \brief Controls the optional 128×64 pixel monochrome OLED display
            14  *
            15  * The SPiCboard v3 has a TWI (two wire interface, also known as I²C),
            16  * which can be used to connect an OLED display.
            17  * Especially the SSD1306 monochrome OLED display fits perfectly onto the board.
            18  * It has a 0.96 inch diameter with 128 horizontal and 64 vertical pixels.
            19  *
            20  * For the sake of simplicity the horizontal pixels are termed <i>columns</i>.
            21  * The vertical pixels are divided into 8 so-called <i>pages</i>, therefore
            22  * a byte can represent the contents of a <i>page segment</i> (with 8 pixels - from
            23  * the <a href="https://en.wikipedia.org/wiki/Least_significant_bit">LSB</a> on
            24  * top to the <a href="https://en.wikipedia.org/wiki/Most_significant_bit">MSB</a>
            25  * on bottom of each page segement).
            26  *
            27  * \image html display_addr.png
            28  *
            29  * For additional details please have a look into the <a href="SSD1306.pdf">SSD1306 Datasheet</a>.
            30  *
            31  * In case your run into memory issues (which is quite easy with only 2 KB SRAM)
            32  * you might want to have a look into the \ref DisplayFromFlash "FromFlash" function variants.
            33  *
            34  * \warning The display is quite sensitive to fluctuation of current.
            35  * Try to avoid contact of any [semi-]conductive material (including your fingers) with the pins
            36  * on the Xplained Mini Board -- especially connecting PC3 with PC4 -- or the connection to your display
            37  * might stop (it stalls until you restart it, the LED on the Xplained Mini Board can indicate the error).
            38  *
            39  * @{
            40  * \file display.h
            41  * \version \$Rev: $
            42  */
            43 
            44 /**
            45  * \brief Activate (and setup) the OLED-display
            46  *
            47  * \retval 0 success
            48  * \retval -1 initialization of I²C failed
            49  * \retval -2 setting I²C device address failed
            50  * \retval -3 writing to I²C device failed
            51  * \retval -4 timeout during I²C communication
            52  * \retval -5 out of bounds (addressing nonexistent page/column)
            53  */
            54 int8_t sb_display_enable();
            55 
            56 /**
            57  * \brief Check if a functional OLED display is present
            58  *
            59  * Tries to connect to the SSD1306 display (I²C device address <tt>0x78</tt>)
            60  * without enabling it.
            61  *
            62  * \retval 0 display is available and seems to work
            63  * \retval <0 display not available or not functional
            64  */
            65 int8_t sb_display_available();
            66 
            67 /**
            68  * \brief Turn the OLED display off
            69  *
            70  * \retval 0 success
            71  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            72  */
            73 int8_t sb_display_disable();
            74 
            75 /**
            76  * \brief Draw a single page segment onto the OLED display
            77  *
            78  * \param pageNum page number (0-7) for vertical positioning the output
            79  * \param colNum column number (0-127) for the horizontal position of the output
            80  * \param content contents to be drawn on the page segment (LSB on top and MSB on bottom)
            81  *
            82  * \retval 0 success
            83  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            84  */
            85 int8_t sb_display_draw(uint8_t pageNum, uint8_t colNum, uint8_t content);
            86 
            87 /**
            88  * \brief Draw a (rectangular) bitmap onto the OLED display
            89  *
            90  * The result is similar to multiple calls of sb_display_draw()
            91  * (although the execution of this function is way faster):
            92  * \code {.c}
            93  * for (uint8_t page = 0; page < pageCount; page++){
            94  * for (uint8_t col = 0; col < colCount; col++){
            95  * sb_display_draw(pageStart + page, colStart + col, contents[page * colCount + col]);
            96  * }
            97  * }
            98  * \endcode
            99  *
            100  * \b Example:
            101  *
            102  * We want to draw a square with a point in its center with some spacing
            103  * to the to the left top corner of the screen.
            104  *
            105  * The bitmap will be drawn across two pages, each with eight page segments.
            106  * \image html display_square.png
            107  *
            108  * Hence we first initialize an array with 2*8 elements (columns 5-12 for
            109  * page 0 and 1) containing the contents of each page segement (1 for a white
            110  * pixel and 0 for a black/clear one) and then transfer them to the screen.
            111  * \include display_square.c
            112  *
            113  * \param pageStart first page to set the top vertical position
            114  * \param colStart first column to set the left horizontal position
            115  * \param pageCount number of pages to set the bottom position
            116  * (including the first page)
            117  * \param colCount number of columns to define the right border
            118  * (including the first column)
            119  * \param contents array pointing to the bitmap (must have
            120  * <tt>pageCount * colCount</tt> elements) - or \c NULL
            121  * to clear the area
            122  *
            123  * \retval 0 success
            124  * \retval <0 on I²C error (see sb_display_enable() return codes)
            125  */
            126 int8_t sb_display_drawBitmap(uint8_t pageStart, uint8_t colStart, uint8_t pageCount, uint8_t colCount, const uint8_t * contents);
            127 
            128 /**
            129  * \brief Draw the contents of a \c 8*128 item 8-bit array (8 pages with
            130  * 128 columns, each filled with 8 bit) onto the OLED Display
            131  *
            132  * The function call is identical to
            133  * \code {.c}
            134  * sb_display_drawBitmap(0, 0, 8, 128, contents);
            135  * \endcode
            136  *
            137  * In case the pointer is \c NULL, the entire screen will be cleared.
            138  *
            139  * \warning Make sure that the buffer points to an array with 1024 items -
            140  * this is C, there is no range check!
            141  *
            142  * \param contents pointer to a <tt>8*128</tt> item array - or NULL
            143  * to clear the screen
            144  *
            145  * \retval 0 success
            146  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            147  */
            148 int8_t sb_display_fillScreen(const uint8_t *contents);
            149 
            150 /**
            151  * \brief Print a \c \0 terminated text string on the OLED display
            152  * using a 8×8 pixel font
            153  *
            154  * A single character will fit into one page (= eight rows) and eight columns.
            155  * Therefore it is possible to print 16 characters at maximum.
            156  *
            157  * If the length of the string exceeds the available columns
            158  * (= columns right of the start column) in the current page,
            159  * the output will \b not be continued on the next line!
            160  *
            161  * The font was extract from the
            162  * <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/fonts">Linux kernel</a>
            163  * and is based on <a href="https://en.wikipedia.org/wiki/Code_page_437">code page 437</a>
            164  * (= <a href="https://en.wikipedia.org/wiki/Extended_ASCII">extended ASCII</a>,
            165  * every possible character has a graphical string representation).
            166  *
            167  * Consequently, the ASCII control characters (like line break) are
            168  * displayed with special symbols but don't have any functional impact.
            169  *
            170  * The \ref fonts "Fonts Table" contains a detailed list of the available characters
            171  *
            172  * \warning The font will be stored on the flash which will consume about 2300 bytes.
            173  *
            174  * \param pageNum page number (0-7) for vertical positioning the output
            175  * \param colStart first column to set the horizontal position of the output
            176  * \param str 0-terminated string
            177  *
            178  * \retval >=0 length of printed string (can be less than strlen(str) )
            179  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            180  */
            181 int8_t sb_display_showString(uint8_t pageNum, uint8_t colStart, const char *str);
            182 
            183 /**
            184  * \brief Print a \c \0 terminated text string with a (slightly) wider
            185  * 8×8 pixel font onto the OLED display
            186  *
            187  * The character set is almost identical to the sb_display_showString() function
            188  * and the space requirement is the same (up to 16 characters per line)
            189  *
            190  * The \ref fonts "Fonts Table" contains a detailed list of the
            191  * available characters.
            192  *
            193  * \warning This font will consume about 2300 bytes, too.
            194  *
            195  * \param pageNum page number (0-7) for vertical positioning the output
            196  * \param colStart first column to set the horizontal position of the output
            197  * \param str 0-terminated string
            198  *
            199  * \retval >=0 length of printed string (can be less than strlen(str) )
            200  * \retval <0 on I²C error (see sb_display_enable() return codes)
            201  */
            202 int8_t sb_display_showStringWide(uint8_t pageNum, uint8_t colStart, const char *str);
            203 
            204 /**
            205  * \brief Print a \0 terminated text string on the OLED display using
            206  * a small 6×4 pixel font
            207  *
            208  * A single character will fit into one page (eight rows, even though it is
            209  * just six pixels) and four columns, therefore it is possible to print 32
            210  * characters at maximum.
            211  *
            212  * If the length of the string exceeds the available columns
            213  * (= columns right of the start column) in the current page,
            214  * the output will not be continued on the next line!
            215  *
            216  * The \ref fonts "Fonts Table" contains a detailed list of the
            217  * available characters
            218  *
            219  * \warning In contrast to the other \c showString functions the character set
            220  * is quite limited - it only supports printable ASCII characters (neither
            221  * control characters nor the extended ASCII set).
            222  * Hence, the required flash memory consumption is (with about 700 bytes) less
            223  * than a third of the space requirements of the other fonts.
            224  *
            225  * \param pageNum page number (0-7) for vertical positioning the output
            226  * \param colStart first column to set the horizontal position of the output
            227  * \param str 0-terminated string
            228  *
            229  * \retval >=0 length of printed string (can be less than strlen(str) )
            230  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            231  */
            232 int8_t sb_display_showStringSmall(uint8_t pageNum, uint8_t colStart, const char * str);
            233 
            234 /** @}*/
            235 
            236 /**
            237  * \addtogroup DisplayFromFlash Display contents from Flash memory
            238  *
            239  * \brief Display functions enabling flash memory contents
            240  *
            241  * For microcontroller-based software development, memory usage is a crucial part.
            242  * The SRAM on the Atmega 328PB (the processor of the Xplained Mini / SPiCboard v3)
            243  * is extremly tight compared to PCs -- its 2 KB are the limiting factor for
            244  * using the 128×64 pixel monochrome OLED display:
            245  * Just the contents of a single screen (128×64 bits) would consume half of
            246  * the available SRAM!
            247  *
            248  * But since most data is constant, this can be stored and read from the flash
            249  * program memory (with 32 KB on this microprocessor it is sixteen times the SRAM).
            250  *
            251  * Due to the different address space, it is not possible to access the data in flash
            252  * in the same way you access SRAM contents -- a special instruction is required to
            253  * read from this memory: the \c ldm instruction (instead of \c ld).
            254  *
            255  * This will be done automatically by the compiler when using the
            256  * <a href="https://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Named-Address-Spaces.html">Named-Address-Space</a>
            257  * keyword \c __flash in the variable declaration.
            258  *
            259  * In case you have quite an old compiler not supporting this feature,
            260  * you have to use the <a href="http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html">Program Space Utilities</a>
            261  * from the <a href="http://www.nongnu.org/avr-libc/">AVR LibC</a>
            262  * and not only tag the variables with the \c PROGMEM keywords but although use the \c pgm_read_byte function to access them.
            263  *
            264  * The following functions use the same parameters (besides the \c flash keyword)
            265  * as their counter parts and their function name is appended by \c FromFlash
            266  *
            267  * @{
            268  * \file display.h
            269  * \version \$Rev: $
            270  */
            271 
            272  /**
            273  * \brief Draw a bitmap from the flash memory onto the OLED display
            274  *
            275  * Almost the same function as sb_display_drawBitmap(), but the contents are
            276  * read from the flash (program memory) - so no SRAM is wasted.
            277  *
            278  * \see sb_display_drawBitmap
            279  *
            280  * \param pageStart first page to set the top vertical position
            281  * \param colStart first column to set the left horizontal position
            282  * \param pageCount number of pages to set the bottom position
            283  * \param colCount number of columns to define the right border
            284  * \param contents array (<tt>pageCount * colCount</tt> elements) pointing to a bitmap
            285  * stored in the flash memory (using either
            286  * <a href="https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Named-Address-Spaces.html">__flash</a>
            287  * namespace or <a href="http://www.nongnu.org/avr-libc/user-manual/pgmspace.html">PROGMEM</a> macro)
            288  *
            289  * \retval 0 success
            290  * \retval <0 on I²C error (see sb_display_enable() return codes)
            291  */
            292 #ifdef __FLASH
            293 int8_t sb_display_drawBitmapFromFlash(uint8_t pageStart, uint8_t colStart, uint8_t pageCount, uint8_t colCount, const __flash uint8_t *contents);
            294 #else
            295 int8_t sb_display_drawBitmapFromFlash(uint8_t pageStart, uint8_t colStart, uint8_t pageCount, uint8_t colCount, const uint8_t * PROGMEM contents);
            296 #endif
            297 
            298 /**
            299  * \brief Draw the contents of the flash to the entire OLED display screen
            300  *
            301  * Almost same function as sb_display_fillScreen(), but the contents are
            302  * read from the flash (program memory) - so no SRAM is wasted.
            303  *
            304  * The function call is identical to
            305  * \code {.c}
            306  * sb_display_drawBitmapFromFlash(0, 0, 8, 128, contents);
            307  * \endcode
            308  *
            309  * \param contents pointer to a \c 8*128 item array in flash memory (using either
            310  * <a href="https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Named-Address-Spaces.html">__flash</a>
            311  * namespace or <a href="http://www.nongnu.org/avr-libc/user-manual/pgmspace.html">PROGMEM</a> macro)
            312  *
            313  * \retval 0 success
            314  * \retval <0 on I²C error (see sb_display_enable() return codes)
            315  */
            316 #ifdef __FLASH
            317 int8_t sb_display_fillScreenFromFlash(const __flash uint8_t *contents);
            318 #else
            319 int8_t sb_display_fillScreenFromFlash(const uint8_t * PROGMEM contents);
            320 #endif
            321 
            322 /**
            323  * \brief Print a \c \0 terminated text string from flash
            324  * on the OLED display using a 8×8 pixel font
            325  *
            326  * Almost same function as sb_display_showString(), but the string is
            327  * read from the flash (program memory) - so no SRAM is wasted.
            328  *
            329  * The \ref fonts "Fonts Table" contains a detailed list of the available characters
            330  *
            331  * It is possible to define an inline flash string using the \c PSTR macro from the
            332  * <a href="http://www.nongnu.org/avr-libc/user-manual/pgmspace.html">Program Space Utilities</a>:
            333  * \code {.c}
            334  * static const __flash str[] = "Ipsum";
            335  * sb_display_showString(0, 0, "Lorem");
            336  * sb_display_showStringFromFlash(1, 0, str);
            337  * sb_display_showStringFromFlash(2, 0, PSTR("dolor"));
            338  * \endcode
            339  * This will display \a Lorem , \a Ipsum and \a dolor on the subsequent lines,
            340  * but only the first string will consume SRAM during runtime.
            341  * The second and third call are different ways for reading from flash memory.
            342  *
            343  * \warning The font will be stored on the flash which will consume about 2300 bytes
            344  * (but there is no additional overhead in case you are already
            345  * using the sb_display_showString() ).
            346  *
            347  * \param pageNum page number (0-7) for vertical positioning the output
            348  * \param colStart first column to set the horizontal position of the output
            349  * \param str 0-terminated string in flash memory
            350  *
            351  * \retval >=0 length of printed string (can be less than strlen(str) )
            352  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            353  */
            354 #ifdef __FLASH
            355 int8_t sb_display_showStringFromFlash(uint8_t pageNum, uint8_t colStart, const __flash char *str);
            356 #else
            357 int8_t sb_display_showStringFromFlash(uint8_t pageNum, uint8_t colStart, const char * PROGMEM str);
            358 #endif
            359 
            360 /**
            361  * \brief Print a \c \0 terminated text string from flash
            362  * with a (slightly) wider 8×8 pixel font onto the OLED display
            363  *
            364  * Almost same function as sb_display_showStringWide(), but the string is
            365  * read from the flash (program memory) - so no SRAM is wasted.
            366  *
            367  * The \ref fonts "Fonts Table" contains a detailed list of the
            368  * available characters.
            369  *
            370  * \warning This font will consume about 2300 bytes, too (but no additional
            371  * overhead for using sb_display_showStringWide() ).
            372  *
            373  * \param pageNum page number (0-7) for vertical positioning the output
            374  * \param colStart first column to set the horizontal position of the output
            375  * \param str 0-terminated string in flash memory
            376  *
            377  * \retval >=0 length of printed string (can be less than strlen(str) )
            378  * \retval <0 on I²C error (see sb_display_enable() return codes)
            379  */
            380 #ifdef __FLASH
            381 int8_t sb_display_showStringWideFromFlash(uint8_t pageNum, uint8_t colStart, const __flash char *str);
            382 #else
            383 int8_t sb_display_showStringWideFromFlash(uint8_t pageNum, uint8_t colStart, const char * PROGMEM str);
            384 #endif
            385 
            386 /**
            387  * \brief Print a \0 terminated text string from flash
            388  * on the OLED display using a small 6×4 pixel font
            389  *
            390  * Almost same function as sb_display_showStringSmall(), but the string is
            391  * read from the flash (program memory) - so no SRAM is wasted.
            392  *
            393  * The \ref fonts "Fonts Table" contains a detailed list of the
            394  * available characters
            395  *
            396  * \warning This font will consume about 700 bytes (but no additional
            397  * overhead for using sb_display_showStringSmall() ).
            398  *
            399  * \param pageNum page number (0-7) for vertical positioning the output
            400  * \param colStart first column to set the horizontal position of the output
            401  * \param str 0-terminated string from flash
            402  *
            403  * \retval >=0 length of printed string (can be less than strlen(str) )
            404  * \retval <0 on I²C error (\see sb_display_enable() return codes)
            405  */
            406 #ifdef __FLASH
            407 int8_t sb_display_showStringSmallFromFlash(uint8_t pageNum, uint8_t colStart, const __flash char *str);
            408 #else
            409 int8_t sb_display_showStringSmallFromFlash(uint8_t pageNum, uint8_t colStart, const char * PROGMEM str);
            410 #endif
            411 
            412 /** @}*/
            413 
            414 #endif
            415 
            check.h
            sb_display_drawBitmapFromFlash
            int8_t sb_display_drawBitmapFromFlash(uint8_t pageStart, uint8_t colStart, uint8_t pageCount, uint8_t colCount, const __flash uint8_t *contents)
            Draw a bitmap from the flash memory onto the OLED display.
            sb_display_fillScreenFromFlash
            int8_t sb_display_fillScreenFromFlash(const __flash uint8_t *contents)
            Draw the contents of the flash to the entire OLED display screen.
            sb_display_showStringWideFromFlash
            int8_t sb_display_showStringWideFromFlash(uint8_t pageNum, uint8_t colStart, const __flash char *str)
            Print a \0 terminated text string from flash with a (slightly) wider 8×8 pixel font onto the OLED dis...
            sb_display_showStringFromFlash
            int8_t sb_display_showStringFromFlash(uint8_t pageNum, uint8_t colStart, const __flash char *str)
            Print a \0 terminated text string from flash on the OLED display using a 8×8 pixel font.
            sb_display_showStringSmallFromFlash
            int8_t sb_display_showStringSmallFromFlash(uint8_t pageNum, uint8_t colStart, const __flash char *str)
            Print a \0 terminated text string from flash on the OLED display using a small 6×4 pixel font.
            sb_display_showStringSmall
            int8_t sb_display_showStringSmall(uint8_t pageNum, uint8_t colStart, const char *str)
            Print a \0 terminated text string on the OLED display using a small 6×4 pixel font.
            sb_display_fillScreen
            int8_t sb_display_fillScreen(const uint8_t *contents)
            Draw the contents of a 8*128 item 8-bit array (8 pages with 128 columns, each filled with 8 bit) onto...
            sb_display_available
            int8_t sb_display_available()
            Check if a functional OLED display is present.
            sb_display_enable
            int8_t sb_display_enable()
            Activate (and setup) the OLED-display.
            sb_display_drawBitmap
            int8_t sb_display_drawBitmap(uint8_t pageStart, uint8_t colStart, uint8_t pageCount, uint8_t colCount, const uint8_t *contents)
            Draw a (rectangular) bitmap onto the OLED display.
            sb_display_disable
            int8_t sb_display_disable()
            Turn the OLED display off.
            sb_display_showStringWide
            int8_t sb_display_showStringWide(uint8_t pageNum, uint8_t colStart, const char *str)
            Print a \0 terminated text string with a (slightly) wider 8×8 pixel font onto the OLED display.
            sb_display_showString
            int8_t sb_display_showString(uint8_t pageNum, uint8_t colStart, const char *str)
            Print a \0 terminated text string on the OLED display using a 8×8 pixel font.
            sb_display_draw
            int8_t sb_display_draw(uint8_t pageNum, uint8_t colNum, uint8_t content)
            Draw a single page segment onto the OLED display.
            Friedrich-Alexander-Universität
            Erlangen-Nürnberg

            Schlossplatz 4
            91054 Erlangen
            • Impressum
            • Datenschutz
            • Barrierefreiheit
            • Facebook
            • RSS Feed
            • Xing
            Nach oben