Mercurial > code > home > repos > homeauto
comparison service/busyboxArduino/LiquidCrystal_V1.2.1/LiquidCrystal/LiquidCrystal_SR2W.cpp @ 154:58c47bfe0ce5
add LiquidCrystal_V1.2.1 lib
Ignore-this: ddfe8b0c1d6e19f210684520859d5a57
author | drewp@bigasterisk.com |
---|---|
date | Sat, 03 Jan 2015 23:35:16 -0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
153:f8c5ec994768 | 154:58c47bfe0ce5 |
---|---|
1 // --------------------------------------------------------------------------- | |
2 // Created/Adapted by Bill Perry 2012-03-16 | |
3 // Copyright 2012 - Under creative commons license 3.0: | |
4 // Attribution-ShareAlike CC BY-SA | |
5 // | |
6 // This software is furnished "as is", without technical support, and with no | |
7 // warranty, express or implied, as to its usefulness for any purpose. | |
8 // | |
9 // Thread Safe: No | |
10 // Extendable: Yes | |
11 // | |
12 // @file LiquidCrystal_SR2W.cpp | |
13 // Connects a hd44780 LCD using 2 pins from the Arduino, via an 8-bit | |
14 // ShiftRegister (SR2W from now on). | |
15 // | |
16 // @brief | |
17 // This is a port of the ShiftRegLCD library from raron and ported to the | |
18 // LCD library. | |
19 // | |
20 // | |
21 // See the corresponding SR2W header file for full details. | |
22 // | |
23 // History | |
24 // 2012.03.29 bperrybap - Fixed incorrect use of 5x10 for default font | |
25 // (now matches original LQ library) | |
26 // Fixed typo in SR2W mask define names | |
27 // changed default backlight state to on | |
28 // 2012.03.16 bperrybap - created/modified from SR sources to create SR2W | |
29 // @author B. Perry - bperrybap@opensource.billsworld.billandterrie.com | |
30 // --------------------------------------------------------------------------- | |
31 | |
32 #include "LiquidCrystal_SR2W.h" | |
33 | |
34 // CONSTRUCTORS | |
35 // --------------------------------------------------------------------------- | |
36 // Assuming 1 line 8 pixel high font | |
37 LiquidCrystal_SR2W::LiquidCrystal_SR2W (uint8_t srdata, uint8_t srclock, t_backlighPol blpol) | |
38 { | |
39 init ( srdata, srclock, blpol, 1, 0 ); | |
40 } | |
41 | |
42 | |
43 // PRIVATE METHODS | |
44 // --------------------------------------------------------------------------- | |
45 | |
46 // | |
47 // init | |
48 void LiquidCrystal_SR2W::init(uint8_t srdata, uint8_t srclock, t_backlighPol blpol, uint8_t lines, uint8_t font) | |
49 { | |
50 _srDataRegister = fio_pinToOutputRegister(srdata); | |
51 _srDataMask = fio_pinToBit(srdata); | |
52 _srClockRegister = fio_pinToOutputRegister(srclock); | |
53 _srClockMask = fio_pinToBit(srclock); | |
54 | |
55 _blPolarity = blpol; | |
56 | |
57 _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; | |
58 | |
59 backlight(); // set default backlight state to on | |
60 } | |
61 | |
62 // | |
63 // loadSR | |
64 void LiquidCrystal_SR2W::loadSR(uint8_t val) | |
65 { | |
66 // Clear to keep Enable LOW while clocking in new bits | |
67 fio_shiftOut(_srDataRegister, _srDataMask, _srClockRegister, _srClockMask); | |
68 | |
69 | |
70 // clock out SR data byte | |
71 fio_shiftOut(_srDataRegister, _srDataMask, _srClockRegister, _srClockMask, val, MSBFIRST); | |
72 | |
73 | |
74 // strobe LCD enable which can now be toggled by the data line | |
75 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) | |
76 { | |
77 fio_digitalWrite_HIGH(_srDataRegister, _srDataMask); | |
78 waitUsec (1); // enable pulse must be >450ns | |
79 fio_digitalWrite_SWITCHTO(_srDataRegister, _srDataMask, LOW); | |
80 } // end critical section | |
81 } | |
82 | |
83 // PUBLIC METHODS | |
84 // --------------------------------------------------------------------------- | |
85 | |
86 | |
87 /************ low level data pushing commands **********/ | |
88 // | |
89 // send | |
90 void LiquidCrystal_SR2W::send(uint8_t value, uint8_t mode) | |
91 { | |
92 uint8_t myMode = ( mode == DATA ) ? SR2W_RS_MASK : 0; | |
93 | |
94 myMode = myMode | SR2W_EN_MASK | _blMask; | |
95 | |
96 if ( mode != FOUR_BITS ) | |
97 { | |
98 loadSR(myMode | ((value >> 1) & SR2W_DATA_MASK)); // upper nibble | |
99 } | |
100 | |
101 loadSR(myMode | ((value << 3) & SR2W_DATA_MASK)); // lower nibble | |
102 | |
103 /* | |
104 * Don't call waitUsec() | |
105 * do our own delay optmization since this code is so fast it needs some added delay | |
106 * even on slower AVRs. | |
107 */ | |
108 #if (F_CPU <= 16000000) | |
109 delayMicroseconds ( 10 ); // commands & data writes need > 37us to complete | |
110 #else | |
111 delayMicroseconds ( 37 ); // commands & data writes need > 37us to complete | |
112 #endif | |
113 } | |
114 | |
115 // | |
116 // setBacklight | |
117 void LiquidCrystal_SR2W::setBacklight ( uint8_t value ) | |
118 { | |
119 // Check for polarity to configure mask accordingly | |
120 // ---------------------------------------------------------- | |
121 if ( ((_blPolarity == POSITIVE) && (value > 0)) || | |
122 ((_blPolarity == NEGATIVE ) && ( value == 0 )) ) | |
123 { | |
124 _blMask = SR2W_BL_MASK; | |
125 } | |
126 else | |
127 { | |
128 _blMask = 0; | |
129 } | |
130 | |
131 // send dummy data of blMask to set BL pin | |
132 // Note: loadSR() will strobe the data line trying to pulse EN | |
133 // but E will not strobe because the EN output bit is not set. | |
134 loadSR(_blMask); | |
135 } |