![]() | LCD Library 1.2.1 LCD Library - LCD control class hierarchy library. Drop in replacement for the LiquidCrystal Library. |
00001 // ---------------------------------------------------------------------------00002 // Created/Adapted by Bill Perry 2012-03-1600003 // Copyright 2012 - Under creative commons license 3.0:00004 // Attribution-ShareAlike CC BY-SA00005 //00006 // This software is furnished "as is", without technical support, and with no 00007 // warranty, express or implied, as to its usefulness for any purpose.00008 //00009 // @file LiquidCrystal_SR2W.h00010 // Connects a hd44780 LCD using 2 pins from the Arduino, via an 8-bit 00011 // ShiftRegister (SR2W from now on).00012 // 00013 // @brief 00014 // This is the 2 wire shift register interface class for the LCD library00015 //00016 // The functionality provided by this class and its base class is a superset of00017 // the original functionality of the Arduino LiquidCrystal library and can00018 // be used as such.00019 // See the LCD class for a full description of the API functions available.00020 //00021 // It works with a 8-bit unlatched, no-tristate, unidirectional SIPO (Serial-In-Parallel-Out)00022 // shift register (IE a very simple SR), and an hd44780 LCD in 4-bit mode.00023 // Any such shift register should do (pref. 74LS family IC's for 2-wire).00024 // 74LS164 and 74HC595 have been exstensively tested.00025 //00026 //00027 // 2 Pins required from the Arduino:00028 // - Data/Enable00029 // - Clock00030 // The Data pin is also used to control the enable signal00031 // LCD RW-pin hardwired to LOW (only writing to LCD).00032 // Busy Flag (BF, data bit D7) is not read.00033 //00034 // Original project homepage: http://code.google.com/p/arduinoshiftreglcd/00035 //00036 // Shift register bits00037 // Bit #0 - (cannot be used on 74HC595)00038 // Bit #1 - optional backlight control00039 // Bit #2 - connects to RS (Register Select) on the LCD00040 // Bit #3 - connects to LCD data inputs D400041 // Bit #4 - connects to LCD data inputs D500042 // Bit #5 - connects to LCD data inputs D600043 // Bit #6 - connects to LCD data inputs D700044 // Bit #7 - enables the LCD enable-puls (via the diode-resistor AND "gate")00045 // 00046 // Wiring for a 74LS16400047 // ---------------------00048 // 1k/4.7k00049 // +--------[ Resistor ]--------+---(LCD Enable)00050 // | |00051 // | 74LS164 (VCC) |00052 // | +----u----+ | _V_ diode00053 // (data pin)---+---+--1-|A VCC|-14-+ |00054 // | | | |00055 // +--2-|B Q7|-13------+00056 // 3-|Q0 Q6|-12--(LCD D7)00057 // (BL Circuit)--------4-|Q1 Q5|-11--(LCD D6)00058 // (LCD RS)------------5-|Q2 Q4|-10--(LCD D5)00059 // (LCD D4)------------6-|Q3 /MR|--9--(VCC)00060 // +-7-|GND CP|--8--(clock pin)00061 // | +---------+ 00062 // | 0.1uf00063 // (gnd)-----||----(vcc)00064 // 00065 // Wiring for a 74HC59500066 // --------------------00067 // NOTE: the 74HC595 is a latching shift register. In order to get it to operate00068 // in a "non latching" mode, RCLK and SCLK are tied together. The side effect of this00069 // is that the latched output is one clock behind behind the internal shift register bits.00070 // To compensate for this the wiring is offset by one bit position lower.00071 // For example, while the backlight is hooked to Q0 it is still using bit 1 of00072 // of the shift register because the outputs are 1 clock behind the real internal shift00073 // register.00074 // 00075 // 74HC595 (VCC)00076 // +----u----+ | +-----------------------(BL circuit)00077 // (LCD RS)------------1-|Q1 VCC|-16-+ | +--------------------(data pin)00078 // (LCD D4)------------2-|Q2 Q0|-15----+ | 1k/4.7k00079 // (LCD D5)------------3-|Q3 SER|-14-------+---[ Resistor ]--+--(LCD Enable)00080 // (LCD D6)------------4-|Q4 /OE|-13--(gnd) |00081 // (LCD D7)------------5-|Q5 RCLK|-12-------+ |00082 // | | | |00083 // +------6-|Q6 SCLK|-11-------+--(clock pin) |00084 // | 7-|Q7 /MR|-10--(VCC) |00085 // | +-8-|GND Q6'|--9 |00086 // | | +---------+ diode _V_00087 // | | 0.1uf |00088 // | (gnd)-----||----(vcc) |00089 // +-----------------------------------------------+00090 // 00091 //00092 // Backlight Control circuit00093 // -------------------------00094 // Because the shift resiter is not latching the outputs, the backlight circuitry00095 // will "see" the output bits as they are shifted into the shift register which00096 // can cause the backlight to flicker rather than remain constantly on/off.00097 // The circuit below slows down the transitions to the transistor to remove00098 // the visible flicker. When the BL input is HIGH the LCD backlight will turn on.00099 //00100 // (value depends on LCD, 100ohm is usually safe)00101 // (LCD BL anode)---[ resistor ]---(vcc)00102 //00103 // (LCD BL cathode)-------------------------------+00104 // |00105 // D00106 // |00107 // (BL input)----[ 4.7k Resistor ]----+-------G-|-< (2N7000 FET)00108 // | |00109 // (0.1uf) = S00110 // | |00111 // (gnd) (gnd)00112 // 00113 // 00114 // 00115 //00116 // History00117 // 2012.03.16 bperrybap - creation/adaption from SR header to create SR2W header.00118 // Fixed typo in SR2W mask define names00119 // @author B. Perry - bperrybap@opensource.billsworld.billandterrie.com00120 // --------------------------------------------------------------------------------00121 #ifndef _LIQUIDCRYSTAL_SR2W_00122 #define _LIQUIDCRYSTAL_SR2W_00123 00124 #include <inttypes.h>00125 #include "LCD.h"00126 #include "FastIO.h"00127 00128 00129 // two-wire SR output bit constants00130 // ---------------------------------------------------------------------------00131 00132#define SR2W_BL_MASK 0x0200133#define SR2W_RS_MASK 0x0400134#define SR2W_DATA_MASK 0x78 // data bits are hard coded to be SR bits 6,5,4,300135#define SR2W_EN_MASK 0x80 // cannot ever be changed00136 00137class LiquidCrystal_SR2W : publicLCD00138 { 00139 public: 00151 LiquidCrystal_SR2W (uint8_t srdata, uint8_t srclock, t_backlighPol blpol = POSITIVE); 00152 00165 virtualvoidsend(uint8_t value, uint8_t mode); 00166 00167 00177 voidsetBacklight ( uint8_t mode ); 00178 00179 private: 00180 00186 void init ( uint8_t srdata, uint8_t srclock, t_backlighPol blpol, uint8_t lines, uint8_t font ); 00187 00192 void loadSR (uint8_t val); 00193 00194 fio_register _srDataRegister; // Serial Data pin00195 fio_bit _srDataMask; 00196 fio_register _srClockRegister; // Clock Pin00197 fio_bit _srClockMask; 00198 00199 uint8_t _blPolarity; 00200 uint8_t _blMask; 00201 }; 00202 #endif