PPRINT   Enabling Variable Fonts on a Graphic LCD  

By Tim Box

Nov 03

 

While working a project using a graphical LCD, I was thinking that the display would look better if the font was a little bigger, thus Pprint was conceived. At first it was a simple basic program that obliterated all other print around it and generating the font was a laborious affair, even to make one character. A call to the gang on the forum produced a little program by MACPAD called Fontconverter. This code enabled you to take any PC font and converted it into the Cdata tables required to make Pprint work. From there I enhanced Pprint to mask the new print onto the data already on the screen, proud of my work I posted it back to the Forum for all to enjoy. That is as far it as it would have gone, a basic program that required you to send each character in turn to the routine.

But I had not reckoned on Les doing his magic, over the months since then Les has enhanced my code and converted Proton+ to work with Pprint to enable seamless printing in just about any font you could imagine. Fontconverter has not stood still either, with MACPAD adding more and more functionally until Oliver took on the mantel and produced the program we use today.

That’s the story, but what about the code and how do you use it.

GLCD_EXTERNAL_PRINT = PPRINT

By issuing this command the compiler disables its own print routines and loads in the code stored in PPRINT.INC (which can be found in you INC folder). From there on you will notice very little. All normal print commands work, as you would expect, the exceptions being CURSOR, AT and PRINT FONT.

 Printing normally works on a byte bounders on the Y axis and in 6 pixel points on the X axis, so limiting the possible positions to 0 –7 and 0 to 20 respectably.

 PPRINT by comparison enables you to print AT individual pixels, hence the name Pprint or Pixel Print.

 PRINT AT ypos (0 to 63),xpos (0 to 123)              Position the cursor on the LCD

 CURSOR is now addressable to individual pixels

 CURSOR ypos (0 to 63),xpos (0 to 123)               Position the cursor on the LCD

 Where values 0,0 will be the top left corner of the LCD.

 PRINT FONT X

 Normally X would be a number but as the font now has a name you use that.

 PRINT FONT times_bold14

 The label name can be found at the top of the font. If you have just used Fonfconverter, it is also possible to paste the full line, included the name of the font by pressing <ctrl> <V>.

 The printing reference point for each character is defined as the top left pixel of the character.  As an example, a font 14 pixels high when printed AT 0,0 will generate a character that will extend down to the 14th pixel on the GLCD display.

 Masking is provided so only those pixels visible on the screen are printed. Printing to position 60 with a 14 pixel high font will result in only the top 4 pixels of that character being displayed.

As Pprint integrates so seamlessly in to Proton+ all the normal Print modifiers work with no modifications: -

BIN{1..32} Display binary digits 
DEC{1..10} Display decimal digits 
HEX{1..8} Display hexadecimal digits 
SBIN{1..32} Display signed binary digits 
SDEC{1..10} Display signed decimal digits 
SHEX{1..8} Display signed hexadecimal digits
IBIN{1..32} Display binary digits with a preceding '%' identifier 

IDEC{1..10} Display decimal digits with a preceding '#' identifier 
IHEX{1..8} Display hexadecimal digits with a preceding '$' identifier 
ISBIN{1..32} Display signed binary digits with a preceding '%' identifier 
ISDEC{1..10} Display signed decimal digits with a preceding '#' identifier 
ISHEX{1..8} Display signed hexadecimal digits with a preceding '$' identifier 

REP c\n Display character c repeated n times 
STR array\n Display all or part of an array

CSTR cdata Display string data defined in a CDATA statement.

INVERSE 0-1 Invert the characters sent to the GLCD 
OR 0-1 OR the new character with the original 
XOR 0-1 XOR the new character with the original 

Here are some examples

In this first routine we force Proton+ to use Pprint and include a font to use, in the following examples I have omitted it

INCLUDE "PROTON_G4.INT" ' INCLUDE THE PROTON BOARD DEFAULTS
GLCD_EXTERNAL_PRINT=PPRINT
PRINT FONT ARIAL____12
CLS
PRINT CSTR TEXT1
PRINT CSTR TEXT2
PRINT CSTR TEXT3
STOP
TEXT1:
CDATA "HELLO WORLD" , 0
TEXT2:
CDATA "HOW ARE YOU?" , 0
TEXT3:
CDATA "I AM FINE!" , 0
INCLUDE "ARIAL_12.FNT"

