The following Arduino code to drive a Sparkfun graphics and text LCD backpack is discussed in detail on the page the link takes you to. (Sparkfun's page about the backpack is at LCD-09352, which is their partnumber for it.)
/* NGL-TestPcb270- NoviceGuard Lite Version: 25 Feb 18 Started: 25 Feb 18 This code is discussed at... http://sheepdogguides.com/elec/ser_disp/alpha-graphic-sparkfun-LCD-09352.htm */ #include <SoftwareSerial.h> SoftwareSerial MySerial(9,10);// RX, TX void setup() { //Prepare things... Serial.begin(9600);//Leave in MySerial.begin(9600);//115200 is the default... try with that, first. delay(400);//Give serial line a moment to stablize /*Change Baud Rate * * You MAY not need to do this! And if you do, you will then have to change the * MySerial.begin line above. Changes to baud rate are "remembered" across * power off/ power on events. * * Changing the baud rate is fraught with "Catch-22" pitfalls. If you get in * a total muddle, sending a character at 115200 while the backpack is booting * is supposed to reset the device to using 115200 * * If your device seems to "die", sometime after you've changed to a non- * standard baud rate, just check that it hasn't reverted to 115200 * somehow. If this happens to you often, I'd be interested to hear * about it... especially if you can figure out why it does it! Sending "<control>g (0x07)" followed by an ASCII character from "1" to "6" changes the baud rate. The default baud rate is 115,200bps, but the backpack can be set to a variety of communication speeds: Character Baud Rate "1" 4800 "2" 9600 "3" 19200 "4" 38400 "5" 57600 "6" 115200 MySerial.write(124); delay(20); MySerial.write(7);//CHANGE BAUD RATE SETTING delay(20); MySerial.write(0x32);//N.B.... not 2 (for 9600) */ //-------------------------------------------- //Exercise the LCD display, try various commands... MySerial.write(124); MySerial.write(byte(0));//Clear screen //Start by setting initial cursor position to 0,0 //If cursor set to 0,0, upper left of 1st character // printed will be at upper left of LCD //This may be unnecessary, but does no harm, and // is a chance to demonstrate the "set cursor" // command. This "cursor" is relevant only to // the placement of text on the screen. //The backpack has limited "wrapping" intelligence. MySerial.write(124); MySerial.write(0x18);//Set cursor X value MySerial.write(byte(0)); MySerial.write(124); MySerial.write(0x19);//Set cursor Y value MySerial.write(byte(0)); delay(80);//Inserting these after set cursor and printlns //solves some problems with missed characters. //Put some text on display... MySerial.println();//(This just to move text down screen... //... could have been done with a more clever initial Y // coordinate. delay(80);//Insert similar if the text you are getting // has the occasional problem. Check you baud rate settings // if you are getting nothing or "pure" gibberish. MySerial.println("Welcome to Sparkfun"); delay(80); MySerial.println(" LCD-0935"); delay(80); MySerial.println(); delay(80); MySerial.println("Keep watching.Things"); delay(80); MySerial.println(" come and go."); //Give viewer a moment to read text... delay(2000); // ... before.... //If you leave the following in, the "ink" and "paper" // of your display will be reversed each time the // program passes this point. //Normally, you would issue this command once, with an // ad hoc program, and then not issue it again. Unless // you like the display's mode flipping back and forth // all the time! /* MySerial.write(124); MySerial.write(0x12);//Reverse display mode. */ MySerial.write(124); MySerial.write(byte(0));//Clear screen //Max on line: xxxxxxxxxxxxxxxxxxxx MySerial.println("'Graph' will now"); delay(80); MySerial.println("appear, then go..."); //Give viewer a moment to read text... delay(1500); // ... before.... MySerial.write(124); MySerial.write(byte(0));//Clear screen //============ Set/Clear Pixels"..... //Put pixels on screen... /* (all the "random" stuff is just to generate a * pseudo "graph". The heart of this is... MySerial.write(124); MySerial.write(0x10);//Set or clear pixel. MySerial.write(10);//to draw at x coordinate=10, and... MySerial.write(20);//y coordinate=20 MySerial.write(1);//to set pixel Make the last line MySerial.write(0);//to clear pixel */ byte bCount=0; byte bPrevY=55; randomSeed(10); do { MySerial.write(124); MySerial.write(0x10);//Set or clear pixel. MySerial.write(bCount);//x coordinate if (random(3)==0) {bPrevY=bPrevY-2;}; MySerial.write(bPrevY+random(4)-2);//y coordinate MySerial.write(1);//to set pixel bCount=bCount+1; }while (bCount<80); //************************************* // give viewer a moment to see the soon-to-disappear // pixels... delay(4000); //And now remove the pixels we put on screen // a moment ago... randomSeed(10); bCount=0; bPrevY=55; do { MySerial.write(124); MySerial.write(0x10);//Set or clear pixel. MySerial.write(bCount);//x coordinate if (random(3)==0) {bPrevY=bPrevY-2;}; MySerial.write(bPrevY+random(4)-2);//y coordinate MySerial.write(byte(0));//to clear pixel bCount=bCount+1; }while (bCount<80); //=========== "Reverse Display".... see discussion at... //http://sheepdogguides.com/elec/ser_disp/alpha-graphic-sparkfun-LCD-09352.htm /* MySerial.write(124);//cmnd MySerial.write(0x12);//reverse the display mode //The reuslts of this command are remembered across //power off/ power on events. */ //=========== "Draw/ Erase Line"... /*Rem out this block to see the failure of the supposed "erase line" * block, which follows draw one. MySerial.write(124); MySerial.write(0x0C);//Draw/Erase line... with "Draw" chosen //by final parameter MySerial.write(byte(0x00));//x coordinate of start... //remember "byte()" if saying zero MySerial.write(10);//y coordinate of start MySerial.write(60);//x coordinate of finish MySerial.write(30);//y coordinate of finish MySerial.write(1);//to make backpack DRAW line. //(Zero here to erase... but "erase" doesn't seem to work) //May even be creating a problem, if DrawLine is only // using 4 parameters. (Cause problem by leaving an // unused byte in the serial buffer.) delay(1000);// to give viewer time to see line, before.... */ MySerial.write(124); MySerial.write(0x0C);//Draw/Erase line... with "Erase" chosen //by final parameter MySerial.write(byte(0x00));//x coordinate of start... remember "byte" if saying zero MySerial.write(10);//y coordinate of start MySerial.write(60);//x coordinate of finish MySerial.write(30);//y coordinate of finish MySerial.write(byte(0));//SUPPOSED to make backpack ERASE line. //Doesn't seem to have any effect. 0x0C DRAWS regardless of // this final parameter. See notes in DrawLine above. delay(1000);// to give viewer time to see line, before.... //========= "Draw/Erase Circle"..... /*Rem out this block to see the failure of the supposed "erase circle" * block, which follows draw one. MySerial.write(124); MySerial.write(0x03);//Draw/Erase circle... with "Draw" chosen //by final parameter MySerial.write(20);//x coordinate of center MySerial.write(20);//y coordinate of center MySerial.write(12);//radius MySerial.write(1);//to make backpack DRAW circle. (Zero here is //SUPPOSED to make backpack erase line. Doesn't seem to work. delay(1000);// to give viewer time to see line, before.... */ //Now try to erase just-drawn circle.... MySerial.write(124); MySerial.write(0x03);//Draw/Erase circle... with "Erase" chosen //by final parameter MySerial.write(20);//x coordinate of center MySerial.write(20);//y coordinate of center MySerial.write(12);//radius MySerial.write(byte(0));//SUPPOSED to make backpack ERASE circle. //Doesn't seem to have any effect. 0x03 DRAWS regardless of // this final parameter. See notes in DrawLine above. delay(1000);// to give viewer time to see line erased, before.... /* //(This unnecessary if "erase circle" didn't work... but left in // in case "erase circle" eventually fixed! //Now re-draw it. To see another form of erasing take place. MySerial.write(124); MySerial.write(0x03);//Draw/Erase circle... with "Draw" chosen MySerial.write(byte(20));//x coordinate of center MySerial.write(20);//y coordinate of center MySerial.write(12);//radius MySerial.write(byte(1));//to make backpack DRAW circle. (Zero here is //SUPPOSED to make backpack erase line. Doesn't seem to work.) */ //================= "Draw/Erase Box"............. /*Rem out the following block to see that DrawBox with zero * as final parameter still does a DRAW, not an erase. MySerial.write(124); MySerial.write(0x0F);//Draw/Erase OUTLINE of a box, with "Draw" specified. MySerial.write(byte(0x00));//x coordinate of upper left MySerial.write(15);//y coordinate of upper left MySerial.write(40);//x coordinate of lower right MySerial.write(30);//y coordinate of lower right MySerial.write(1);//to make backpack DRAW box. (Zero here to erase. Or vice versa. May not work!) delay(1000);// to give viewer time to see box outline, before.... */ MySerial.write(124); MySerial.write(0x0F);//"Draw/Erase" box outline, with "Erase" specified. MySerial.write(byte(0x00));//x coordinate of upper left MySerial.write(15);//y coordinate of upper left MySerial.write(40);//x coordinate of lower right MySerial.write(30);//y coordinate of lower right MySerial.write(byte(0));//SUPPOSED to make backpack ERASE box outline. //Doesn't seem to have any effect. 0x05 DRAWS regardless of // this final parameter. See notes in DrawLine above. delay(1000);// to give viewer time to see that, before.... //============== "Erase a BLOCK, i.e. area, not just outline..... // N.B.... this DIFFERENT from "Draw/Erase Box". MySerial.write(124); MySerial.write(0x05);//Erase BLOCK... this is a DIFFERENT command from //the "Draw/Erase Box" command. Erase BLOCK (command code 0) erases the //contents of a whole rectangle, not just the four lines that outline it. MySerial.write(byte(0x00));//x coordinate of upper left MySerial.write(10);//y coordinate of upper left MySerial.write(40);//x coordinate of lower right MySerial.write(25);//y coordinate of lower right //Note there is no final parameter with this to say "draw or erase". //Command 0x05, Erase BLOCK is always an erase operation. "A final // parameter COULD have been uses to create a "Erease OR FILL block".) //delay(1000);// to give viewer time to see that, before.... /*Following doesn't work... pity... but it was never suggested by * Sparkfun that it might! MySerial.write(124); MySerial.write(0x05);//Erase BLOCK... this is a DIFFERENT command from //the "Draw/Erase Box" command. Erase BLOCK (command code 0) erases the //contents of a whole rectangle, not just the four lines that outline it. MySerial.write(byte(0x00));//x coordinate of upper left MySerial.write(10);//y coordinate of upper left MySerial.write(40);//x coordinate of lower right MySerial.write(25);//y coordinate of lower right MySerial.write(byte(0));//to make backpack ERASE if 0, FILL it if 1 */ //===== final message.... MySerial.write(124); MySerial.write(0x18);//Set cursor X value MySerial.write(byte(0)); delay(80); MySerial.write(124); MySerial.write(0x19);//Set cursor Y value MySerial.write(35); delay(100); // 1 5 0 5 0 //Max on line: xxxxxxxxxxxxxxxxxxxx MySerial.println("That's it.Study code"); delay(80); MySerial.println("for reasons for what"); delay(80); MySerial.println("was shown recently."); delay(80); //========= And show off backlight control.... //Backlight should "step down" to "off", and then come back again... //This uses the "Set Backlight Duty Cycle" command MySerial.write(124); MySerial.write(0x02);//Set Backlight Duty Cycle. (Brightness) MySerial.write(80);//use 0 to 100 here, for off to brightest delay(800); MySerial.write(124); MySerial.write(0x02);//Set Backlight Duty Cycle. MySerial.write(60); delay(800); MySerial.write(124); MySerial.write(0x02);//Set Backlight Duty Cycle. MySerial.write(40); delay(800); MySerial.write(124); MySerial.write(0x02);//Set Backlight Duty Cycle. MySerial.write(byte(0)); delay(2000); MySerial.write(124); MySerial.write(0x02);//Set Backlight Duty Cycle. MySerial.write(100); }//end of setup() void loop() { //Empty loop() }
The above Arduino code to drive a Sparkfun graphics and text LCD backpack is discussed in detail on the page the link takes you to.
Page WILL BE tested for compliance with INDUSTRY (not MS-only) standards, using the free, publicly accessible validator at validator.w3.org
....... P a g e . . . E n d s .....