But like all text LCDs employing tricks to generate big characters, the BPP-440L must be finessed for best results. Fortunately, it's easy, and there's heavily commented code after the break. Here's the sort of thing we're talking about:
/*
Demonstrating Big character mode on the BPP-440L
4x40 serial LCD module.
seetrontech.blogspot.com
seetron.com
*/
// SoftwareSerial lets us use any I/O pin for serial output
// to the BPP-440L, saving the hardware UART for the bootloader
#include <SoftwareSerial.h> // or other critical comms.
// Streaming allows items for serial output to be grouped
#include <Streaming.h> // logically on a single line
#define rxPin 255 // Not used, so set to invalid pin #
#define txPin 3 // Hook SER input to Arduino pin 3.
#define inverted 1 // Inverted serial (like RS-232, but TTL levels)
#define noninverted 0 // Noninverted serial (like UART output)
// Change the definition of SPOL to inverted or noninverted
// depending on your display configuration. On newer BPP-440Ls,
// if the SPOL jumper is intact (factory setting), you want
// "inverted." If it's cut, use "noninverted."
#define SPOL inverted
// For inverted serial, the output pin must be LOW when data is
// not being sent; for noninverted, HIGH.
#if SPOL
#define STOPBIT LOW
#else
#define STOPBIT HIGH
#endif
//=====================================================================
// CONSTANTS FOR LCD INSTRUCTIONS
//
// Rather than scatter a bunch of magic numbers throughout the
// program, I've defined some self-explanatory names for the
// small subset of BPP-440L instructions needed.
#define HOME (char) 1 // Moveto character position 0.
#define BIGMODE (char) 2 // Begin big-character mode.
#define ENDBIG (char) 3 // End big-char mode.
#define CLS (char) 12 // Clear screen, moveto 0.
#define CR (char) 13 // Carriage return.
#define MOVETO (char) 16 // Position instruction
#define MIDSCREEN (char) (20+64) // Position addres of col 20
//=====================================================================
// CONSTANTS FOR FORMATTING FUNCTION
// A function below that formats strings for the BPP-420L uses
// a true/false argument to set right- or left- alignment of
// big characters.
#define RIGHT true
#define LEFT false
// In the BPP-440L Big-character mode, the space character " "
// (32 dec, 0x20 hex) is three columns wide, while A-Z and
// 0-9 are five columns. So to make a big space that is
// suitable for padding for alignment, let's define a
// "bigSpace" of five clear-column instructions.
char const bigSpace[] = {
0x11,0x11,0x11,0x11,0x11,0x00 } ;
//=====================================================================
// Set up a new serial output using the definitions above.
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin, SPOL);
// Create the string object that will be used for our output data.
String printMe = "" ;
//=====================================================================
// SETUP:
//=====================================================================
// Put the serial-output pin in the stop-bit state and
// set the bit rate to 9600bps. Then print the banner and the
// fixed labels at the #defined locations.
void setup() {
delay(500) ;
// define pin modes for tx, rx:
digitalWrite(txPin, STOPBIT); // Preset pin to stop-bit
mySerial.begin(9600); // Set the data rate.
delay(10) ; // wait.
// Print block of text on the left side of the display.
mySerial <<CLS ;
mySerial <<"BPP-440L DEMO |" <<CR <<"Big Characters |" <<CR ;
mySerial <<"w/ Padding for |" <<CR <<"Right Alignment |" ;
}
//=====================================================================
// LOOP:
//=====================================================================
// The program loop prints random numbers in big format on
// the righthand side of the display.
void loop() {
delay(500) ; // Slow so text is legible.
printMe = String(randigits(4)) ; // Get random digits
// Pad to fit specified # of big-character positions. Align right
// or left, depending on the final argument.
padforbigs(printMe,4,RIGHT) ;
// Move to specified position in screen, set big chars
// and print the string.
mySerial <<MOVETO <<MIDSCREEN <<BIGMODE <<printMe; ;
}
//=====================================================================
// FUNCTION: padforbigs
//=====================================================================
// This function is designed for use with the BPP-440L big-
// character mode. It takes a string and a desired length (in # of
// big-character positions, up to 8 for the whole screen), and
// pads the string with spaces to make it fit/erase/replace the
// entire specified field. It only works with letters A-Z and
// numbers 0-9, as the big-mode punctuation chars are skinnier.
void padforbigs(String & s, int olen, boolean rtalign) {
int ilen ;
ilen = s.length() ;
if (ilen > olen) { // If the string is too long
s = s.substring(0,olen) ; // shorten it.
}
else {
// Since the spaces are made up of ctrl-Q instructions, which
// turn off the big-character mode, we embed the big-mode
// instruction to turn it back on. This is only necessary for
// right alignment; in left alignment, the ctrl-Qs are after
// the big characters.
if (rtalign){
s = String(BIGMODE) + s ;
}
while ( ilen < olen ){ // If it's too short,
if (rtalign) { // add spaces to the start
s = String(bigSpace) + s ;
}
else {
s = s + String(bigSpace) ; // ..or the end, depending
} // on desired alignment.
ilen ++ ;
}
}
}
//=====================================================================
// FUNCTION: randigits
//=====================================================================
// This function returns a random number
// with a random # of digits, up to the # of
// digits specified. This is to ensure that a
// short run of the demo program will show all
// possible lengths of of values, so that you can
// see that the program updates the screen
// smoothly and erases previous values.
unsigned int randigits(int numdigs) {
numdigs = random(numdigs) ;
switch (numdigs) {
case 0:
return random(10) ;
break ;
case 1:
return random(100) ;
break ;
case 2:
return random(1000) ;
break ;
case 3:
return random(10000) ;
break ;
case 4:
return random(65535) ;
break ;
default:
return 42 ;
}
}
No comments:
Post a Comment