Z80
LCD
PIC
8051
Opera
Software
Files
Bookstore
Links
About me
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Netsscape Navigator users ! Your browser can not display the bitmap images on this page. Click HERE to see the same page with the images converted to JPEG format. Or better, switch to Opera Browser and see what you have been missing !

NOTE : Much of the info on this page is now obsolete. This is how I obtained graphic data for the first time. See the final page with lots of software tools to help you with this.

Graphics How To

If you have a graphics LCD you will want to see graphics on it. If you had an LCD with a Toshiba T6963C controller, it would be easy to take a bitmap image and display it on the LCD. It is not as easy for KS0108 or HD61202 controlled LCDs, because they employ a paging scheme.

The animation above is 1023 frames and demonstrates a simple way I use to load bitmap files to my KS0108 controlled 128*64 graphics LCD. Actually the animation was to be 1024 frames, but I missed a byte and I do not know which one. For the animated gif I actually created 1023 64*128 bitmaps. I used a hex editor (Hexworks 3,25 from Bpsoft) to create the necessary images. I found the image to animate in ACCESSORY DISK FOR G12864 SERIAL GRAPHICS DISPLAY (Gx_disk1.zip) from Scott Edwards Electronics, Inc. The G12864 is a great display. It has 16kB of nonvolatile flash EEPROM memory. The lower 2kB of this memory holds the bitmapped font used to display text. The remaining memory can be used to store up to 14 full-screen images for display on the graphics layer. A utility program allows you to convert and download bitmapped pictures (128x64-pixel .BMP graphics) to the display. Get one, and you will no more have graphics blues...

The bitmap image you see below can be displayed on a 128*64 LCD. You can create such an image using Paint that comes with Windows, Paint Shop Pro, Adobe Photoshop or some other image editing software. The image must be :

  • Windows bitmap format (.BMP)
  • Black and white (1 bit per pixel)
  • No compression
  • 128 * 64 pixels (or another size matching the LCD)
A 128*64 bitmap meeting the format mentioned above will be 1086 bytes (62 bytes header + 1024 bytes image data). Image data starts at the bottom-left corner and works from left to right, bottom-to-top in a series of 1-pixel-high stripes. Each stripe is 16 bytes and there are 64 stripes (16*64=1024 Bytes). The most significant bit of each byte is the leftmost one. If you are confused by by these horizontal bytes and stripes, take a look at the bitmap images below. They are all 128*64 but I stretched them to 192*96 so that pixels are easier to see. The first one is white. This means that all image data is FFh. If a bit is 1, the corresponding pixel of the bitmap image will be white and If it is 0 the pixel will be black. On the second bitmap, I took the first one and changed the 63rd (the first byte after the header) byte from FFh to FEh ,making a single pixel black. On the third one I change the 64th from FFh to FCh ,making two pixels of that byte black. Then comes the 65th, 66th and so on...
Below you see the hex dump of the first 176 bytes of the 9th bitmap.

