1. F Malpartida
  2. New LiquidCrystal

Source

New LiquidCrystal / utility / docs / html / _liquid_crystal___s_r1_w_8h_source.html

The default branch has multiple heads

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>LCD Library: LiquidCrystal_SR1W.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.7.4 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="logoGoogle.jpg"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">LCD Library&#160;<span id="projectnumber">1.3.0</span></div>
   <div id="projectbrief">LCD Library - LCD control class hierarchy library. Drop in replacement for the LiquidCrystal Library.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li id="searchli">
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('_liquid_crystal___s_r1_w_8h.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">LiquidCrystal_SR1W.h</div>  </div>
</div>
<div class="contents">
<a href="_liquid_crystal___s_r1_w_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00002"></a>00002 <span class="comment">// ---------------------------------------------------------------------------</span>
<a name="l00003"></a>00003 <span class="comment">// Created/Adapted by Stephen Erisman 2013-07-06</span>
<a name="l00004"></a>00004 <span class="comment">// Copyright 2013 - Under creative commons license 3.0:</span>
<a name="l00005"></a>00005 <span class="comment">//        Attribution-ShareAlike CC BY-SA</span>
<a name="l00006"></a>00006 <span class="comment">//</span>
<a name="l00007"></a>00007 <span class="comment">// This software is furnished &quot;as is&quot;, without technical support, and with no </span>
<a name="l00008"></a>00008 <span class="comment">// warranty, express or implied, as to its usefulness for any purpose.</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">// @file LiquidCrystal_SR1W.h</span>
<a name="l00011"></a>00011 <span class="comment">// Connects a hd44780 LCD using 1 pin from the Arduino, via an 8-bit Latching</span>
<a name="l00012"></a>00012 <span class="comment">// ShiftRegister (SR1W from now on).</span>
<a name="l00013"></a>00013 <span class="comment">// </span>
<a name="l00014"></a>00014 <span class="comment">// @brief </span>
<a name="l00015"></a>00015 <span class="comment">// This is the 1 wire shift register interface class for the LCD library</span>
<a name="l00016"></a>00016 <span class="comment">//</span>
<a name="l00017"></a>00017 <span class="comment">// The functionality provided by this class and its base class is a superset of</span>
<a name="l00018"></a>00018 <span class="comment">// the original functionality of the Arduino LiquidCrystal library and can</span>
<a name="l00019"></a>00019 <span class="comment">// be used as such.</span>
<a name="l00020"></a>00020 <span class="comment">// See the LCD class for a full description of the API functions available.</span>
<a name="l00021"></a>00021 <span class="comment">//</span>
<a name="l00022"></a>00022 <span class="comment">// It works with a 8-bit latched, no-tristate, unidirectional SIPO (Serial-In-Parallel-Out)</span>
<a name="l00023"></a>00023 <span class="comment">// shift register, and an hd44780 LCD in 4-bit mode.</span>
<a name="l00024"></a>00024 <span class="comment">// The 74HC595 shift register has been tested.</span>
<a name="l00025"></a>00025 <span class="comment">//</span>
<a name="l00026"></a>00026 <span class="comment">//</span>
<a name="l00027"></a>00027 <span class="comment">// 1 Pin required from the Arduino:</span>
<a name="l00028"></a>00028 <span class="comment">// - Serial PIN:</span>
<a name="l00029"></a>00029 <span class="comment">//    The Serial PIN is wired directly to the shift register&#39;s Clock PIN and its</span>
<a name="l00030"></a>00030 <span class="comment">//    unaltered signal directly triggers the Clock on every LOW to HIGH transition.</span>
<a name="l00031"></a>00031 <span class="comment">//</span>
<a name="l00032"></a>00032 <span class="comment">//    Additionally, the Serial PIN is wired through a resistor capacitor (RC) filter to</span>
<a name="l00033"></a>00033 <span class="comment">//    the shift register&#39;s Data PIN.  During a quick transition of the Serial PIN the</span>
<a name="l00034"></a>00034 <span class="comment">//    RC filter will maintain the Data PIN&#39;s previous value because the capacitor isn&#39;t</span>
<a name="l00035"></a>00035 <span class="comment">//    given enough time to charge (or discharge) to the alternate state.  If the transition</span>
<a name="l00036"></a>00036 <span class="comment">//    is held for enough time, however, the RC capacitor will charge (or discharge) and the</span>
<a name="l00037"></a>00037 <span class="comment">//    value seen by the Data PIN will have changed state.</span>
<a name="l00038"></a>00038 <span class="comment">//</span>
<a name="l00039"></a>00039 <span class="comment">//    There are two circuit versions that behave differently for Latch, Enable, and Clear:</span>
<a name="l00040"></a>00040 <span class="comment">//</span>
<a name="l00041"></a>00041 <span class="comment">//  HW_CLEAR version:</span>
<a name="l00042"></a>00042 <span class="comment">//    In this version the shift register&#39;s Latch and LCD&#39;s Enable PINs are wired directly to</span>
<a name="l00043"></a>00043 <span class="comment">//    the shift register&#39;s Q&#39;H output.  The shift register&#39;s /Clear PIN is then wired up</span>
<a name="l00044"></a>00044 <span class="comment">//    through two logic &quot;gates&quot;: first QH and Q&#39;H are AND&#39;d together with a diode-resistor</span>
<a name="l00045"></a>00045 <span class="comment">//    &quot;gate&quot; the output of which is NAND&#39;d with VCC using a resistor-NPN-resistor &quot;gate&quot;.</span>
<a name="l00046"></a>00046 <span class="comment">//    So, /CLR = ((QH AND Q&#39;H) NAND VCC).  We also put a capacitor on the NPN base to GND</span>
<a name="l00047"></a>00047 <span class="comment">//    to delay the signal a bit and allow the Latch and EN signals some extra time to trigger.</span>
<a name="l00048"></a>00048 <span class="comment">//    </span>
<a name="l00049"></a>00049 <span class="comment">//    This all fits together as follows:</span>
<a name="l00050"></a>00050 <span class="comment">//      1. We shift in a &#39;1&#39;.</span>
<a name="l00051"></a>00051 <span class="comment">//      2. Ws shift in the other 7 bits.</span>
<a name="l00052"></a>00052 <span class="comment">//      3. At this point the first &#39;1&#39; has been shifted into Q&#39;H causing it to go HIGH.</span>
<a name="l00053"></a>00053 <span class="comment">//      4. When Q&#39;H is HIGH it causes Latch and EN to also go HIGH.</span>
<a name="l00054"></a>00054 <span class="comment">//      5. When Latch transitions to HIGH it changes the shift register outputs to the bits</span>
<a name="l00055"></a>00055 <span class="comment">//         that were shifted in.</span>
<a name="l00056"></a>00056 <span class="comment">//      6. This causes QH to go HIGH (if it wasn&#39;t already).</span>
<a name="l00057"></a>00057 <span class="comment">//      7. Now that QH AND Q&#39;H are both HIGH they causes the base capacitor to start charging.</span>
<a name="l00058"></a>00058 <span class="comment">//      8. When the capacitor has charged enough the transistor brings /CLR LOW.</span>
<a name="l00059"></a>00059 <span class="comment">//      8. This will cause /CLR to trigger and the shift register will be cleared</span>
<a name="l00060"></a>00060 <span class="comment">//         (NOTE: This doesn&#39;t change the latched outputs)</span>
<a name="l00061"></a>00061 <span class="comment">//      9. The clearing of the shift register causes Q&#39;H to go LOW.</span>
<a name="l00062"></a>00062 <span class="comment">//      9. When Q&#39;H is LOW it causes Latch and EN to also go LOW.</span>
<a name="l00063"></a>00063 <span class="comment">//      10. When EN transitions to LOW the LCD reads in the bits on the shift register pins</span>
<a name="l00064"></a>00064 <span class="comment">//          and does it&#39;s thing.</span>
<a name="l00065"></a>00065 <span class="comment">//      11. Now that Q&#39;H is LOW the base capacitor starts discharging.</span>
<a name="l00066"></a>00066 <span class="comment">//      12. When the capacitor has discharged enough the transistor will stop sinking /CLR.</span>
<a name="l00067"></a>00067 <span class="comment">//      13. This will cause /CLR to be pulled back up to HIGH by the VCC pullup resistor</span>
<a name="l00068"></a>00068 <span class="comment">//          (it will stay that way until our next nibble/byte has been shifted in)</span>
<a name="l00069"></a>00069 <span class="comment">//      14. We are now ready for our next nibble/byte.</span>
<a name="l00070"></a>00070 <span class="comment">//</span>
<a name="l00071"></a>00071 <span class="comment">//</span>
<a name="l00072"></a>00072 <span class="comment">//  SW_CLEAR version:</span>
<a name="l00073"></a>00073 <span class="comment">//    In this version the Serial PIN is wired to the shift register&#39;s Latch and LCD&#39;s Enable</span>
<a name="l00074"></a>00074 <span class="comment">//    PINs through another RC filter.  These PINs are also wired through a diode (AND &quot;gate&quot;)</span>
<a name="l00075"></a>00075 <span class="comment">//    tied to the shift register&#39;s Q&#39;H output.  This combination means that the Latch and</span>
<a name="l00076"></a>00076 <span class="comment">//    Enable PINs will be held LOW as long as EITHER the Q&#39;H or RC output is LOW.</span>
<a name="l00077"></a>00077 <span class="comment">//</span>
<a name="l00078"></a>00078 <span class="comment">//    This all fits together as follows:</span>
<a name="l00079"></a>00079 <span class="comment">//      1. We shift in a &#39;1&#39;.</span>
<a name="l00080"></a>00080 <span class="comment">//      2. We shift in the other 7 bits. (NOTE: We leave Serial PIN HIGH at the end of this)</span>
<a name="l00081"></a>00081 <span class="comment">//      3. At this point the first &#39;1&#39; has been shifted into Q&#39;H causing it to go HIGH.</span>
<a name="l00082"></a>00082 <span class="comment">//         (NOTE: Up until this time Q&#39;H has been LOW so the attached diode has been keeping</span>
<a name="l00083"></a>00083 <span class="comment">//          the Latch/EN pins LOW.)</span>
<a name="l00084"></a>00084 <span class="comment">//      4. Now that Q&#39;H is HIGH it causes the attached diode to stop discharging the Latch/EN</span>
<a name="l00085"></a>00085 <span class="comment">//         capacitor.  We delay here for a while to make sure it is fully charged.</span>
<a name="l00086"></a>00086 <span class="comment">//      5. When the capacitor has charged enough Latch/EN will be HIGH</span>
<a name="l00087"></a>00087 <span class="comment">//      5. When Latch transitions to HIGH it changes the shift register outputs to what was</span>
<a name="l00088"></a>00088 <span class="comment">//         shifted in.</span>
<a name="l00089"></a>00089 <span class="comment">//      6. We now bring the Serial PIN LOW and wait for the Latch/EN capacitor to discharge.</span>
<a name="l00090"></a>00090 <span class="comment">//      7. When the capacitor has discharged enough Latch/EN will be LOW</span>
<a name="l00091"></a>00091 <span class="comment">//      8. When EN transitions to LOW the LCD reads in the bits on the shift register pins</span>
<a name="l00092"></a>00092 <span class="comment">//         and does it&#39;s thing.</span>
<a name="l00093"></a>00093 <span class="comment">//      9. We now shift in &#39;0&#39; 8 times (as quickly as possible).</span>
<a name="l00094"></a>00094 <span class="comment">//      10. If we keep the LOW to HIGH to LOW pulses short enough while shifting in the &#39;0&#39;s</span>
<a name="l00095"></a>00095 <span class="comment">//          the Latch/EN capacitor won&#39;t have time to charge to a point where it will re-trigger</span>
<a name="l00096"></a>00096 <span class="comment">//          the Latch/EN pins.</span>
<a name="l00097"></a>00097 <span class="comment">//      11. Now Q&#39;H will be LOW and the shift register has been cleared (NOTE: This doesn&#39;t</span>
<a name="l00098"></a>00098 <span class="comment">//          change the latched outputs.)</span>
<a name="l00099"></a>00099 <span class="comment">//      12. We now bring the Serial PIN HIGH again and wait for the Data capacitor to recharge.</span>
<a name="l00100"></a>00100 <span class="comment">//      13. When the Data capacitor has fully charged we are ready for our next nibble/byte.</span>
<a name="l00101"></a>00101 <span class="comment">//</span>
<a name="l00102"></a>00102 <span class="comment">//</span>
<a name="l00103"></a>00103 <span class="comment">// These designs incorporate (and merge) ideas originally found here (1-wire concept):</span>
<a name="l00104"></a>00104 <span class="comment">//   http://www.romanblack.com/shift1.htm</span>
<a name="l00105"></a>00105 <span class="comment">// and here (diode-resistor AND &quot;gate&quot; EN control):</span>
<a name="l00106"></a>00106 <span class="comment">//   http://www.rentron.com/Myke1.htm</span>
<a name="l00107"></a>00107 <span class="comment">// as well as introducing some new and original ideas (particularly how HW_CLEAR works).</span>
<a name="l00108"></a>00108 <span class="comment">//</span>
<a name="l00109"></a>00109 <span class="comment">// Because of its use of the diode AND &quot;gate&quot;, the SW_CLEAR design allows for faster sending</span>
<a name="l00110"></a>00110 <span class="comment">// of data to the LCD compared to Roman&#39;s original design.  With the proposed 5uS delay (see</span>
<a name="l00111"></a>00111 <span class="comment">// notes below), a byte can be sent to the LCD in as little as 30 uS (plus overhead) when</span>
<a name="l00112"></a>00112 <span class="comment">// sending all 1&#39;s. This increases to as much as 190 uS (plus overhead) when sending all 0&#39;s.</span>
<a name="l00113"></a>00113 <span class="comment">// This is in comparison to Roman&#39;s estimate of around 3-4 mS to send a byte. So this</span>
<a name="l00114"></a>00114 <span class="comment">// implementation is 15-133 times faster for the cost of a single (1N4148 or similar) diode.</span>
<a name="l00115"></a>00115 <span class="comment">//</span>
<a name="l00116"></a>00116 <span class="comment">// The HW_CLEAR version is even faster as it can completely eliminate the clearSR() call as</span>
<a name="l00117"></a>00117 <span class="comment">// well as the delays that are needed to latch the data in the SW_CLEAR version.</span>
<a name="l00118"></a>00118 <span class="comment">//</span>
<a name="l00119"></a>00119 <span class="comment">//</span>
<a name="l00120"></a>00120 <span class="comment">// Default Shift Register Bits - Shifted MSB first:</span>
<a name="l00121"></a>00121 <span class="comment">// Bit #0 (QA) - not used</span>
<a name="l00122"></a>00122 <span class="comment">// Bit #1 (QB) - connects to LCD data input D7</span>
<a name="l00123"></a>00123 <span class="comment">// Bit #2 (QC) - connects to LCD data input D6</span>
<a name="l00124"></a>00124 <span class="comment">// Bit #3 (QD) - connects to LCD data input D5</span>
<a name="l00125"></a>00125 <span class="comment">// Bit #4 (QE) - connects to LCD data input D4</span>
<a name="l00126"></a>00126 <span class="comment">// Bit #5 (QF) - optional backlight control</span>
<a name="l00127"></a>00127 <span class="comment">// Bit #6 (QG) - connects to RS (Register Select) on the LCD</span>
<a name="l00128"></a>00128 <span class="comment">// Bit #7 (QH) - used for /CLR on the HW_CLEAR version (cannot be changed)</span>
<a name="l00129"></a>00129 <span class="comment">//        (Q&#39;H) - used for Latch/EN (via the diode AND &quot;gate&quot;) (cannot be changed)</span>
<a name="l00130"></a>00130 <span class="comment">//</span>
<a name="l00131"></a>00131 <span class="comment">// NOTE: Any of these can be changed around as needed EXCEPT Bit #7 (QH and Q&#39;H).</span>
<a name="l00132"></a>00132 <span class="comment">//</span>
<a name="l00133"></a>00133 <span class="comment">//</span>
<a name="l00134"></a>00134 <span class="comment">// Circuit Types (for the 74HC595)</span>
<a name="l00135"></a>00135 <span class="comment">// -------------------------------</span>
<a name="l00136"></a>00136 <span class="comment">// The 74HC595 is a latching shift register.  See the explanations above for how these circuits</span>
<a name="l00137"></a>00137 <span class="comment">// work.</span>
<a name="l00138"></a>00138 <span class="comment">//</span>
<a name="l00139"></a>00139 <span class="comment">//</span>
<a name="l00140"></a>00140 <span class="comment">// HW_CLEAR version: (Faster but higher part count)</span>
<a name="l00141"></a>00141 <span class="comment">// ------------------------------------------------</span>
<a name="l00142"></a>00142 <span class="comment">//</span>
<a name="l00143"></a>00143 <span class="comment">//                         74HC595     (VCC)</span>
<a name="l00144"></a>00144 <span class="comment">//                       +----u----+     |        2.2nF</span>
<a name="l00145"></a>00145 <span class="comment">// (LCD D7)------------1-|QB    VCC|-16--+    +----||----(GND)</span>
<a name="l00146"></a>00146 <span class="comment">// (LCD D6)------------2-|QC     QA|-15       |</span>
<a name="l00147"></a>00147 <span class="comment">// (LCD D5)------------3-|QD    SER|-14-------+--[ Resistor ]--+</span>
<a name="l00148"></a>00148 <span class="comment">// (LCD D4)------------4-|QE    /OE|-13--(GND)     1.5k        |</span>
<a name="l00149"></a>00149 <span class="comment">// (BL Circuit)--------5-|QF    RCK|-12-----+                  |</span>
<a name="l00150"></a>00150 <span class="comment">//                       |         |         \                 |</span>
<a name="l00151"></a>00151 <span class="comment">// (LCD RS)------------6-|QG    SCK|-11-------)----------------+--(Serial PIN)</span>
<a name="l00152"></a>00152 <span class="comment">//                       |         |          |</span>
<a name="l00153"></a>00153 <span class="comment">//             +-------7-|QH   /CLR|-10-------)--+--[ Resistor ]--(VCC)</span>
<a name="l00154"></a>00154 <span class="comment">//             |         |         |         /   |       1k</span>
<a name="l00155"></a>00155 <span class="comment">//             |    +--8-|GND   Q&#39;H|--9-----+    |</span>
<a name="l00156"></a>00156 <span class="comment">//             |    |    +---------+        |    |         (GND)--(LCD RW)</span>
<a name="l00157"></a>00157 <span class="comment">//             |    |      0.1uF            |     \</span>
<a name="l00158"></a>00158 <span class="comment">//             |  (GND)-----||----(VCC)     +------)--------------(LCD EN)</span>
<a name="l00159"></a>00159 <span class="comment">//             |                            |     /</span>
<a name="l00160"></a>00160 <span class="comment">//             |----|&lt;|----+--[ Resistor ]--|    |</span>
<a name="l00161"></a>00161 <span class="comment">//                 diode   |       1k            C</span>
<a name="l00162"></a>00162 <span class="comment">//                         |                     |</span>
<a name="l00163"></a>00163 <span class="comment">//                         +-------------+---B-|&gt; (NPN)</span>
<a name="l00164"></a>00164 <span class="comment">//                                       |       |</span>
<a name="l00165"></a>00165 <span class="comment">//                               (2.2nF) =       E</span>
<a name="l00166"></a>00166 <span class="comment">//                                       |       |</span>
<a name="l00167"></a>00167 <span class="comment">//                                     (GND)   (GND)</span>
<a name="l00168"></a>00168 <span class="comment">//</span>
<a name="l00169"></a>00169 <span class="comment">//</span>
<a name="l00170"></a>00170 <span class="comment">// SW_CLEAR version: (Lower part count but slower)</span>
<a name="l00171"></a>00171 <span class="comment">// -----------------------------------------------</span>
<a name="l00172"></a>00172 <span class="comment">//</span>
<a name="l00173"></a>00173 <span class="comment">//                         74HC595     (VCC)</span>
<a name="l00174"></a>00174 <span class="comment">//                       +----u----+     |          2.2nF</span>
<a name="l00175"></a>00175 <span class="comment">// (LCD D7)------------1-|QB    VCC|-16--+      +----||----(GND)</span>
<a name="l00176"></a>00176 <span class="comment">// (LCD D6)------------2-|QC     QA|-15         |</span>
<a name="l00177"></a>00177 <span class="comment">// (LCD D5)------------3-|QD    SER|-14---------+--[ Resistor ]--+</span>
<a name="l00178"></a>00178 <span class="comment">// (LCD D4)------------4-|QE    /OE|-13--(GND)         1.5k      |</span>
<a name="l00179"></a>00179 <span class="comment">// (BL Circuit)--------5-|QF    RCK|-12---------+                |</span>
<a name="l00180"></a>00180 <span class="comment">//                       |         |             \               |</span>
<a name="l00181"></a>00181 <span class="comment">// (LCD RS)------------6-|QG    SCK|-11-----------)--------------+--(Serial PIN)</span>
<a name="l00182"></a>00182 <span class="comment">//                     7-|QH   /CLR|-10--(VCC)   /               |</span>
<a name="l00183"></a>00183 <span class="comment">//                  +--8-|GND   Q&#39;H|--9---|&lt;|---+--[ Resistor ]--+</span>
<a name="l00184"></a>00184 <span class="comment">//                  |    +---------+     diode  |      1.5k</span>
<a name="l00185"></a>00185 <span class="comment">//                  |                           |</span>
<a name="l00186"></a>00186 <span class="comment">//                  |      0.1uF                |</span>
<a name="l00187"></a>00187 <span class="comment">//                (GND)-----||----(VCC)         +----||----(GND)</span>
<a name="l00188"></a>00188 <span class="comment">//                                              |   2.2nF</span>
<a name="l00189"></a>00189 <span class="comment">// (LCD EN)-------------------------------------+</span>
<a name="l00190"></a>00190 <span class="comment">// (LCD RW)--(GND)</span>
<a name="l00191"></a>00191 <span class="comment">//</span>
<a name="l00192"></a>00192 <span class="comment">//</span>
<a name="l00193"></a>00193 <span class="comment">// In either case the LCD RW pin is hardwired to GND meaning we will only be able to write</span>
<a name="l00194"></a>00194 <span class="comment">// to the LCD.</span>
<a name="l00195"></a>00195 <span class="comment">// Therefore, the Busy Flag (BF, data bit D7) is not able to be read and we have to make use</span>
<a name="l00196"></a>00196 <span class="comment">// of the minimum delay time constraints.  This isn&#39;t really a problem because it usually</span>
<a name="l00197"></a>00197 <span class="comment">// takes us longer to shift and latch the data than the minimum delay anyway.  For now, we</span>
<a name="l00198"></a>00198 <span class="comment">// simply keep track of our delays and add more delay at the end to get to at least 37 uS.</span>
<a name="l00199"></a>00199 <span class="comment">//</span>
<a name="l00200"></a>00200 <span class="comment">//</span>
<a name="l00201"></a>00201 <span class="comment">// Backlight Control Circuit</span>
<a name="l00202"></a>00202 <span class="comment">// -------------------------</span>
<a name="l00203"></a>00203 <span class="comment">// Since we are using the latching nature of the shift resiter we don&#39;t need the extra</span>
<a name="l00204"></a>00204 <span class="comment">// backlight circuitry that SR2W uses.  Keeping it around, however, would still work because</span>
<a name="l00205"></a>00205 <span class="comment">// the circuit just slows down the transitions to the mosfet a bit.</span>
<a name="l00206"></a>00206 <span class="comment">//</span>
<a name="l00207"></a>00207 <span class="comment">// Here are two more optimized versions that can be used.</span>
<a name="l00208"></a>00208 <span class="comment">//</span>
<a name="l00209"></a>00209 <span class="comment">//</span>
<a name="l00210"></a>00210 <span class="comment">// NPN Transistor version: (Cheaper but more power draw and higher part count)</span>
<a name="l00211"></a>00211 <span class="comment">// ---------------------------------------------------------------------------</span>
<a name="l00212"></a>00212 <span class="comment">//</span>
<a name="l00213"></a>00213 <span class="comment">//                (value depends on LCD, 100ohm is usually safe)</span>
<a name="l00214"></a>00214 <span class="comment">// (LCD BL anode)---[ resistor ]---(VCC)</span>
<a name="l00215"></a>00215 <span class="comment">//</span>
<a name="l00216"></a>00216 <span class="comment">// (LCD BL cathode)---------------+</span>
<a name="l00217"></a>00217 <span class="comment">//                                |</span>
<a name="l00218"></a>00218 <span class="comment">//                                C</span>
<a name="l00219"></a>00219 <span class="comment">//                                |</span>
<a name="l00220"></a>00220 <span class="comment">// (BL input)--[ Resistor ]---B-|&gt; (NPN)</span>
<a name="l00221"></a>00221 <span class="comment">//                  1k            |</span>
<a name="l00222"></a>00222 <span class="comment">//                                E</span>
<a name="l00223"></a>00223 <span class="comment">//                                |</span>
<a name="l00224"></a>00224 <span class="comment">//                              (GND)</span>
<a name="l00225"></a>00225 <span class="comment">//</span>
<a name="l00226"></a>00226 <span class="comment">// NOTE: The Bate resistor is needed because the NPN is current fed.  For lower</span>
<a name="l00227"></a>00227 <span class="comment">//       power draw, try a 10k resistor.</span>
<a name="l00228"></a>00228 <span class="comment">//</span>
<a name="l00229"></a>00229 <span class="comment">//</span>
<a name="l00230"></a>00230 <span class="comment">// N-CH Mosfet version: (More costly but less power draw and lower part count)</span>
<a name="l00231"></a>00231 <span class="comment">// ---------------------------------------------------------------------------</span>
<a name="l00232"></a>00232 <span class="comment">//</span>
<a name="l00233"></a>00233 <span class="comment">//                (value depends on LCD, 100ohm is usually safe)</span>
<a name="l00234"></a>00234 <span class="comment">// (LCD BL anode)---[ resistor ]---(VCC)</span>
<a name="l00235"></a>00235 <span class="comment">//</span>
<a name="l00236"></a>00236 <span class="comment">// (LCD BL cathode)---------------+</span>
<a name="l00237"></a>00237 <span class="comment">//                                |</span>
<a name="l00238"></a>00238 <span class="comment">//                                D</span>
<a name="l00239"></a>00239 <span class="comment">//                                |</span>
<a name="l00240"></a>00240 <span class="comment">// (BL input)----------------G-|-&lt; (2N7000 FET)</span>
<a name="l00241"></a>00241 <span class="comment">//                                |</span>
<a name="l00242"></a>00242 <span class="comment">//                                S</span>
<a name="l00243"></a>00243 <span class="comment">//                                |</span>
<a name="l00244"></a>00244 <span class="comment">//                              (GND)</span>
<a name="l00245"></a>00245 <span class="comment">//</span>
<a name="l00246"></a>00246 <span class="comment">// NOTE: Gate resistor not needed because the mosfet is voltage fed and only really</span>
<a name="l00247"></a>00247 <span class="comment">//       pulls current while switching.</span>
<a name="l00248"></a>00248 <span class="comment">//</span>
<a name="l00249"></a>00249 <span class="comment">// In either case, when the BL input is HIGH the LCD backlight will turn on.</span>
<a name="l00250"></a>00250 <span class="comment">//</span>
<a name="l00251"></a>00251 <span class="comment">//</span>
<a name="l00252"></a>00252 <span class="comment">// History</span>
<a name="l00253"></a>00253 <span class="comment">// 2013.07.31 serisman - fixed potential interrupt bug and made more performance optimizations</span>
<a name="l00254"></a>00254 <span class="comment">// 2013.07.10 serisman - more performance optimizations and modified the HW_CLEAR circuit a bit</span>
<a name="l00255"></a>00255 <span class="comment">// 2013.07.09 serisman - added an even faster version that performs the clear in hardware</span>
<a name="l00256"></a>00256 <span class="comment">// 2013.07.08 serisman - changed code to shift data MSB first to match SR2W</span>
<a name="l00257"></a>00257 <span class="comment">// 2013.07.07 serisman - major speed optimization</span>
<a name="l00258"></a>00258 <span class="comment">// 2013.07.06 serisman - created/modified from SR2W source to create SR1W</span>
<a name="l00259"></a>00259 <span class="comment">// @author  S. Erisman - arduino@serisman.com</span>
<a name="l00260"></a>00260 <span class="comment">// --------------------------------------------------------------------------------</span>
<a name="l00261"></a>00261 
<a name="l00262"></a>00262 <span class="preprocessor">#ifndef _LIQUIDCRYSTAL_SR1W_</span>
<a name="l00263"></a>00263 <span class="preprocessor"></span><span class="preprocessor">#define _LIQUIDCRYSTAL_SR1W_</span>
<a name="l00264"></a>00264 <span class="preprocessor"></span>
<a name="l00265"></a>00265 <span class="preprocessor">#include &lt;inttypes.h&gt;</span>
<a name="l00266"></a>00266 <span class="preprocessor">#include &quot;<a class="code" href="_l_c_d_8h.html">LCD.h</a>&quot;</span>
<a name="l00267"></a>00267 <span class="preprocessor">#include &quot;<a class="code" href="_fast_i_o_8h.html">FastIO.h</a>&quot;</span>
<a name="l00268"></a>00268 
<a name="l00269"></a>00269 <span class="comment">// 1-wire SR timing constants</span>
<a name="l00270"></a>00270 <span class="comment">// ---------------------------------------------------------------------------</span>
<a name="l00271"></a>00271 
<a name="l00272"></a>00272 <span class="comment">// NOTE:</span>
<a name="l00273"></a>00273 <span class="comment">//  The 1.5k resistor (1.2k - 1.8k with a 20% tolerance)</span>
<a name="l00274"></a>00274 <span class="comment">//   takes between 2.376uS and 4.36uS to fully charge or discharge</span>
<a name="l00275"></a>00275 <span class="comment">//       the 2.2n capacitor (1.98n - 2.42n with a 10% tolerance).</span>
<a name="l00276"></a>00276 <span class="comment">//      We round this up to a 5uS delay to provide an additional safety margin.</span>
<a name="l00277"></a>00277 
<a name="l00278"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#af142acb4543f9067f60a28d58a49f033">00278</a> <span class="preprocessor">#define SR1W_DELAY_US           5</span>
<a name="l00279"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a645c2cb325144756182083dad23498e7">00279</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_DELAY()            { delayMicroseconds(SR1W_DELAY_US); numDelays++; }</span>
<a name="l00280"></a>00280 <span class="preprocessor"></span>
<a name="l00281"></a>00281 <span class="comment">// 1-wire SR output bit constants</span>
<a name="l00282"></a>00282 <span class="comment">// ---------------------------------------------------------------------------</span>
<a name="l00283"></a>00283 
<a name="l00284"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#ae4324c30e18eea1716bd2b0f60027712">00284</a> <span class="preprocessor">#define SR1W_UNUSED_MASK        0x01    // Set unused bit(s) to &#39;1&#39; as they are slightly faster to clock in.</span>
<a name="l00285"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a7accf5938d87cf2edbda80b26e0e6f69">00285</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_D7_MASK            0x02</span>
<a name="l00286"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a5cea156a4ee75a239b094b1c24116140">00286</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_D6_MASK            0x04</span>
<a name="l00287"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a159fe0dd329cef231ae7d8ad674adad3">00287</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_D5_MASK            0x08</span>
<a name="l00288"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a2ee8ae46c168f471666c4aaddbca1ec0">00288</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_D4_MASK            0x10</span>
<a name="l00289"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a2bfc90f6a1e21e271196273a8db741af">00289</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_BL_MASK            0x20</span>
<a name="l00290"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a874628609b122ed01ccd5e39411f86de">00290</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_RS_MASK            0x40</span>
<a name="l00291"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a6875204445378ad8d8a8ded846cbcbaa">00291</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_EN_MASK            0x80    // This cannot be changed. It has to be the first thing shifted in.</span>
<a name="l00292"></a>00292 <span class="preprocessor"></span>
<a name="l00293"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a895edbf1947d432e4616bc4592de8cfa">00293</a> <span class="preprocessor">#define SR1W_ATOMIC_WRITE_LOW(reg, mask)        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { *reg &amp;= ~mask; }</span>
<a name="l00294"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a7582c2cf6ceaeddf740f675c8f731ecf">00294</a> <span class="preprocessor"></span><span class="preprocessor">#define SR1W_ATOMIC_WRITE_HIGH(reg, mask)       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { *reg |= mask; }</span>
<a name="l00295"></a>00295 <span class="preprocessor"></span>
<a name="l00296"></a>00296 
<a name="l00297"></a><a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99">00297</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> { <a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99a6181fb356c56f0ac9a79810e1ba99ebc">SW_CLEAR</a>, <a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99a3069011d6c3fab813423e8101c6a7aa7">HW_CLEAR</a> } <a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99">t_sr1w_circuitType</a>;
<a name="l00298"></a>00298 
<a name="l00299"></a><a class="code" href="class_liquid_crystal___s_r1_w.html">00299</a> <span class="keyword">class </span><a class="code" href="class_liquid_crystal___s_r1_w.html">LiquidCrystal_SR1W</a> : <span class="keyword">public</span> <a class="code" href="class_l_c_d.html">LCD</a>
<a name="l00300"></a>00300 {
<a name="l00301"></a>00301 <span class="keyword">public</span>:
<a name="l00313"></a>00313    <a class="code" href="class_liquid_crystal___s_r1_w.html#a33bff2c123d3dc42a829b0f8034912c9">LiquidCrystal_SR1W</a> (uint8_t srdata, <a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99">t_sr1w_circuitType</a> circuitType, 
<a name="l00314"></a>00314                        <a class="code" href="_l_c_d_8h.html#aeeef728bf4726268aa5e99391a1502bc">t_backlighPol</a> blpol = <a class="code" href="_l_c_d_8h.html#aeeef728bf4726268aa5e99391a1502bca03d440bbbfb042afc85347f994b44fb5">POSITIVE</a>);
<a name="l00315"></a>00315    
<a name="l00328"></a>00328    <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_liquid_crystal___s_r1_w.html#a7fc0b03977907b4d526a6b9e49a331b1">send</a>(uint8_t value, uint8_t mode);
<a name="l00329"></a>00329    
<a name="l00330"></a>00330    
<a name="l00340"></a>00340    <span class="keywordtype">void</span> <a class="code" href="class_liquid_crystal___s_r1_w.html#a82d844569eb258559afb40ab354eb0a5">setBacklight</a> ( uint8_t mode );
<a name="l00341"></a>00341    
<a name="l00342"></a>00342 <span class="keyword">private</span>:
<a name="l00343"></a>00343    
<a name="l00349"></a>00349    <span class="keywordtype">void</span> init ( uint8_t srdata, <a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99">t_sr1w_circuitType</a> circuitType, <a class="code" href="_l_c_d_8h.html#aeeef728bf4726268aa5e99391a1502bc">t_backlighPol</a> blpol, 
<a name="l00350"></a>00350                uint8_t lines, uint8_t font );
<a name="l00351"></a>00351    
<a name="l00357"></a>00357    uint8_t clearSR ();
<a name="l00358"></a>00358    
<a name="l00363"></a>00363    uint8_t loadSR (uint8_t val);
<a name="l00364"></a>00364    
<a name="l00365"></a>00365    <a class="code" href="_fast_i_o_8h.html#ae44ea3af54ef26db03f1ae2ea62f9c1f">fio_register</a> _srRegister; <span class="comment">// Serial PIN</span>
<a name="l00366"></a>00366    <a class="code" href="_fast_i_o_8h.html#a0a595a88b29bcfd1540b6fac75787937">fio_bit</a> _srMask;
<a name="l00367"></a>00367    
<a name="l00368"></a>00368    <a class="code" href="_liquid_crystal___s_r1_w_8h.html#a31959259c88db00960459461ba423d99">t_sr1w_circuitType</a> _circuitType;
<a name="l00369"></a>00369    
<a name="l00370"></a>00370    uint8_t _blPolarity;
<a name="l00371"></a>00371    uint8_t _blMask;
<a name="l00372"></a>00372 };
<a name="l00373"></a>00373 <span class="preprocessor">#endif</span>
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="_liquid_crystal___s_r1_w_8h.html">LiquidCrystal_SR1W.h</a>      </li>
      <li class="footer">Generated on Sat Aug 3 2013 22:34:05 for LCD Library by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Defines</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>


</body>
</html>