-
1How to generate a character bit map in Flash
Ingredients:
- The Dot Factory: An LCD Font and Image Generator
- A True Type font of choice: Hack (which is also a beautiful font for source code editing)
- A display that uses pixels.
- An Arduino Video Display Shield (Have you understood recursion already? ;-)
"The Dot Factory is a small open source tool (MIT licensed) intended to generate the required C language information to store many fonts and images, as efficiently as possible, on a microcontroller."
Hack is an open source typeface ideal for sourcecode as it distinguished nicely between "0O" and "lI1". In Windows, 'Consolas' is designed for the same purpose, but I wasn't sure about license issues. So I used an open source alternative.
With 'TheDotFactory' software I generated a character bitmap for a subset of the ASCII codes 32 - 126 used for regular text display. The characters came out as up to 8 bit wide and 12 bit high. To optimize text output on low resolution displays, I reduced the height to 8 bit. This was a manual task, but not really tedious. The program also generates a table with character width, which would be usable for proportional width text display. For my demo I am not using this part and opt for a fixed width of 8 pixels.
A short Arduino program later, I programmed the character bitmap in Flash on my Video Display Shield. With clever memory access I have now text output. Source code for this is on my Github under P42Display_Memtest.
PS: 'TheDotFactory' is also usable to translate Images into image data bitmaps. This is helpful for all sorts of predefined graphics. -
2How to generate an animation with the Block Move command (BoingBall)
I used a 8-frame GIF animation of the famous Amiga BoingBall and separately saved the frames with the help of IrfanView. With the same program the images got scaled that the ball had a size of 30 x 30 pixels with a 1 pixel border on all 4 sides making it a 32x32 image size.
On the website Image2ASCIIArt (A big thank you to Robert Ecker for this great tool) I converted the 8 single images to text files.
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWW##....####.WWWWWWWWWW WWWWWWWW#...#####.####..WWWWWWWW WWWWWWW....#####.........#WWWWWW WWWWWW....######......###.#WWWWW WWWWW....######.......####.#WWWW WWWW.###....###.......#####..WWW WWW.####.......#.....######..WWW WWW####.......#####..######...WW WW.####.......#######..####...WW WW####.......########.....#...#W W.####.......########......#...W W#.###.......########......###.W W#...##.....########.......####W W....######.########.......####W W....#######...#####.......####W W....######........#.......####W W....######........####....####W W....######........#######.####W W.#..######........#######....#W W.#########.......########....#W WW###...###.......#######.....#W WW###.....#.......#######....#WW WWW##.....####...#######.....#WW WWWW#.....#######.######....#WWW WWWW.#....######.......#...#WWWW WWWWW.#...######.......####WWWWW WWWWWW.##.######......###.WWWWWW WWWWWWWW##..####.....###.WWWWWWW WWWWWWWWW##....#....###WWWWWWWWW WWWWWWWWWWWW..####...WWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
From here it was 3 simple search and replace operations and some surrounding code for a nice data structure that got used in my code to be programmed into FLASH similar to the character set. The code snipped below would look nice if it could be formatted to 32 entries per line.
const PROGMEM byte boingball[] = { // frame 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x24, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x00, 0x00, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x0D, 0x24, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x24, 0x24, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x0D, 0x0D, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x24, 0x24, 0x24, 0x24, 0x0D, 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // frame 1......}
Next: How to do a block animation with the VLSI VS23S010D.
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.