00000000 424D 3E04 0000 0000 0000 3E00 0000 2800 BM>.......>...(.
00000016 0000 8000 0000 4000 0000 0100 0100 0000 ......@.........
00000032 0000 0004 0000 C40E 0000 C40E 0000 0000 ................
00000048 0000 0000 0000 0000 0000 FFFF FF00 FEFC ................
00000064 F8F0 E0C0 8000 FFFF FFFF FFFF FFFF FFFF ................
00000080 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................
00000096 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................
00000112 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................
00000128 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................
00000144 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................
00000160 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................
00000176 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ................

You must have now learned more than enough on the bitmap format to display one on an LCD. As stated in the introduction page, the usual KS0108 or HD61202 controlled 128*64 LCD is split in half and each half consists of 8 horizontal pages which are 8 bits (1 byte) high. That is, bytes are vertical and do not match the layout of the bitmap we intend to display on the LCD. So, what happens if I rotate the bitmap 90 degrees counter clockwise ? What I have now is a bitmap with 128 horizontal stripes which are 8 bytes each (128*8=1024 Bytes). If you are confused take a look at the bitmap and the hex dump below.
00000000 42 4D 3E 04 00 00 00 00 BM>.....
00000008 00 00 3E 00 00 00 28 00 ..>...(.
00000016 00 00 40 00 00 00 80 00 ..@.....
00000024 00 00 01 00 01 00 00 00 ........
00000032 00 00 00 04 00 00 12 0B ........
00000040 00 00 12 0B 00 00 02 00 ........
00000048 00 00 02 00 00 00 00 00 ........
00000056 00 00 FF FF FF 00 FE FF ........
00000064 00 FF FF FF FF FF FF FF ........
00000072 FF FF FF FF FF FF FC FF ........
00000080 80 FF FF FF FF FF FF FF ........
00000088 FF FF FF FF FF FF F8 FF ........
00000096 C0 FF FF FF FF FF FF FF ........
00000104 FF FF FF FF FF FF F0 FF ........
00000112 E0 FF FF FF FF FF FF FF ........
00000120 FF FF FF FF FF FF E0 FF ........
00000128 F0 FF FF FF FF FF FF FF ........
00000136 FF FF FF FF FF FF C0 FF ........
00000144 F8 FF FF FF FF FF FF FF ........
00000152 FF FF FF FF FF FF 80 FF ........
00000160 FC FF FF FF FF FF FF FF ........
00000168 FF FF FF FF FF FF 00 FF ........
00000176 FE FF FF FF FF FF FF FF ........
I set my hex editor to display 8 bytes per row, so that each column of the hexdump corresponds to a page of the display. The yellow column corresponds to Page #1 and the light blue one to Page #3. It looks great untill you realize that bits do not match the ones on the LCD. The bits are positioned in reverse order. What we want to be is the MSB is LSB, and vice a versa. To correct this I mirror the image, and then the first column of the hexdump becomes the correct data for the page 7 and the last column for the page 0 of the LCD. See below.

00000000 FF FF FF FF FF FF FF FF ........
00000008 FF FF 7F FF FF FF FF FF ........
00000016 FF FF C0 09 0F FF 83 FF ........
00000024 FC 9F 80 12 40 08 01 FF ....@...
00000032 FD BF E0 08 02 12 00 7F ........
00000040 FE A7 F8 09 0C 00 05 7F ........
00000048 FF A7 FF FF FE 80 0F 7F ........
00000056 FF 0F FF FF FF E0 0D FF ........
00000064 FF 01 FF FF FF F8 0F FF ........
00000072 FF 80 FF FF FF F0 0F FF ........
00000080 FF C0 7F FF FF E0 3F FF ......?.
00000088 FF FC 1F FF FF C0 7F FF ........
00000096 FF FE 0F FF FF 84 FF FF ........
00000104 FF FE 83 FF FF 81 FF FF ........
00000112 FF FF C0 FF FE 01 FF FF ........
00000120 FF FF E0 1F F4 3D FF FF .....=..
00000128 FF FF F8 0F FC 0F FF FF ........
00000136 FF FF FE 07 F8 2F FF FF ...../..
00000144 FF FF FF 41 C4 3F FF FF ...A.?..
00000152 FF FF FF 70 22 7F FF FF ...p"...
00000160 FF FF FF DC 00 FF FF FF ........
00000168 FF FF FF FE 09 FF FF FF ........
00000176 FF FF FF FF 07 FF FF FF ........
00000184 FF FF FF FF 87 FF FF FF ........
00000192 FF FF FF FF E7 FF FF FF ........
00000200 FF FF FF FF FF FF E7 FF ........
00000208 FF FF FF FF FF FF E3 FF ........
00000216 FF 00 3F FF FF FF E1 FF ..?.....
00000224 FF 00 00 7F FF F9 F0 FF ........
00000232 FF 80 04 07 F0 C0 F8 7F ........
00000240 FF C0 00 00 00 86 BC 7F ........
00000248 FF FF D1 00 02 00 3E 1F ......>.
00000256 FF FF FF E8 00 D2 7F 1F ........
00000264 FF FF FF FF A7 FF FF CF ........
00000272 FF FF FF FF FF FF FF F7 ........
00000280 FE 70 0F FF FF FF FF FF .p......
00000288 FF A8 80 3F FF FF EF FF ...?....
00000296 FF 60 00 00 7F FC 07 FF .`......
00000304 FF DC 08 00 80 0C 03 FF ........
00000312 FF FF FD 00 08 04 0B FF ........
00000320 FF FF FF F8 84 00 03 FF ........
00000328 FF FF FF FF DA 00 0B FF ........
00000336 FF FF FF FF FF E0 9B FF ........
00000344 FF FF FF FF FF 70 5F FF .....p_.
00000352 FF FF FF FF F0 83 DF FF ........
00000360 FF FF FF FF B4 09 FF FF ........
00000368 FF FF FF FC 62 7F FF FF ....b...
00000376 FF FF FF E3 E6 7F FF FF ........
00000384 FF FF FF 00 6D FF FF FF ....m...
00000392 FF FF F8 C1 3F FF FF FF ....?...
00000400 FF E8 00 08 FF FF FF FF ........
00000408 FF C0 00 03 FF FF FF FF ........
00000416 FF C0 00 7F FF FF FF FF ........
00000424 FF E0 03 FF FF FF FF FF ........
00000432 FF F0 03 10 04 03 FF FF ........
00000440 FF FF 14 A4 80 00 00 FF ........
00000448 FF FF E8 44 04 00 00 7F ...D....
00000456 FF FF F9 A6 D5 D8 20 3F ...... ?
00000464 FF FF FF FF FF FD 81 3F .......?
00000472 FF FF FF FF FF FF FF FF ........
00000480 FF FF FF FF FF FF FF FF ........
00000488 FF FF FF FF E1 FF FF FF ........
00000496 FF FF E3 FF 80 FF FF FF ........
00000504 FF FF C5 FF B0 7F FF FF ........
00000512 FF FF 00 FC 18 7F FF FF ........
00000520 FF FE 03 FC 06 3F FF FF .....?..
00000528 FF FE 03 F1 3E 37 FF FF ....>7..
00000536 FF FF 0F E4 BF 17 FF FF ........
00000544 FF FF 8F EB FF 89 FF FF ........
00000552 FF FF DF 9D FF 86 FF FF ........
00000560 FF FF FE 03 FF C1 FF FF ........
00000568 FF FF FE 47 FF F1 7F FF ...G....
00000576 FF FF F8 CF FF F8 7F FF ........
00000584 FF FF E9 4F FF FC 1F FF ...O....
00000592 FF FF C0 5F FF FE 01 FF ..._....
00000600 FF FF A7 FF F9 FF 01 FF ........
00000608 FF FF 03 FF F8 FF 41 7F ......A.
00000616 FF F8 0B FF F8 7F D4 7F ........
00000624 FF E0 0B FF F1 3F F6 FF .....?..
00000632 FF E0 07 FF E0 1F FC FF ........
00000640 FF F0 1F FF C0 0F FF FF ........
00000648 FF F8 9F FF 81 47 FF FF .....G..
00000656 FF FF FF FF 21 03 FF FF ....!...
00000664 FF FF FF FE 44 63 FF FF ....Dc..
00000672 FF FF FF F8 0D D1 FF FF ........
00000680 FF FF FF F8 29 31 BF FF ....)1..
00000688 FF FF FF E0 B9 90 3F FF ......?.
00000696 FF FF FF 18 79 5C 43 FF ....y\C.
00000704 FF FF FF 02 FC 1E 03 FF ........
00000712 FF FF F0 83 F9 BF 81 FF ........
00000720 FF FF 82 0F FA 7F D4 FF ........
00000728 FF F8 00 FF FA 3F F5 FF .....?..
00000736 FF C0 00 7F F8 7F FC BF ........
00000744 FF C0 05 FF F8 7F FF BF ........
00000752 FF C0 1F FF F8 7F FF FF ........
00000760 FF E0 7F FF F8 3F FF FF .....?..
00000768 FF F3 FF FF FC 7F FF FF ........
00000776 FF FF FF FF FF 7F FF FF ........
00000784 FF FF FF FF FF FF FF FF ........
00000792 FF FF FF FF FF FF FF FF ........
00000800 FF FF FF FF FF FF FB FF ........
00000808 FF 04 FF FF FF FF F1 FF ........
00000816 FE 00 07 FF FF FF 00 7F ........
00000824 FF 04 00 3F FF F8 00 1F ...?....
00000832 FF A2 00 42 04 C0 80 5F ...B..._
00000840 FF FF C0 04 22 22 09 FF ....""..
00000848 FF FF FC 80 00 00 1F FF ........
00000856 FF FF FF FA 01 3A A3 FF .....:..
00000864 FF FF FF FE 03 FE 0F FF ........
00000872 FF FF FF F9 47 FC FF FF ....G...
00000880 FF FF FF F0 83 F8 1F FF ........
00000888 FF FF FF E0 43 FA 9F FF ....C...
00000896 FF FF FF 0B 43 F5 7F FF ....C...
00000904 FF FF FC 00 E1 E3 7F FF ........
00000912 FF FF FA 01 F3 D6 FF FF ........
00000920 FF FF FA B7 E1 C1 FF FF ........
00000928 FF FF 00 3F E1 87 FF FF ...?....
00000936 FF FE 11 FF E1 03 FF FF ........
00000944 FF E2 01 FF F1 23 FF FF .....#..
00000952 FF 80 61 FF F0 07 FF FF ..a.....
00000960 FD 00 BF FF F8 0F FF FF ........
00000968 F0 00 FF FF FC 0F FF FF ........
00000976 E0 13 FF FF FE 0F FF FF ........
00000984 E1 4F FF FF FF 8F FF FF .O......
00000992 F8 FF FF FF FF FF FF FF ........
00001000 FE FF FF FF FF FF FF FF ........
00001008 FF FF FF FF FF FF FF FF ........
00001016 FF FF FF FF FF FF FF FF ........
Generated by Hex Workshop

Here is the target image mirrored after being rotated. On the right you see the hex dump of this image with the header removed. Now we need a way to take this data and send it to the LCD. There are many ways of doing that. The first one I thought of can be seen at the 1023 frame animated gif at the top of this page. I take the first byte of the image data and send it to the first column of the first page. Then take the second byte and make it the first column of the second page. This goes on till all pages have their first byte of data. Then I continue with the second byte of each page and so on... The animated gif explains it better than me anyway... This simple method works fine, but has some serious drawbacks:

  • It requires that the page is changed after each byte sent
  • Does not make use of the increase feature of the Y address counter and the Y address is to be set after each byte sent
  • Requires a lot of I/O operations
  • Inefficient

A second method is to take the first byte and send it to the LCD as the first byte of the first page. Then send the 9th, 17th, 25th and so on... Notice that these are all on the first page and on the first column of the hexdump. This method is much more efficient than the first one, since it uses the count function of the Y address counter.

The method mentioned above can be more efficient if we could organize the image data in a way that the arithmetic operation to increase a pointer by 8 is eliminated.

Another way is to use text editor with block select function to extract each column (page) of the hexdump and reformat it to include it in your assembly source. Below you can see the hex data reformatted to be included in an assembly file.

Please note that the image achieved on the LCD using this data will be negative, because if a bit is 1, the corresponding pixel of the LCD will be black and If it is 0 the pixel will be white. You may either invert the data before sending it to the LCD or start with the negative of your image. Here is the negative of the example presented here:

 


image:
;Page 0
	db	0FFh,0FFh,0FFh,0FFh,07Fh,07Fh,07Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,07Fh,07Fh,01Fh
	db	01Fh,0CFh,0F7h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,07Fh,03Fh,03Fh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,07Fh,07Fh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0BFh,0BFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,07Fh,01Fh,05Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
;Page1
	db	0FFh,0FFh,083h,001h,000h,005h,00Fh,00Dh,00Fh,00Fh,03Fh,07Fh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0E3h,0E1h,0F0h,0F8h,0BCh,03Eh
	db	07Fh,0FFh,0FFh,0FFh,0EFh,007h,003h,00Bh,003h,00Bh,09Bh,05Fh,0DFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,020h,081h,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,07Fh,07Fh,01Fh,001h,001h,041h,0D4h,0F6h,0FCh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0BFh,03Fh,043h,003h,081h,0D4h,0F5h,0FCh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FBh,0F1h,000h,000h,080h,009h,01Fh,0A3h,00Fh,0FFh,01Fh,09Fh
	db	07Fh,07Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
;Pageh 2
	db	0FFh,0FFh,0FFh,008h,012h,000h,080h,0E0h,0F8h,0F0h,0E0h,0C0h,084h,081h,001h,03Dh
	db	00Fh,02Fh,03Fh,07Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F9h,0C0h,086h,000h
	db	0D2h,0FFh,0FFh,0FFh,0FFh,0FCh,00Ch,004h,000h,000h,0E0h,070h,083h,009h,07Fh,07Fh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,003h,000h,000h,0D8h,0FDh,0FFh,0FFh,0FFh,0FFh,07Fh
	db	07Fh,03Fh,037h,017h,089h,086h,0C1h,0F1h,0F8h,0FCh,0FEh,0FFh,0FFh,07Fh,03Fh,01Fh
	db	00Fh,047h,003h,063h,0D1h,031h,090h,05Ch,01Eh,0BFh,07Fh,03Fh,07Fh,07Fh,07Fh,03Fh
	db	07Fh,07Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,0C0h,022h,000h,03Ah,0FEh,0FCh,0F8h,0FAh
	db	0F5h,0E3h,0D6h,0C1h,087h,003h,023h,007h,00Fh,00Fh,00Fh,08Fh,0FFh,0FFh,0FFh,0FFh
;Page 3
	db	0FFh,0FFh,00Fh,040h,002h,00Ch,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FEh,0F4h
	db	0FCh,0F8h,0C4h,022h,000h,009h,007h,087h,0E7h,0FFh,0FFh,0FFh,0FFh,0F0h,000h,002h
	db	000h,0A7h,0FFh,0FFh,0FFh,07Fh,080h,008h,084h,0DAh,0FFh,0FFh,0F0h,0B4h,062h,0E6h
	db	06Dh,03Fh,0FFh,0FFh,0FFh,0FFh,004h,080h,004h,0D5h,0FFh,0FFh,0FFh,0E1h,080h,0B0h
	db	018h,006h,03Eh,0BFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F9h,0F8h,0F8h,0F1h,0E0h
	db	0C0h,081h,021h,044h,00Dh,029h,0B9h,079h,0FCh,0F9h,0FAh,0FAh,0F8h,0F8h,0F8h,0F8h
	db	0FCh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,004h,022h,000h,001h,003h,047h,083h,043h
	db	043h,0E1h,0F3h,0E1h,0E1h,0E1h,0F1h,0F0h,0F8h,0FCh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh
;Page 4
	db	0FFh,0FFh,009h,012h,008h,009h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,01Fh
	db	00Fh,007h,041h,070h,0DCh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,07Fh,007h,000h,000h
	db	0E8h,0FFh,0FFh,0FFh,03Fh,000h,000h,000h,0F8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FCh,0E3h
	db	000h,0C1h,008h,003h,07Fh,0FFh,010h,0A4h,044h,0A6h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FCh,0FCh,0F1h,0E4h,0EBh,09Dh,003h,047h,0CFh,04Fh,05Fh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FEh,0F8h,0F8h,0E0h,018h,002h,083h,00Fh,0FFh,07Fh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,03Fh,042h,004h,080h,0FAh,0FEh,0F9h,0F0h,0E0h
	db	00Bh,000h,001h,0B7h,03Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
;Page 5
	db	0FFh,07Fh,0C0h,080h,0E0h,0F8h,0FFh,0FFh,0FFh,0FFh,07Fh,01Fh,00Fh,083h,0C0h,0E0h
	db	0F8h,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,03Fh,000h,004h,000h,0D1h
	db	0FFh,0FFh,0FFh,00Fh,080h,000h,008h,0FDh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0F8h,000h,000h,000h,003h,003h,014h,0E8h,0F9h,0FFh,0FFh,0FFh,0FFh,0E3h,0C5h
	db	000h,003h,003h,00Fh,08Fh,0DFh,0FEh,0FEh,0F8h,0E9h,0C0h,0A7h,003h,00Bh,00Bh,007h
	db	01Fh,09Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F0h,082h,000h,000h,005h,01Fh,07Fh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,007h,000h,000h,0C0h,0FCh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FCh,0FAh,0FAh,000h,011h,001h,061h,0BFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
;Page 6
	db	0FFh,0FFh,0FFh,09Fh,0BFh,0A7h,0A7h,00Fh,001h,080h,0C0h,0FCh,0FEh,0FEh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,080h,0C0h,0FFh
	db	0FFh,0FFh,0FFh,070h,0A8h,060h,0DCh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0E8h,0C0h,0C0h,0E0h,0F0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FEh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,0E0h,0E0h
	db	0F0h,0F8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,0C0h,0C0h,0C0h,0E0h
	db	0F3h,0FFh,0FFh,0FFh,0FFh,004h,000h,004h,0A2h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FEh,0E2h,080h,000h,000h,013h,04Fh,0FFh,0FFh,0FFh,0FFh
;Page 7
	db	0FFh,0FFh,0FFh,0FCh,0FDh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
	db	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FDh,0F0h,0E0h,0E1h,0F8h,0FEh,0FFh,0FFh

Lanng & Co has a program called LCD Icon Editor. It allows you to edit images,create or import fonts for KS0108 or 61202 based LCDs. It is a very usefull program, but the save function of the evaluation version available to download is disabled and the price is not mentioned.

1