Driver epd.c, fonts from https://www.mikrocontroller.net/topic/54860
.
epd-emit
works like the standard word emit
. It blocks the calling thread, as long as the character is not written to the EPD display. Horizontal (x) position is in pixel (0 to 249), vertical position (y) is in lines, a line consists of 8 pixels. 0, 0 is upper left corner. Larger fonts takes more than one line.
epd-emit ( c -- ) Emits a character (writes a character to the EPD framebuffer) epd-emit? ( -- ? ) EPD ready to get a character (SPI not busy) hook-emit ( -- a ) Hooks for redirecting terminal IO on the fly hook-emit? ( -- a ) epdpos! ( x y -- ) Set EPD cursor position, x horizontal position, pixel resolution, e.g. 0 to 249 for 250x122 displays. y vertical position (line), max. 15 for 250x122 displays. epdpos@ ( -- x y ) Get the current EPD cursor position epdclr ( -- ) Clears the EPD display, sets the cursor to 0, 0 epdfont ( u -- ) Select the font, u: 0 6x8, 1 8x8, 2 8X16 , 3 12X16 epdupdate ( -- ) Update the display (copy the framebuffer to the display) epdstartpart ( -- ) Start the partial update for the EPD display epdupdatepart ( -- ) Update part of the EPD display epdcmd ( a -- ) Send command to the EPD controller SSD1680. First byte contains the length of the command. epdsleep ( -- ) enter deep sleep mode epdwakeup ( -- ) wake up EPD epdpixel! ( ? x y -- ) not implemented yet epdpixel@ ( x y -- ? ) not implemented yet epdcolumn! ( u -- ) Write a column (8 pixels) to the current position. Increment position. Bit 0 on top epdcolumn@ ( -- u ) Read a column (8 pixels) from the current position >epd ( -- a1 a2 ) redirect to EPD *) >term ( a1 a2 -- ) terminate redirection *) *) part of redirection.fs
It is easy to redirect the terminal output to the EPD display, to use the string formatting words.
: epd-hallo ( -- ) hook-emit @ \ save emit hook ['] epd-emit hook-emit ! \ redirect terminal to epd-emit ." Hallo Velo! " cr ." ciao" hook-emit ! \ restore old hook epdupdate ;
or even simpler
: epd-hallo ( -- ) >epd \ redirect terminal to epd-emit ." Hallo Velo! " cr ." ciao" >term \ terminate redirection epdupdate ;
or on a command line
>epd .( Hallo Velo!) >term epdupdate
show date and time on EPD (see CmsisRtos#How_to_use_Tasks for a background task).
: clock ( -- ) epdclr 3 epdfont >epd .time >term epdupdate \ 2000 osdelay drop -1 -1 -1 alarm! \ set an alarm every second begin wait-alarm \ wait a second 0 0 epdpos! epdstartpart >epd .time >term epdupdatepart key? until key drop ;
The partial and fast update for the Adafruit #4195 is not working for me. But the very similar EPD YMS122250-0213AAAMFGN from DISPLAY LC or YES Optolectronics
use the red color memory for the partial update, about 300 ms and no flickering at all. Is Adafruit using the GDEY0213B74 (or GDEY0213B72, GDEY0213B73) https://www.good-display.com/product/391.html
for its display?
SDCS | microSD CS | D10 |
SRCS | RAM CS | NC |
ECS | EPD CS | D9 |
RESET | EPD Reset | D13 |
DC | EPD Data/Command | D11 |
BUSY | EPD Busy | D12 -> A4 |
MOSI | SPI Master Out | D4 |
MISO | SPI Master In | D3 |
CLK | SPI Clock | D2 |
A | Button SW1 | D9 |
B | Button SW2 | D6 |
C | Button SW3 | D5 |
LED1 | LED1 | D12 |
One byte display memory contains 8 pixels. Logical 0 is black, logical 1 is white. Most significant bit is first pixel.
250 x 122
Gate Y | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Source X | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15 | 112 113 114 115 116 117 118 119 | 120 121 | ||||||||||||||
Byte | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
1 | .. | |||||||||||||||||
2 | .. | |||||||||||||||||
.. | ||||||||||||||||||
249 | .. |
Row | Gate Y++ | ||||||
---|---|---|---|---|---|---|---|
Column | 0 | 1 | 2 | ... | 121 | ||
Source X++ | 0 | 0 | 0 | ... | 121 | ||
Source Byte | 0.0 | 0.1 | 0.2 | ... | 15.1 | ||
0 | 0..7 | ||||||
1 | 8..15 | ||||||
2 | 16..23 | ||||||
.. | .. | ||||||
31 | 249..250 |
Row | Source X++ | ||||||
---|---|---|---|---|---|---|---|
Column | 0 | 1 | 2 | ... | 249 | ||
Gate Y-- | 249 | 248 | 247 | ... | 0 | ||
0 | 0..7 | ||||||
1 | 8..15 | ||||||
2 | 16..23 | ||||||
.. | .. | ||||||
15 | 120..121 |
.pbm
P1 # This is an example bitmap of the letter "J" 6 10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
P4 # This is an example bitmap of the letter "J" 6 10 08080808080888700000
$ convert image.png -rotate -90 -flip image.pbm $ convert image.png -rotate 90 -flop image.xbm $ convert image -colorspace gray -threshold 10% -type bilevel result $ convert image -separate -monochrome result $ convert image.png -separate -monochrome -rotate 90 -flop -negate image.xbm convert image36 -shave 2x2 image32
This work by Peter Schmid is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
I | Attachment | History | Action | Size | Date | Who![]() |
Comment |
---|---|---|---|---|---|---|---|
![]() |
epd_header.jpg | r1 | manage | 38.7 K | 2022-08-14 - 20:58 | PeterSchmid |