Added critical section to SR_LCD3 wire latching library.

This commit is contained in:
FMC
2012-03-04 13:37:15 +01:00
parent 9f4e1553a5
commit eea7eb40ec
3 changed files with 26 additions and 23 deletions
+13 -14
View File
@@ -116,16 +116,6 @@ public:
*/
virtual void send(uint8_t value, uint8_t mode);
/*!
@function
@abstract Switch-on/off the LCD backlight.
@discussion Switch-on/off the LCD backlight.
The setBacklightPin has to be called before setting the backlight for
this method to work. @see setBacklightPin.
@param mode: backlight mode (HIGH|LOW)
*/
void setBacklight ( uint8_t mode );
/*!
@function
@@ -136,7 +126,16 @@ public:
*/
void setBacklightPin ( uint8_t pin );
/*!
@function
@abstract Switch-on/off the LCD backlight.
@discussion Switch-on/off the LCD backlight.
The setBacklightPin has to be called before setting the backlight for
this method to work. @see setBacklightPin.
@param mode: backlight mode (HIGH|LOW)
*/
void setBacklight ( uint8_t mode );
private:
@@ -153,17 +152,17 @@ private:
* @abstract takes care of shifting and the enable pulse
*/
void shiftIt (uint8_t val);
uint8_t _enable_pin; // Enable Pin
uint8_t _two_wire; // two wire mode
fio_register _srDataRegister; // Serial Data pin
fio_bit _srDataBit;
fio_register _srClockRegister; // Clock Pin
fio_bit _srClockBit;
fio_register _srEnableRegister; // Enable Pin
fio_bit _srEnableBit;
};
#endif
+11 -7
View File
@@ -103,6 +103,7 @@
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <util/atomic.h> // for critical section management
#if (ARDUINO < 100)
#include <WProgram.h>
@@ -120,7 +121,7 @@
// ---------------------------------------------------------------------------
// Assuming 1 line 8 pixel high font
LiquidCrystal_SR_LCD3::LiquidCrystal_SR_LCD3 ( uint8_t srdata, uint8_t srclock,
uint8_t strobe )
uint8_t strobe )
{
init ( srdata, srclock, strobe, 1, 0 );
}
@@ -132,12 +133,12 @@ LiquidCrystal_SR_LCD3::LiquidCrystal_SR_LCD3 ( uint8_t srdata, uint8_t srclock,
//
// init
void LiquidCrystal_SR_LCD3::init( uint8_t srdata, uint8_t srclock, uint8_t strobe,
uint8_t lines, uint8_t font )
uint8_t lines, uint8_t font )
{
// Initialise private variables
// translate all pins to bits and registers
// pinMode to OUTPUT, Output LOW
_srdata_bit = fio_pinToBit(srdata);
_srdata_register = fio_pinToOutputRegister(srdata);
_srclock_bit = fio_pinToBit(srclock);
@@ -147,7 +148,7 @@ void LiquidCrystal_SR_LCD3::init( uint8_t srdata, uint8_t srclock, uint8_t strob
// Little trick to force a pulse of the LCD enable bit and make sure it is
// low before we start further writes since this is assumed.
write4bits(0);
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x10DOTS;
@@ -200,8 +201,11 @@ void LiquidCrystal_SR_LCD3::_pushOut(uint8_t nibble)
fio_shiftOut(_srdata_register, _srdata_bit, _srclock_register, _srclock_bit, nibble, LSBFIRST);
// Make new data active.
fio_digitalWrite_HIGH(_strobe_register, _strobe_bit);
waitUsec( 1 ); // strobe pulse must be >450ns (old code had 10ms)
fio_digitalWrite_SWITCHTO(_strobe_register, _strobe_bit,LOW);
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
fio_digitalWrite_HIGH(_strobe_register, _strobe_bit);
waitUsec( 1 ); // strobe pulse must be >450ns (old code had 10ms)
fio_digitalWrite_SWITCHTO(_strobe_register, _strobe_bit,LOW);
}
waitUsec( 40 ); // commands need > 37us to settle
}
+2 -2
View File
@@ -61,11 +61,11 @@ private:
*/
void write4bits ( uint8_t );
void _pushOut ( uint8_t );
// Serial Data pin
fio_bit _srdata_bit;
fio_register _srdata_register;
// Clock Pin
fio_bit _srclock_bit;
fio_register _srclock_register;