Professional Documents
Culture Documents
Using Displays
11.0 Introduction
/LTXLGFU\VWDOGLVSOD\V/&'VRIIHUDFRQYHQLHQWDQGLQH[SHQVLYHZD\WRSURYLGHDXVHU
LQWHUIDFHIRUDSURMHFW7KLVFKDSWHUH[SODLQVKRZWRFRQQHFWDQGXVHFRPPRQWH[WDQG
JUDSKLFDO/&'SDQHOVZLWK$UGXLQR%\IDUWKHPRVWSRSXODU/&'LVWKHWH[WSDQHO
EDVHGRQWKH+LWDFKL+'FKLS7KLVGLVSOD\VWZRRUIRXUOLQHVRIWH[WZLWKRU
FKDUDFWHUVSHUOLQHDQGFKDUDFWHUYHUVLRQVDUHDYDLODEOHEXWXVXDOO\DWPXFK
KLJKHUSULFHV$OLEUDU\IRUGULYLQJWH[W/&'GLVSOD\VLVSURYLGHGZLWK$UGXLQRDQG
\RX FDQ SULQW WH[W RQ \RXU /&' DV HDVLO\ DV RQ WKH 6HULDO 0RQLWRU VHH &KDSWHU
EHFDXVH/&'DQGVHULDOVKDUHWKHVDPHXQGHUO\LQJprintIXQFWLRQV
/&'VFDQGRPRUHWKDQGLVSOD\VLPSOHWH[WZRUGVFDQEHVFUROOHGRUKLJKOLJKWHGDQG
\RXFDQGLVSOD\DVHOHFWLRQRIVSHFLDOV\PEROVDQGQRQ(QJOLVKFKDUDFWHUV
<RXFDQFUHDWH\RXURZQV\PEROVDQGEORFNJUDSKLFVZLWKDWH[W/&'EXWLI\RXZDQW
ILQHJUDSKLFDOGHWDLO\RXQHHGDJUDSKLFDOGLVSOD\*UDSKLFDO/&'*/&'GLVSOD\V
DUHDYDLODEOHDWDVPDOOSULFHSUHPLXPRYHUWH[WGLVSOD\VDQGPDQ\SRSXODU*/&'
SDQHOVFDQGLVSOD\XSWRHLJKWOLQHVRIWH[WFKDUDFWHUVLQDGGLWLRQWRJUDSKLFV
/&'GLVSOD\VKDYHPRUHZLUHVFRQQHFWLQJWR$UGXLQRWKDQPRVWRWKHUUHFLSHVLQWKLV
ERRN,QFRUUHFWFRQQHFWLRQVDUHWKHPDMRUFDXVHRISUREOHPVZLWK/&'VVRWDNH\RXU
WLPHZLULQJWKLQJVXSDQGWULSOHFKHFNWKDWWKLQJVDUHFRQQHFWHGFRUUHFWO\$QLQH[
SHQVLYHPXOWLPHWHUFDSDEOHRIPHDVXULQJYROWDJHDQGUHVLVWDQFHLVDELJKHOSIRUYHUL
I\LQJWKDW\RXUZLULQJLVFRUUHFW,WFDQVDYH\RXDORWRIKHDGVFUDWFKLQJLIQRWKLQJLV
EHLQJGLVSOD\HG<RXGRQWQHHGDQ\WKLQJIDQF\DVHYHQWKHFKHDSHVWPXOWLPHWHUZLOO
KHOS\RXYHULI\WKDWWKHFRUUHFWSLQVDUHFRQQHFWHGDQGWKDWWKHYROWDJHVDUHFRUUHFW
<RXFDQHYHQILQGDYLGHRWXWRULDODQG3')H[SODLQLQJKRZWRXVHDPXOWLPHWHUDWKWWS
EORJPDNH]LQHFRPDUFKLYHPXOWLPHWHUBWXWRULDOBPDNHBKWPO
)RUSURMHFWVWKDWUHTXLUHDELJJHUGLVSOD\WKDQDYDLODEOHLQLQH[SHQVLYH/&'SDQHOV
5HFLSHVKRZVKRZ\RXFDQXVHDWHOHYLVLRQDVDQRXWSXWGHYLFHIRU$UGXLQR
333
11.1 Connecting and Using a Text LCD Display
Problem
<RXKDYHDWH[W/&'EDVHGRQWKHLQGXVWU\VWDQGDUG+'RUDFRPSDWLEOHFRQ
WUROOHUFKLSDQG\RXZDQWWRGLVSOD\WH[WDQGQXPHULFYDOXHV
Solution
7KH$UGXLQRVRIWZDUHLQFOXGHVWKH/LTXLG&U\VWDOOLEUDU\IRUGULYLQJ/&'GLVSOD\VEDVHG
RQWKH+'FKLS
0RVWWH[W/&'VVXSSOLHGIRUXVHZLWK$UGXLQRZLOOEHFRPSDWLEOHZLWK
WKH+LWDFKL+'FRQWUROOHU,I\RXDUHQRWVXUHDERXW\RXUFRQ
WUROOHUFKHFNWKHGDWDVKHHWWRVHHLILWLVDRUFRPSDWLEOH
7RJHWWKHGLVSOD\ZRUNLQJ\RXQHHGWRZLUHWKHSRZHUGDWDDQGFRQWUROSLQV&RQQHFW
WKHGDWDDQGVWDWXVOLQHVWRGLJLWDORXWSXWSLQVDQGZLUHXSDFRQWUDVWSRWHQWLRPHWHU
DQGFRQQHFWWKHSRZHUOLQHV,I\RXUGLVSOD\KDVDEDFNOLJKWWKLVQHHGVFRQQHFWLQJ
XVXDOO\WKURXJKDUHVLVWRU
)LJXUHVKRZVWKHPRVWFRPPRQ/&'FRQQHFWLRQV,WVLPSRUWDQWWRFKHFNWKH
GDWD VKHHW IRU \RXU /&' WR YHULI\ WKH SLQ FRQQHFWLRQV 7DEOH VKRZV WKH PRVW
FRPPRQSLQFRQQHFWLRQVEXWLI\RXU/&'XVHVGLIIHUHQWSLQVPDNHVXUHLWLVFRPSDW
LEOHZLWKWKH+LWDFKL+'WKLVUHFLSHZLOORQO\ZRUNRQ/&'GLVSOD\VWKDWDUH
FRPSDWLEOH ZLWK WKDW FKLS 7KH /&' ZLOO KDYH SLQV RU SLQV LI WKHUH LV QR
EDFNOLJKWPDNHVXUH\RXLGHQWLI\SLQRQ\RXUSDQHOLWPD\EHLQDGLIIHUHQWSRVLWLRQ
WKDQVKRZQLQWKHILJXUH
<RXPD\ZRQGHUZK\/&'SLQVWKURXJKDUHQRWFRQQHFWHG7KH
/&'GLVSOD\FDQEHFRQQHFWHGXVLQJHLWKHUIRXUSLQVRUHLJKWSLQVIRU
GDWDWUDQVIHU7KLVUHFLSHXVHVWKHIRXUSLQPRGHEHFDXVHWKLVIUHHVXS
WKHRWKHUIRXU$UGXLQRSLQVIRURWKHUXVHV7KHUHLVDWKHRUHWLFDOSHU
IRUPDQFHLPSURYHPHQWXVLQJHLJKWSLQVEXWLWVLQVLJQLILFDQWDQGQRW
ZRUWKWKHORVVRIIRXU$UGXLQRSLQV
void setup()
{
lcd.begin(numCols, numRows);
lcd.print("hello, world!"); // Print a message to the LCD.
}
void loop()
{
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
5XQWKHVNHWFK\RXVKRXOGVHHKHOORZRUOGGLVSOD\HGRQWKHILUVWOLQHRI\RXU/&'
7KHVHFRQGOLQHZLOOGLVSOD\DQXPEHUWKDWLQFUHDVHVE\RQHHYHU\VHFRQG
Discussion
,I\RXGRQWVHHDQ\WH[WDQG\RXKDYHGRXEOHFKHFNHGWKDWDOOZLUHVDUHFRQQHFWHG
FRUUHFWO\\RXPD\QHHGWRDGMXVWWKHFRQWUDVWSRW:LWKWKHSRWVKDIWURWDWHGWRRQH
VLGHXVXDOO\WKHVLGHFRQQHFWHGWR*QG\RXZLOOKDYHPD[LPXPFRQWUDVWDQGVKRXOG
VHHEORFNVDSSHDULQDOOWKHFKDUDFWHUSRVLWLRQV:LWKWKHSRWURWDWHGWRWKHRWKHUH[
WUHPH\RXSUREDEO\ZRQWVHHDQ\WKLQJDWDOO7KHFRUUHFWVHWWLQJZLOOGHSHQGRQPDQ\
IDFWRUVLQFOXGLQJYLHZLQJDQJOHDQGWHPSHUDWXUHWXUQWKHSRWXQWLO\RXJHWWKHEHVW
ORRNLQJGLVSOD\
,I\RXFDQWVHHEORFNVRISL[HOVDSSHDUDWDQ\VHWWLQJRIWKHSRWFKHFNWKDWWKH/&'LV
EHLQJGULYHQRQWKHFRUUHFWSLQV
2QFH\RXFDQVHHWH[WRQWKHVFUHHQXVLQJWKH/&'LQDVNHWFKLVHDV\<RXXVHVLPLODU
SULQW FRPPDQGV WR WKRVH IRU VHULDO SULQWLQJ FRYHUHG LQ &KDSWHU 7KH QH[W UHFLSH
UHYLHZVWKHSULQWFRPPDQGVDQGH[SODLQVKRZWRFRQWUROWH[WSRVLWLRQ
See Also
/LTXLG&U\VWDOUHIHUHQFHKWWSDUGXLQRFFHQ5HIHUHQFH/LTXLG&U\VWDO3ULQW
6HH&KDSWHUIRUGHWDLOVRQprintFRPPDQGV
7KHGDWDVKHHWIRUWKH+LWDFKL+'/&'FRQWUROOHULVWKHGHILQLWLYHUHIHUHQFHIRU
GHWDLOHGORZOHYHOIXQFWLRQDOLW\7KH$UGXLQROLEUDU\LQVXODWHV\RXIURPPRVWRIWKH
FRPSOH[LW\EXWLI\RXZDQWWRUHDGDERXWWKHUDZFDSDELOLWLHVRIWKHFKLS\RXFDQ
GRZQORDG WKH GDWD VKHHW IURP KWWSZZZVSDUNIXQFRPGDWDVKHHWV/&'+'
SGI
7KH/&'SDJHLQWKH$UGXLQR3OD\JURXQGFRQWDLQVVRIWZDUHDQGKDUGZDUHWLSVDQG
OLQNVKWWSZZZDUGXLQRFFSOD\JURXQG&RGH/&'
int count;
void setup()
{
lcd.begin(numCols, numRows);
lcd.print("Starting in "); // this string is 12 characters long
for(int i=9; i > 0; i--) // count down from 9
{
// the top line is row 0
lcd.setCursor(12,0); // move the cursor to the end of the string
printed above
lcd.print(i);
delay(1000);
}
}
void loop()
{
int columnWidth = 4; //spacing for the columns
int displayColumns = 3; //how many columns of numbers
lcd.clear();
for( int col=0; col < displayColumns; col++)
{
lcd.setCursor(col * columnWidth, 0);
count = count+ 1;
lcd.print(count);
}
delay(1000);
}
lcd.setCursor(12,0) HQVXUHV WKDW HDFK QXPEHU LV SULQWHG LQ WKH VDPH SRVLWLRQ WKH
WKLUWHHQWKFROXPQILUVWURZSURGXFLQJWKHGLJLWVKRZQDWDIL[HGSRVLWLRQUDWKHUWKDQ
HDFKQXPEHUEHLQJGLVSOD\HGDIWHUWKHSUHYLRXVQXPEHU
5RZV DQG FROXPQV VWDUW IURP ]HUR VR setCursor(4,0) ZRXOG VHW WKH
FXUVRUWRWKHILIWKFROXPQRQWKHILUVWURZ7KLVLVEHFDXVHWKHUHDUHILYH
FKDUDFWHUVORFDWHGLQSRVLWLRQVWKURXJK,IWKDWLVQRWFOHDULWPD\
KHOS\RXLI\RXFRXQWWKLVRXWRQ\RXUILQJHUVVWDUWLQJIURP]HUR
7KH IROORZLQJ OLQHV XVH setCursor WR VSDFH RXW WKH VWDUW RI HDFK FROXPQ WR SURYLGH
columnwidthVSDFHVIURPWKHVWDUWRIWKHSUHYLRXVFROXPQ
lcd.setCursor(col * columnWidth, 0);
count = count+ 1;
lcd.print(count);
lcd.clear();
lcd.clearFOHDUVWKHVFUHHQDQGPRYHVWKHFXUVRUEDFNWRWKHWRSOHIWFRUQHU
+HUH LV D YDULDWLRQ RQ loop WKDW GLVSOD\V QXPEHUV XVLQJ DOO WKH URZV RI \RXU /&'
5HSODFH\RXU loopFRGHZLWKWKHIROORZLQJPDNHVXUH\RXVHWnumRowsDQG numColsDW
WKHWRSRIWKHVNHWFKWRPDWFKWKHURZVDQGFROXPQVLQ\RXU/&'
void loop()
{
int columnWidth = 4;
int displayColumns = 3;
lcd.clear();
for(int row=0; row < numRows; row++)
{
for( int col=0; col < displayColumns; col++)
7KH ILUVW for ORRS VWHSV WKURXJK WKH DYDLODEOH URZV DQG WKH VHFRQG for ORRS VWHSV
WKURXJKWKHFROXPQV
7R DGMXVW KRZ PDQ\ QXPEHUV DUH GLVSOD\HG LQ D URZ WR ILW WKH /&' FDOFXODWH WKH
displayColumnsYDOXHUDWKHUWKDQVHWWLQJLW&KDQJH
int displayColumns = 3;
WR
int displayColumns = numCols / columnWidth;
See Also
7KH/LTXLG&U\VWDOOLEUDU\WXWRULDOKWWSDUGXLQRFFHQ5HIHUHQFH/LTXLG&U\VWDO"IURP
7XWRULDO/&'/LEUDU\
Solution
7KLVVNHWFKVKRZVKRZ\RXFDQFDXVHWKHFXUVRUDIODVKLQJEORFNDWWKHSRVLWLRQZKHUH
WKHQH[WFKDUDFWHUZLOOEHGLVSOD\HGWREOLQN,WDOVRLOOXVWUDWHVKRZWRWXUQWKHGLVSOD\
RQDQGRIIIRUH[DPSOHWRGUDZDWWHQWLRQE\EOLQNLQJWKHHQWLUHGLVSOD\
/*
blink
*/
void setup()
{
// set up the LCD's number of columns and rows and:
lcd.begin(16, 2);
void loop()
{
lcd.setCursor(0, 1);
lcd.print("cursor blink");
lcd.blink();
delay(2000);
lcd.noBlink();
lcd.print(" noBlink");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" display flash !");
displayBlink(2, 250); // blink twice
displayBlink(2, 500); // and again for twice as long
lcd.clear();
}
Discussion
7KHVNHWFKFDOOVblinkDQGnoBlinkIXQFWLRQVWRWRJJOHFXUVRUEOLQNLQJRQDQGRII
7KHFRGHWREOLQNWKHHQWLUHGLVSOD\LVLQDIXQFWLRQQDPHG displayBlinkWKDWPDNHV
WKHGLVSOD\IODVKDVSHFLILHGQXPEHURIWLPHV7KHIXQFWLRQXVHV lcd.display()DQG
lcd.noDisplay()WRWXUQWKHGLVSOD\WH[WRQDQGRIIZLWKRXWFOHDULQJLWIURPWKHVFUHHQV
LQWHUQDOPHPRU\
Solution
7KLVVNHWFKGHPRQVWUDWHVERWKlcd.ScrollDisplayLeftDQGlcd.ScrollDisplayRight
,WVFUROOVDOLQHRIWH[WWRWKHOHIWZKHQWLOWHGDQGWRWKHULJKWZKHQQRWWLOWHG&RQQHFW
RQHVLGHRIDWLOWVHQVRUWRSLQDQGWKHRWKHUSLQWR*QGVHH5HFLSHLI\RXDUHQRW
IDPLOLDUZLWKWLOWVHQVRUV
/*
Scroll
* this sketch scrolls text left when tilted
* text scrolls right when not tilted.
*/
#include <LiquidCrystal.h>
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(numCols, numRows);
digitalWrite(tiltPin, HIGH); // turn on pull-ups for the tilt sensor
lcd.print(textString);
}
void loop()
{
if(digitalRead(tiltPin) == LOW && isTilted == false )
{
// here if tilted left so scroll text left
isTilted = true;
for (int position = 0; position < textLen; position++)
{
lcd.scrollDisplayLeft();
delay(150);
}
Discussion
7KHILUVWKDOIRIWKH loopFRGHKDQGOHVWKHFKDQJHIURPQRWWLOWHGWRWLOWHG7KHFRGH
FKHFNVWRVHHLIWKHWLOWVZLWFKLVFORVHGLOWRURSHQHIGH,ILWVLOWDQGWKHFXUUHQW
VWDWHVWRUHGLQWKHisTiltedYDULDEOHLVQRWWLOWHGWKHWH[WLVVFUROOHGOHIW7KHGHOD\LQ
WKHforORRSFRQWUROVWKHVSHHGRIWKHVFUROODGMXVWWKHGHOD\LIWKHWH[WPRYHVWRRIDVW
RUWRRVORZ
7KHVHFRQGKDOIRIWKHFRGHXVHVVLPLODUORJLFWRKDQGOHWKHFKDQJHIURPWLOWHGWRQRW
WLOWHG
$VFUROOLQJFDSDELOLW\LVSDUWLFXODUO\XVHIXOZKHQ\RXQHHGWRGLVSOD\PRUHWH[WWKDQ
FDQILWRQDQ/&'OLQH
7KLVVNHWFKKDVDmarqueeIXQFWLRQWKDWZLOOVFUROOWH[WXSWRFKDUDFWHUVLQOHQJWK
/*
Marquee
* this sketch scrolls a long line of text
*/
#include <LiquidCrystal.h>
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(numCols, numRows);
}
void loop()
{
marquee("A message too long to fit !");
delay(1000);
lcd.clear();
}
7KHVNHWFKXVHVWKHlcd.scrollDisplayLeftIXQFWLRQWRVFUROOWKHGLVSOD\ZKHQWKHWH[W
LVORQJHUWKDQWKHZLGWKRIWKHVFUHHQ
7KH/&'FKLSKDVLQWHUQDOPHPRU\WKDWVWRUHVWKHWH[W7KLVPHPRU\LVOLPLWHG
E\WHVRQPRVWIRXUOLQHGLVSOD\V,I\RXWU\WRXVHORQJHUPHVVDJHVWKH\PD\VWDUWWR
ZUDSRYHUWKHPVHOYHV,I\RXZDQWWRVFUROOORQJHUPHVVDJHVHJDWZHHWRUFRQWURO
VFUROOLQJPRUHSUHFLVHO\\RXQHHGDGLIIHUHQWWHFKQLTXH7KHIROORZLQJIXQFWLRQVWRUHV
WKHWH[WLQ5$0RQ$UGXLQRDQGVHQGVVHFWLRQVWRWKHVFUHHQWRFUHDWHWKHVFUROOLQJ
HIIHFW7KHVHPHVVDJHVFDQEHDQ\OHQJWKWKDWFDQILWLQWR$UGXLQRPHPRU\
// this version of marquee uses manual scrolling for very long messages
void marquee( char *text)
{
int length = strlen(text); // the number of characters in the text
if(length < numCols)
lcd.print(text);
else
{
int pos;
for( pos = 0; pos < numCols; pos++)
lcd.print(text[pos]);
delay(1000); // allow time to read the first line before scrolling
while(pos <= length - numCols)
{
lcd.setCursor(0,0);
for( int i=0; i < numCols; i++)
lcd.print(text[pos+i]);
delay(300);
pos = pos + 1;
}
Solution
,GHQWLI\WKHFKDUDFWHUFRGH\RXZDQWWRGLVSOD\E\ORFDWLQJWKHV\PEROLQWKHFKDUDFWHU
SDWWHUQ WDEOH LQ WKH /&' GDWD VKHHW 7KLV VNHWFK SULQWV VRPH FRPPRQ V\PEROV LQ
setup,WWKHQVKRZVDOOGLVSOD\DEOHV\PEROVLQloop
/*
LiquidCrystal Library - Special Chars
*/
#include <LiquidCrystal.h>
//set constants for number of rows and columns to match your LCD
const int numRows = 2;
const int numCols = 16;
void setup()
{
lcd.begin(numRows, numCols);
showSymbol(degreeSymbol, "degrees");
showSymbol (piSymbol, "pi");
showSymbol(centsSymbol, "cents");
showSymbol(sqrtSymbol, "sqrt");
showSymbol(omegaSymbol, "ohms");
lcd.clear();
void calculatePosition()
{
col = col + 1;
if( col == numCols)
{
col = 0;
row = row + 1;
if( row == numRows)
{
row = 0;
delay(2000); // pause
lcd.clear();
}
lcd.setCursor(col, row);
}
}
Discussion
$WDEOHVKRZLQJWKHDYDLODEOHFKDUDFWHUSDWWHUQVLVLQWKHGDWDVKHHWIRUWKH/&'FRQ
WUROOHUFKLS\RXFDQILQGLWRQSDJHRIWKHGDWDVKHHWDWKWWSZZZVSDUNIXQFRP
GDWDVKHHWV/&'+'SGI
7RXVHWKHWDEOHORFDWHWKHV\PERO\RXZDQWWRGLVSOD\7KHFRGHIRUWKDWFKDUDFWHULV
GHWHUPLQHGE\FRPELQLQJWKHELQDU\YDOXHVIRUWKHFROXPQDQGURZIRUWKHGHVLUHG
V\PEROVHH)LJXUH
6HH5HFLSHLI\RXQHHGDUHIUHVKHURQXVLQJFKDUDFWHUVWULQJVDQGSDVVLQJWKHPWR
IXQFWLRQV
See Also
'DWD VKHHW IRU +LWDFKL +' GLVSOD\ KWWSZZZVSDUNIXQFRPGDWDVKHHWV/&'
+'SGI
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte happy[8] =
{
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
B00000
};
byte saddy[8] =
{
B00000,
B10001,
B00000,
B00000,
B01110,
B10001,
B00000,
B00000
};
void setup() {
lcd.createChar(0, happy);
lcd.createChar(1, saddy);
lcd.begin(16, 2);
void loop() {
for (int i=0; i<2; i++)
{
lcd.setCursor(0,0);
lcd.write(i);
delay(500);
}
}
)LJXUH'HILQLQJFXVWRPFKDUDFWHUV
7KHIROORZLQJOLQHLQsetupFUHDWHVWKHFKDUDFWHUXVLQJGDWDGHILQHGLQWKHhappyDUUD\
WKDWLVDVVLJQHGWRFKDUDFWHU
lcd.createChar(0, happy);
7RSULQWWKHFXVWRPFKDUDFWHUWRWKHVFUHHQ\RXZRXOGXVHWKLVOLQH
lcd.write(0);
&RGH LQ WKH for ORRS VZLWFKHV EHWZHHQ FKDUDFWHU DQG FKDUDFWHU WR SURGXFH DQ
DQLPDWLRQ
#include <LiquidCrystal.h>
byte glyphs[5][8] = {
{ B11111,B11111,B00000,B00000,B00000,B00000,B00000,B00000 } ,
{ B00000,B00000,B00000,B00000,B00000,B00000,B11111,B11111 } ,
{ B11111,B11111,B00000,B00000,B00000,B00000,B11111,B11111 } ,
{ B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111 } ,
{ B00000,B00000,B00000,B00000,B00000,B01110,B01110,B01110 } };
void setup ()
{
lcd.begin(20,4);
// create the custom glyphs
for(int i=0; i < 5; i++)
lcd.createChar(i, glyphs[i]); // create the 5 custom glyphs
itoa(value, buffer, 10); // see Recipe 2.8 for more on using itoa
// dislay each digit in sequence
for(index = 0; index < 10; index++) // display up to ten digits
{
char c = buffer[index];
if( c == 0) // check for null (not the same as '0')
return; // the end of string character is a null, see Chapter 2
c = c - 48; // convert ascii value to a numeric value (see Recipe 2.9)
showDigit(c, position + index);
}
}
Discussion
7KH/&'GLVSOD\KDVIL[HGVL]HFKDUDFWHUVEXW\RXFDQFUHDWHODUJHUV\PEROVE\FRP
ELQLQJFKDUDFWHUV7KLVUHFLSHFUHDWHVILYHFXVWRPFKDUDFWHUVXVLQJWKHWHFKQLTXHGH
VFULEHGLQ5HFLSH7KHVHV\PEROVVHH)LJXUHFDQEHFRPELQHGWRFUHDWH
GRXEOHVL]HGGLJLWVVHH)LJXUH7KHVNHWFKGLVSOD\VDFRXQWGRZQIURPWRRQ
WKH/&'XVLQJWKHELJGLJLWV,WWKHQGLVSOD\VWKHQXPEHURIVHFRQGVVLQFHWKHVNHWFK
VWDUWHG
7KH glyphsDUUD\GHILQHVSL[HOVIRUWKHILYHFXVWRPFKDUDFWHUV7KHDUUD\KDVWZRGL
PHQVLRQVJLYHQLQWKHVTXDUHEUDFNHWV
byte glyphs[5][8] = {
[5]LVWKHQXPEHURIJO\SKVDQG[8]LVWKHQXPEHURIURZVLQHDFKJO\SK(DFKHOHPHQW
FRQWDLQVVDQGVWRLQGLFDWHZKHWKHUDSL[HOLVRQRURIILQWKDWURZ,I\RXFRPSDUH
)LJXUH7HQELJGLJLWVFRPSRVHGRIFXVWRPJO\SKV
WKHYDOXHVLQglyph[0]WKHILUVWJO\SKZLWK)LJXUH\RXFDQVHHWKDWWKHVFRUUH
VSRQGWRGDUNSL[HOV
{ B11111,B11111,B00000,B00000,B00000,B00000,B00000,B00000 } ,
(DFKELJQXPEHULVEXLOWIURPVL[RIWKHVHJO\SKVWKUHHIRUPLQJWKHXSSHUKDOIRIWKH
ELJGLJLWDQGWKUHHIRUPLQJWKHORZHUKDOI bigDigitsTopDQG bigDigitsBotDUHDUUD\V
GHILQLQJZKLFKFXVWRPJO\SKLVXVHGIRUWKHWRSDQGERWWRPURZVRQWKH/&'VFUHHQ
See Also
6HH&KDSWHUIRULQIRUPDWLRQRQVHJPHQW/('GLVSOD\VLI\RXQHHGUHDOO\ELJQX
PHUDOV1RWHWKDWVHJPHQWGLVSOD\VFDQJLYH\RXGLJLWVL]HVIURPRQHKDOILQFKWRWZR
LQFKHVRUPRUH7KH\FDQXVHPXFKPRUHSRZHUWKDQ/&'GLVSOD\VDQGGRQWSUHVHQW
OHWWHUVDQGV\PEROVYHU\ZHOOEXWWKH\DUHDJRRGFKRLFHLI\RXQHHGVRPHWKLQJELJ
)LJXUH(LJKWFXVWRPFKDUDFWHUVXVHGWRIRUPYHUWLFDOEDUV
7KHVHV\PEROVDUHXVHGWRGUDZEDUFKDUWVDVVKRZQLQWKHVNHWFKWKDWIROORZV
/*
* customCharPixels
*/
#include <LiquidCrystal.h>
//set constants for number of rows and columns to match your LCD
const int numRows = 2;
const int numCols = 16;
byte glyphs[8][8] = {
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B11111}, // 0
{B00000,B00000,B00000,B00000,B00000,B00000,B11111,B11111}, // 1
{B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111}, // 2
{B00000,B00000,B00000,B00000,B11111,B11111,B11111,B11111}, // 3
{B00000,B00000,B00000,B11111,B11111,B11111,B11111,B11111}, // 4
{B00000,B00000,B11111,B11111,B11111,B11111,B11111,B11111}, // 5
{B00000,B11111,B11111,B11111,B11111,B11111,B11111,B11111}, // 6
{B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}}; // 7
void setup ()
{
lcd.begin(numCols, numRows);
for(int i=0; i < 8; i++)
lcd.createChar(i, glyphs[i]); // create the custom glyphs
lcd.clear();
}
Discussion
7KHVNHWFKFUHDWHVHLJKWFKDUDFWHUVHDFKDVLQJOHSL[HOKLJKHUWKDQWKHSUHYLRXVRQH
VHH)LJXUH7KHVHDUHGLVSOD\HGLQVHTXHQFHRQWKHWRSURZRIWKH/&'7KHVH
EDUFKDUWFKDUDFWHUVFDQEHXVHGWRGLVSOD\YDOXHVLQ\RXUVNHWFKWKDWFDQEHPDSSHG
WRDUDQJHIURPWR)RUH[DPSOHWKHIROORZLQJZLOOGLVSOD\DYDOXHUHDGIURPDQDORJ
LQSXW
int value = analogRead(0);
byte glyph = map(value, 0, 1023,0,8);// returns a proportional value
from 0 through 7
lcd.print(glyph);
<RXFDQVWDFNWKHEDUVIRUJUHDWHUUHVROXWLRQ7KHdoubleHeightBarsIXQFWLRQVKRZQLQ
WKHIROORZLQJFRGHGLVSOD\VDYDOXHIURPWRZLWKDUHVROXWLRQRISL[HOVXVLQJ
WZROLQHVRIWKHGLVSOD\
void doubleHeightBars(int value, int column)
{
char upperGlyph;
char lowerGlyph;
if(value < 8)
{
upperGlyph = ' '; // no pixels lit
lowerGlyph = value;
}
else
{
upperGlyph = value - 8;
lowerGlyph = 7; // all pixels lit
}
7KHdoubleHeightBarsIXQFWLRQFDQEHXVHGDVIROORZVWRGLVSOD\WKHYDOXHRIDQDQDORJ
LQSXW
for( int i=0; i < 16; i++)
{
,I\RXZDQWKRUL]RQWDOEDUV\RXFDQGHILQHILYHFKDUDFWHUVHDFKDVLQJOHSL[HOZLGHU
WKDQWKHSUHYLRXVRQHDQGXVHVLPLODUORJLFWRWKHYHUWLFDOEDUVWRFDOFXODWHWKHFKDUDFWHU
WRVKRZ
$PRUHFRPSOH[H[DPSOHRIWKLVWHFKQLTXHFDQEHIRXQGLQDVNHWFKLPSOHPHQWLQJWKH
ZHOONQRZQFRPSXWHUVLPXODWLRQNQRZQDV-RKQ&RQZD\V*DPHRI/LIH7KHVNHWFK
FDQEHGRZQORDGHGIURPWKLVERRNVZHEVLWH
Solution
7KLV6ROXWLRQXVHVWKH$UGXLQR*/&'OLEUDU\WRFRQWUROWKHGLVSOD\<RXFDQGRZQORDG
LWIURPKWWSZZZDUGXLQRFFSOD\JURXQG&RGH*/&'NVVHH&KDSWHULI\RX
QHHGKHOSLQVWDOOLQJOLEUDULHV
7KHUHDUHPDQ\GLIIHUHQWW\SHVRI*/&'FRQWUROOHUVVRFKHFNWKDW\RXUV
LVD.6RUFRPSDWLEOH
7KHSLQFRQQHFWLRQVIRU*/&'GLVSOD\VDUHQRWVWDQGDUGL]HGDQGLWLVLPSRUWDQWWR
FKHFNWKHGDWDVKHHWIRU\RXUSDQHOWRFRQILUPKRZLWVKRXOGEHZLUHG,QFRUUHFWFRQ
QHFWLRQVRIWKHVLJQDOOLQHVDUHWKHPRVWFRPPRQFDXVHRISUREOHPVDQGSDUWLFXODUFDUH
VKRXOGEHWDNHQZLWKWKHSRZHUOHDGVDVZLULQJWKHVHLQFRUUHFWO\FDQGHVWUR\DSDQHO
0RVW*/&'SDQHOVUHTXLUHDQH[WHUQDOYDULDEOHUHVLVWRUWRVHWWKH/&'ZRUNLQJYROWDJH
FRQWUDVWDQGPD\UHTXLUHDIL[HGUHVLVWRUWROLPLWWKHFXUUHQWLQWKHEDFNOLJKW7KH
GDWDVKHHWIRU\RXUSDQHOVKRXOGSURYLGHVSHFLILFLQIRUPDWLRQRQWKHZLULQJDQGFKRLFH
RIFRPSRQHQWVIRUWKLV
)LJXUH*/&'ZLULQJIRUW\SH$SDQHOVFKHFN\RXUGDWDVKHHWIRUSLQRXW
:LULQJWKHSDQHOXVLQJWKHGHIDXOWFRQILJXUDWLRQDQGUXQQLQJWKHVNHWFK
LQWKLVUHFLSHHQDEOHV\RXWRWHVWWKDWHYHU\WKLQJLVZRUNLQJEHIRUH\RX
PRGLI\WKHFRQILJXUDWLRQ$FRQILJXUDWLRQWKDWGRHVQRWPDWFKWKHZLU
LQJLVWKHPRVWFRPPRQVRXUFHRISUREOHPVVRWHVWLQJZLWKPLQLPDO
FKDQJHVPDNHVLWPRUHOLNHO\WKDWWKLQJVZLOOZRUNWKHILUVWWLPH
7KHIROORZLQJVNHWFKSULQWVVRPHWH[WDQGWKHQGUDZVVRPHJUDSKLFDOREMHFWV
/*
glcd
*/
#include <glcd.h>
int count = 0;
void setup()
{
GLCD.Init(NON_INVERTED); // initialize the library
GLCD.ClearScreen();
GLCD.SelectFont(System5x7); // select fixed width system font
GLCD.print("hello world"); // print a message
delay(3000);
}
GLCD.ClearScreen();
GLCD.DrawRect(0, 0, 64, 61, BLACK); // rectangle in left side of screen
// rounded rectangle around text area
GLCD.DrawRoundRect(68, 0, 58, 61, 5, BLACK);
for(int i=0; i < 62; i += 4)
{
// draw lines from upper left down right side of rectangle
GLCD.DrawLine(1,1,63,i, BLACK);
}
GLCD.DrawCircle(32,31,30,BLACK); // circle centered on left side of screen
GLCD.FillRect(92,40,16,16, WHITE); // clear previous spinner position
GLCD.CursorTo(5,5); // locate cursor for printing text
GLCD.PrintNumber(count); // print a number at current cursor position
count = count + 1;
delay(1000);
}
Discussion
7KHOLEUDU\SURYLGHVDZLGHUDQJHRIEDVLFKLJKOHYHOJUDSKLFDOGUDZLQJIXQFWLRQVVRPH
RIZKLFKDUHGHPRQVWUDWHGLQWKLVVNHWFK$OOWKHIXQFWLRQVDUHGHVFULEHGLQWKHGRFX
PHQWDWLRQSURYLGHGZLWKWKHOLEUDU\
*UDSKLFDQGWH[WVFUHHQFRRUGLQDWHVVWDUWDWLQWKHWRSOHIWKDQGFRUQHU0RVWSRS
XODU*/&'SDQHOVDUHSL[HOVDQGWKHOLEUDU\XVHVWKLVUHVROXWLRQE\GHIDXOW
,I\RXUVFUHHQLVDGLIIHUHQWUHVROXWLRQ\RXZLOOQHHGWRHGLWWKHFRQILJXUDWLRQILOHLQWKH
OLEUDU\WRPDWFK\RXUSDQHOXSWRSL[HOSDQHOVDUHFXUUHQWO\VXSSRUWHG
*/&'HQDEOHVSULQWLQJWH[WWRWKHVFUHHQXVLQJVWDWHPHQWVVLPLODUWR$UGXLQRSULQW
FRPPDQGVXVHGIRUSULQWLQJWRWKHVHULDOSRUW,QDGGLWLRQ\RXFDQVSHFLI\WKHW\SHDQG
VL]HRIIRQW<RXFDQDOVRVSHFLI\DQDUHDRIWKHVFUHHQWKDWFDQEHXVHGDVDWH[WZLQGRZ
7KLVHQDEOHV\RXWRGHILQHDQDUHDRQWKHVFUHHQDQGWKHQVHQGWH[WWRWKDWDUHDSUR
YLGLQJ\RXZLWKDYLUWXDOWHUPLQDOWKDWZLOOFRQWDLQDQGVFUROOWH[WZLWKLQWKHERXQGV
\RXGHILQH)RULQVWDQFHWKHIROORZLQJFRGHFUHDWHVDQDUHDSL[HOVVTXDUHLQWKH
FHQWHURIWKHVFUHHQ
gText myTextArea = gText(GLCD.CenterX-16, GLCD.CenterY -16, GLCD.CenterX +16,
GLCD.CenterY+16);
<RXFDQVHOHFWDIRQWDQGSULQWWRWKHWH[WDUHDXVLQJFRGHVXFKDVWKHIROORZLQJ
myTextArea.SelectFont(System5x7); // select the system font for the text area
name textTop
myTextArea.println("Go"); // print a line of text to the text area.
7KHH[DPSOHVNHWFKVXSSOLHGZLWKWKHOLEUDU\GRZQORDGKDVDGHPRWKDWVKRZVKRZ
PXOWLSOHWH[WDUHDVFDQEHXVHGDORQJZLWKJUDSKLFDOGUDZLQJV
Solution
<RXFDQXVHELWPDSVGLVWULEXWHGZLWKWKHOLEUDU\RUFUHDWH\RXURZQ%LWPDSVDUHGH
ILQHG LQ KHDGHU ILOHV ZLWK DQ H[WHQVLRQ RI K IRU H[DPSOH DQ $UGXLQR LFRQ LPDJH
QDPHG$UGXLQL,FRQKLVVWRUHGLQWKHELWPDSIROGHURIWKH*/&'OLEUDU\GLUHFWRU\7KLV
IROGHU DOVR FRQWDLQV D ILOH QDPHG DOO%LWPDSVK WKDW KDV GHWDLOV RI DOO WKH GLVWULEXWHG
ELWPDSVVR\RXFDQLQFOXGHWKLVWRPDNHDOOWKHVXSSOLHGRUQHZO\FUHDWHGELWPDSV
DYDLODEOH
#include "bitmaps/allBitmaps.h" // this line includes all distributed bitmaps
1RWHWKDWLQFOXGLQJDOOWKHELWPDSVZLOOQRWFRQVXPHDQ\PHPRU\LIWKH\DUHQRWH[
SOLFLWO\UHIHUHQFHGLQ\RXUVNHWFKZLWKWKHDrawBitmapIXQFWLRQ
7RHQDEOH\RXWRDGG\RXURZQELWPDSVWKH*/&'OLEUDU\LQFOXGHVDXWLOLW\FDOOHG
JOFG0DNH%LWPDSZKLFKFRQYHUWVDJLIMSJEPSWJDRUSQJILOHWRDKHDGHUILOHWKDW
FDQEHXVHGE\WKH*/&'OLEUDU\7KHILOHJOFG0DNH%LWPDSSGHLVD3URFHVVLQJVNHWFK
WKDWFDQEHUXQXVLQJWKH3URFHVVLQJHQYLURQPHQW7KHVNHWFKLVORFDWHGLQWKHELWPDSV
#include <glcd.h>
void setup()
{
GLCD.Init(); // initialize the library
GLCD.ClearScreen();
GLCD.DrawBitmap(ArduinoIcon, 0,0); //draw the supplied bitmap
delay(5000);
GLCD.ClearScreen();
GLCD.DrawBitmap(me, 0,0); //draw your bitmap
}
void loop()
{
7KHIROORZLQJOLQHGUDZVWKHLPDJHGHILQHGLQWKHILOH$UGXLQR,FRQKWKDWLVVXSSOLHG
ZLWKWKHOLEUDU\
GLCD.DrawBitmap(ArduinoIcon, 0,0); //draw the supplied bitmap
$IWHUDGHOD\WKHIROORZLQJOLQHGUDZVWKHLPDJH\RXFUHDWHGWKDWLVVWRUHGLQWKHILOH
PHK
GLCD.DrawBitmap(me, 0,0);
Solution
7KLVUHFLSHXVHVDVKLHOGFDOOHG7HOO\0DWHWRSULQWWH[WRUEORFNJUDSKLFVWRDWHOHYLVLRQ
7KHVKLHOGSOXJVLQWR$UGXLQRDQGKDVDQRXWSXWMDFNWKDWFRQQHFWVWRWKHYLGHRLQSXW
RIDWHOHYLVLRQ
7KHVNHWFKSULQWVDOOWKHFKDUDFWHUVWKH7HOO\0DWHFDQGLVSOD\RQD79VFUHHQ
/*
TellyMate
Simple demo for TellMmate Shield
*/
const byte ESC = 0x1B; // ASCII escape character used in TellyMate commands
void setup()
{
Serial.begin(57600); //57k6 baud is default TellyMate speed
clear(); // clear the screen
Serial.print(" TellyMate Character Set"); // write some text
delay(2000);
}
void loop()
{
Discussion
$UGXLQRFRQWUROVWKH7HOO\0DWHGLVSOD\E\VHQGLQJFRPPDQGVWRWKHVHULDOSRUW
7HOO\0DWHFRPPXQLFDWHVZLWKWKH$UGXLQRWKURXJKWKHVHULDOSRUWVR
\RXPD\QHHGWRXQSOXJWKHVKLHOGWRXSORDGVNHWFKHV
)LJXUHVKRZVWKHFKDUDFWHUVWKDWFDQEHGLVSOD\HG<RXFDQILQGDWDEOHRIYDOXHV
IRUHDFKFKDUDFWHUDWKWWSHQZLNLSHGLDRUJZLNL&RGHBSDJHB
)LJXUH7HOO\0DWHFKDUDFWHUVHWFRGHSDJH
&KDUDFWHUVWKURXJKDUHLQWHUSUHWHGDVVFUHHQFRQWUROFRPPDQGV
VRRQO\FKDUDFWHUVWRFDQEHGLVSOD\HG
7RDGGDER[DURXQGWKHHGJHRIWKHVFUHHQDGGWKHdrawBoxDQGshowXYIXQFWLRQVDW
WKHERWWRPRIWKHSUHYLRXVVNHWFK7RJHWWKHVNHWFKWRXVHWKHPDGGWKLVOLQHMXVW
LQVLGHWKHRSHQLQJEUDFNHWRIWKHORRS
drawBox(1,0, 38, 24); // the screen is 38 characters wide and 25 high
7KH drawBoxIXQFWLRQSULQWVFKDUDFWHUVIRUWKHIRXUFRUQHUVDQGWKHWRSERWWRPDQG
VLGHHGJHVXVLQJWKHOLQHGUDZLQJFKDUDFWHUFRGHV
// characters that form the box outline
// see http://en.wikipedia.org/wiki/Code_page_437
const byte boxUL = 201;
const byte boxUR = 187;
const byte boxLL = 200;
const byte boxLR = 188;
const byte HLINE = 205; // horizontal line
const byte VLINE = 186; // vertical line
void drawBox( int startRow, int startCol, int width, int height)
{
//draw top line
showXY(boxUL, startCol,startRow); // the upper-left corner
for(int col = startCol + 1; col < startCol + width-1; col++)
Serial.print(HLINE); // the line characters
Serial.print(boxUR); // upper-right character
$FRQYHQLHQFHIXQFWLRQXVHGE\drawBoxQDPHGshowXYFRPELQHVFXUVRUSRVLWLRQLQJ
DQGSULQWLQJ
void showXY( char ch, int x, int y){
// display the given character at the screen x and y location
setCursor(x,y);
Serial.print(ch);
}
+HUHLVDQDGGLWLRQDOVNHWFKWKDWXVHVWKHFXUVRUFRQWUROFRPPDQGVWRDQLPDWHDEDOO
ERXQFLQJDURXQGWKHVFUHHQ
/*
TellyBounce
*/
// this delay moves ball across the 38-character screen in just under 4 seconds
long interval = 100;
void setup()
{
Serial.begin(57600); // 57k6 baud is default TellyMate speed
clear(); // clear the screen
cursorHide(); // turn cursor off
}
void loop()
{
moveBall();
delay(interval);
}
// if the ball goes off the left or right, reverse its X direction
if ((ballX == LEFT) || (ballX == RIGHT))
ballDirectionX = -ballDirectionX;
void cursorShow( )
{ // <ESC>e
Serial.print(ESC) ;
Serial.print('e') ;
}
void cursorHide()
{ // <ESC>f
Serial.print(ESC) ;
Serial.print('f' ) ;
}