DIM FLT AS FLOAT
FLT = -
3.1456832
PRINT DEC5 FLT ' DISPLAY 5 VALUES AFTER THE DECIMAL POINT

DIM MYARRAY [10] AS BYTE ' CREATE A 10-BYTE ARRAY.
STR MYARRAY =
"HELLO"     ' LOAD THE FIRST 5 BYTES OF THE ARRAY
PRINT STR MYARRAY \5        ' SEND 5-BYTE STRING.


PRINT AT 0,0, "Hello"
PRINT INVERSE 1    ' NOW PRINT INVERTED
PRINT AT 20,0, "Hello"
STOP

 PPRINT FONT CONSTRUCTION

 Fonts from 1x1 to 24 x 128 can be displayed using PPRINT.

 The font is constructed by a series of vertical byte’s that are fixed for all characters in that font. However each character can vary in width as required.

 The constructs of the font are :-

 The first value is the font height in pixels

 The next section of words is used as a lookup table to the address of the character data with in the table. The use of variable width fonts necessitates the use of this look up table. With the 16 series Pic’s (16f877 for example) this word is stored as a 14 bit value in ROM, this method not only increases the speed of the routine but saves data space as well. 18 series pic’s are saved in byte chunks, but due to the 16 bit ROM all data is stored very compactly when it comes to the core font data.

TIMES_BOLD14:-

CDATA 14 ; Font is 14 pixels high
CDATA TIMES_BOLD_0,TIMES_BOLD_1 ...
...
TIMES_BOLD_0:-
CDATA 2,0,0,0,0,0' Code for char   
TIMES_BOLD_1:-
CDATA 4,0,0,30,3,126,3,0,0,0' Code for char !

 The actual data for each character is constructed by first identifying the character length in pixels followed by the data which represents the character in vertically arranged bytes. If you look at Fig x you will see that byte 0 bit one is the top left of the character, byte 1 is next describing the lower 8 bits, byte 2 is the top or the next column….

 The normal design for the character is to have no space at the start of the character just at the end.

 

 

An example of how a 12 x 6 pixel high character is constructed

A font can be up to 3 bytes tall (24 pixels) and each character up to 255 bytes wide (no point making it any bigger than 128 though as you can view only 128 Pixels at once).

Fonts though take a lot of ROM space and you might want to reduce the font data to just cover the characters required. For details of how to do it look here 

 

USING FONTCONVERTER

If you have not already done so Fontonverter should be saved to the ….INC\ EXTERNAL PROGRAMS folder. This will enable you to access the program easily from within the editor .

 

 

 

 

 

 

 

 

 

   

Fontconverter can be used in two modes, Basic and Advanced. When using Basic mode you can down load the converted font directly into to the program you are writing. Simply open Fontconverter, choose the font and hit the convert button. Once the conversion has finished you can Quit. On return to the Editor the converted font is placed where you left your cursor.

There is also a small 'extra'. After the previous step and by placing the cursor at the position where you need the "PRINT FONT" statement and pressing <CTRL> <V>,  you will automatically paste the correct sentence and font name as it was stored in the clipboard.  

The 'Configuration' menu gives the ability to make Fontconverter compatible with PROTON PLUS V2.11 or V2.13 and up.

 

 Advanced mode enables you place greater control over the creation of the font. As understanding how to use the Advanced mode requires a lot of explanation I will leave it to for another article. 

 

Some screen captures from Isis* simulating a basic program running on a 16F877 and a GLCD to show some font printing in action.

 

Big Numbers

   

A Hand writing font

 

Over lapping print by using the OR modifier

Inverting with PRINT INVERSE 1

Download the Manual Inset for PPRINT Here

Down load the latest Version of Fontconverter Here

* Isis is a schematic capture and SPICE simulator from Labcenter Electronics

  November 03

(Last edition: 17/11/03)

Tim