diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/busyboxArduino/LiquidCrystal_V1.2.1/LiquidCrystal/LiquidCrystal_SR2W.cpp	Sat Jan 03 23:35:16 2015 -0800
@@ -0,0 +1,135 @@
+// ---------------------------------------------------------------------------
+// Created/Adapted by Bill Perry 2012-03-16
+// Copyright 2012 - Under creative commons license 3.0:
+//        Attribution-ShareAlike CC BY-SA
+//
+// This software is furnished "as is", without technical support, and with no 
+// warranty, express or implied, as to its usefulness for any purpose.
+//
+// Thread Safe: No
+// Extendable: Yes
+//
+// @file LiquidCrystal_SR2W.cpp
+// Connects a hd44780 LCD using 2 pins from the Arduino, via an 8-bit 
+// ShiftRegister (SR2W from now on).
+// 
+// @brief 
+// This is a port of the ShiftRegLCD library from raron and ported to the
+// LCD library.
+//
+//
+// See the corresponding SR2W header file for full details.
+//
+// History
+// 2012.03.29  bperrybap - Fixed incorrect use of 5x10 for default font 
+//                         (now matches original LQ library)
+//                         Fixed typo in SR2W mask define names
+//                         changed default backlight state to on
+// 2012.03.16  bperrybap - created/modified from SR sources to create SR2W
+// @author B. Perry - bperrybap@opensource.billsworld.billandterrie.com
+// ---------------------------------------------------------------------------
+
+#include "LiquidCrystal_SR2W.h"
+
+// CONSTRUCTORS
+// ---------------------------------------------------------------------------
+// Assuming 1 line 8 pixel high font
+LiquidCrystal_SR2W::LiquidCrystal_SR2W (uint8_t srdata, uint8_t srclock, t_backlighPol blpol)
+{
+	init ( srdata, srclock, blpol, 1, 0 );
+}
+
+
+// PRIVATE METHODS
+// ---------------------------------------------------------------------------
+
+//
+// init
+void LiquidCrystal_SR2W::init(uint8_t srdata, uint8_t srclock, t_backlighPol blpol, uint8_t lines, uint8_t font)
+{
+	_srDataRegister = fio_pinToOutputRegister(srdata);
+	_srDataMask = fio_pinToBit(srdata);
+	_srClockRegister = fio_pinToOutputRegister(srclock);
+	_srClockMask = fio_pinToBit(srclock);
+   
+	_blPolarity = blpol;
+   
+	_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
+   
+	backlight(); // set default backlight state to on
+}
+
+//
+// loadSR
+void LiquidCrystal_SR2W::loadSR(uint8_t val)
+{
+	// Clear to keep Enable LOW while clocking in new bits
+	fio_shiftOut(_srDataRegister, _srDataMask, _srClockRegister, _srClockMask);
+   
+   
+	// clock out SR data byte
+	fio_shiftOut(_srDataRegister, _srDataMask, _srClockRegister, _srClockMask, val, MSBFIRST);
+   
+ 	
+	// strobe LCD enable which can now be toggled by the data line
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		fio_digitalWrite_HIGH(_srDataRegister, _srDataMask);
+		waitUsec (1);         // enable pulse must be >450ns               
+		fio_digitalWrite_SWITCHTO(_srDataRegister, _srDataMask, LOW);
+	} // end critical section
+}
+
+// PUBLIC METHODS
+// ---------------------------------------------------------------------------
+
+
+/************ low level data pushing commands **********/
+//
+// send
+void LiquidCrystal_SR2W::send(uint8_t value, uint8_t mode)
+{
+	uint8_t myMode = ( mode == DATA ) ? SR2W_RS_MASK : 0; 
+   
+	myMode = myMode | SR2W_EN_MASK | _blMask;
+
+	if ( mode != FOUR_BITS )
+	{
+		loadSR(myMode | ((value >> 1) & SR2W_DATA_MASK)); // upper nibble
+	}
+
+	loadSR(myMode | ((value << 3) & SR2W_DATA_MASK)); // lower nibble
+   
+	/*
+	 * Don't call waitUsec()
+	 * do our own delay optmization since this code is so fast it needs some added delay
+	 * even on slower AVRs.
+	 */
+#if (F_CPU <= 16000000)
+	delayMicroseconds ( 10 );      // commands & data writes need > 37us to complete
+#else
+	delayMicroseconds ( 37 );      // commands & data writes need > 37us to complete
+#endif
+}
+
+//
+// setBacklight
+void LiquidCrystal_SR2W::setBacklight ( uint8_t value ) 
+{ 
+	// Check for polarity to configure mask accordingly
+	// ----------------------------------------------------------
+	if  ( ((_blPolarity == POSITIVE) && (value > 0)) || 
+        ((_blPolarity == NEGATIVE ) && ( value == 0 )) )
+	{
+		_blMask = SR2W_BL_MASK;
+	}
+	else 
+	{
+		_blMask = 0;
+	}
+   
+	// send dummy data of blMask to set BL pin
+	// Note: loadSR() will strobe the data line trying to pulse EN
+	// but E will not strobe because the EN output bit is not set.
+	loadSR(_blMask); 
+}