Experimental project to drive a TFT LCD with an AVR MCU (ATmega328P) and avr-libc.
Currently supported displays/drivers:
- Adafruit 1.8" Color TFT LCD 160x128 ST7735R
- Adafruit 2.0" Color IPS TFT 320x240 ST7789
- Adafruit 2.8" Color TFT LCD with Cap Touch 320x240 ILI9341
Currently implemented features:
- Mostly complete UTF-8 set (code points U+0000 to U+00FF) of Hack font with antialiasing (4-Bit greyscale)
- Some emojis (16-Bit RGB)
- Write text in Hack including emojis 🙂
- Draw bitmaps
- Write text and bitmaps via USART
- Upload BMP images via USART (16-Bit 5/6/5 RGB)
- Basic SD card support: read and write blocks of 512 bytes
- Read BMP images from SD card (raw)
- Process touch events (FT6206)
- Very basic paint application
- Logging via USART
Ideas:
- Make features usable from a touch screen menu
Connect to the controller with for example GTKTerm (38400 Baud).
Write some text and a bitmap, and upload a BMP image:
c 0xffff
// clear display
d
// display the demo
t 0 0 Just some text
// write text in Hack to row 0 column 0
b 0 0 1
// write bitmap with index 1 (tiny Linus cat) to row 0 column 0
p 0 0
// prepare to "stream" a 16-Bit (5/6/5) RGB BMP image to row 0 column 0
cat Bali160x128.bmp > /dev/ttyUSB0
// upload a BMP image
s 0
// read BMP image from SD card starting at address 0 (to row 0 column 0)
a
// start paint application
Emojis are entered with a tabulation char + their "code", i.e. Smile!<TAB>s
for a smiling emoji.
Without any file system, to write any number of pictures with a specific resolution as 16-Bit (5/6/5) RGB BMP image files:
-
Convert pictures with ImageMagick 'convert' and pad them to a multiple of 512 bytes
for i in *.jpg; do convert $i -scale 320x240 -define bmp:subtype=RGB565 $i.bmp; truncate -s 154112 $i.bmp; echo $i; done
-
Concatenate the images to a single file
for i in *.bmp; do cat $i >> sdcard.img; echo $i; done
-
Write the images raw to SD card (danger zone!)
sudo dd if=sdcard.img of=/dev/mmcblk0 bs=512
Now the images can be read one by one from SD card with an address offset of 301
.
A super basic paint application created to learn about processing touch events and draw something on the screen.
The FT6206 based touch screen of the Adafruit 2.8" Color TFT LCD with Cap Touch 320x240 ILI9341 works quite well but at least for me the coordinates of touches close to the long edges of the screen are a bit off (too close to the edge) and there seems to be no calibration capability - the data sheet mentions "auto calibration".
But still it is fun and it should be possible to create an application supporting touch with reliable usability.