<root>
<document schema='101' license='1,Sens-a-Dat,QQQC4R' title='' description='' target='PIC16.24F.24FJ64GB002' >
	<config data='!0,ffdf!10,fcff!20,ab9e!30,2f3f%0,f%4,1%5,0%6,1%7,1%8,ff%10,3f%16,3%18,0%1a,3%1c,1%1d,1%1e,1%1f,1%20,2%22,1%23,1%24,1%25,0%26,2%28,3%2b,1%2c,2%2f,1%30,f%34,1%35,1%36,0%37,0%38,3%3a,1%3b,1%3c,0%3d,1%3e,0%3f,0' clkspd='8000000' simspd='1' usewdt='0' constif='0' />
	<plugins >
		<dll_dbg_icd enabled='0' >
			<data name='debug' value='1' />
			<data name='userpins' value='0' />
			<data name='speed' value='0' />
			<data name='usev9' value='0' />
			<data name='breaks' value='8' />
			<data name='stacks' value='8' />
			<data name='clkport' value='1' />
			<data name='clkbit' value='6' />
			<data name='dataport' value='1' />
			<data name='databit' value='7' />
			<data name='ghostype' value='0' />
			<data name='monitor' value='1' />
			<data name='ictloop' value='0' />
			<data name='ictrate' value='20000' />
			<data name='ictmask' value='0' />
			<data name='anlpres' value='255' />
			<data name='digmask1' value='-1' />
			<data name='digmask2' value='-1' />
		</dll_dbg_icd>
		<dll_models enabled='1' />
		<dll_upgrader enabled='1' />
		<dll_webhelp enabled='1' />
	</plugins>
	<supplement use='0' head='#ifndef LCDI2C4Bit_h
#define LCDI2C4Bit_h

// #include &lt;inttypes.h&gt;

// IMPORTANT! Wire. must have a begin() before calling init()

class LCDI2C4Bit {
public:
  LCDI2C4Bit(int devI2CAddress, int num_lines, int lcdwidth);
  void commandWrite(int command);
  void init();
  void print(int value);
  void printIn(char value[]);
  void clear();
  void backLight( bool turnOn );

  //non-core---------------
  void cursorTo(int line_num, int x);
  //void leftScroll(int chars, int delay_time);
  //end of non-core--------

  //4bit only, therefore ideally private but may be needed by user
  //void commandWriteNibble(int nibble);

private:
  //void pulseEnablePin();
  //void pushNibble(int nibble);
  //void pushByte(int value);

  int myNumLines;
  int myWidth;
  int myAddress;
};
#endif


' body='#include &quot;LCDI2C4Bit.h&quot;
#include &lt;Wire.h&gt;

extern &quot;C&quot; {
  #include &lt;stdio.h&gt;  //not needed yet
  #include &lt;string.h&gt; //needed for strlen()
  #include &lt;inttypes.h&gt;
  #include &quot;WConstants.h&quot;  //all things wiring / arduino
}

//command bytes for LCD
#define CMD_CLR 0x01
#define CMD_RIGHT 0x1C
#define CMD_LEFT 0x18
#define CMD_HOME 0x02

//stuff the library user might call---------------------------------

//constructor.  num_lines must be 1 or 2, currently.

byte dataPlusMask = 0; // TODO!!!

LCDI2C4Bit::LCDI2C4Bit( int devI2CAddress, int num_lines, int lcdwidth) {
  myNumLines = num_lines;
  myWidth = lcdwidth;
  myAddress = devI2CAddress;
}

void SetMCPReg( byte deviceAddr, byte reg, byte val ) {
  Wire.beginTransmission(deviceAddr);
  Wire.send(reg);
  Wire.send(val);
  Wire.endTransmission();
}

void SendToLCD( byte deviceAddr, byte data ) {
  data |= dataPlusMask;
  SetMCPReg(deviceAddr,0x0A,data);
  data ^= 0x80; // E
  delayMicroseconds(1);
  SetMCPReg(deviceAddr,0x0A,data);
  data ^= 0x80; // E
  delayMicroseconds(1);
  SetMCPReg(deviceAddr,0x0A,data);
  delay(1);

}

void WriteLCDByte( byte deviceAddr, byte bdata ) {
  SendToLCD(deviceAddr,bdata &gt;&gt; 4);
  SendToLCD(deviceAddr,bdata &amp; 0x0F);
}

void LCDI2C4Bit::init( void ) {
  dataPlusMask = 0; // initial: 0
  SetMCPReg(myAddress,0x05,0x0C); // set CONFREG (0x05) to 0
  SetMCPReg(myAddress,0x00,0x00); // set IOREG (0x00) to 0
  //
  delay(50);
  SendToLCD(myAddress,0x03); 
  delay(5);
  SendToLCD(myAddress,0x03);
  delayMicroseconds(100);
  SendToLCD(myAddress,0x03);
  delay(5);
  SendToLCD(myAddress,0x02);
  WriteLCDByte(myAddress,0x28);
  WriteLCDByte(myAddress,0x08);
  WriteLCDByte(myAddress,0x0C); // turn on, cursor off, no blinking
  delayMicroseconds(60);
  WriteLCDByte(myAddress,0x01); // clear display
  delay(3);  
}

void LCDI2C4Bit::backLight( bool turnOn ) {
  dataPlusMask |= 0x40; // Lights mask
  if (!turnOn) dataPlusMask ^= 0x40;
  SetMCPReg(myAddress,0x0A,dataPlusMask);  
}




void LCDI2C4Bit::print( int value ) {
  dataPlusMask |= 0x10; // RS
  WriteLCDByte(myAddress,(byte)value);
  dataPlusMask ^= 0x10; // RS
}

void LCDI2C4Bit::printIn( char value[] ) {
  for ( char *p = value; *p != 0; p++ ) 
    print(*p);
}

void LCDI2C4Bit::clear() {
  commandWrite(CMD_CLR);
}

void LCDI2C4Bit::cursorTo(int line_num, int x) {
  commandWrite(CMD_HOME);
  int targetPos = x + line_num * myWidth;
  for ( int i = 0; i &lt; targetPos; i++)
    commandWrite(0x14);
}

void LCDI2C4Bit::commandWrite( int command ) {
  // RS - leave low
  WriteLCDByte(myAddress,command);
  delay(1);
}


' />
	<debug />
	<components >
		<settings autoimg='1' center='1' unitscale='0' fixedscale='0' fixedx='1' fixedy='1' fixedz='1' headcode='0' />
		<definition guid='9dfc22ef-9ab9-41ce-9396-069d37453b5d' vstate='40' vmin='0' vmaj='1' srcleaf='' visiblename='' description='' category='' catenable='1' author='' manuname='' manucode='' sysinfo='0' keywords='' dynamic='0' iconpath='' />
		<component class_type='root' codename='panel' x='0' y='0' z='0' xsz='1' ysz='1' zsz='1' xang='0' yang='0' zang='0' xquat='0' yquat='0' zquat='0' wquat='1' visible='1' interactive='1' solid='1' layer='0' poslock='0' >
			<resources />
			<properties />
			<values />
			<events />
			<apis />
			<variables />
			<macros >
				<macro >
					<flowline name='OSCILLATOR_INITIALIZE' description='' >
						<return name='Return' type='v0' description='' isconst='0' isinit='0' usrinit='' setinit='' />
						<command class_type='native' title='C Code' ccode='{
    // CF=no clock failure; NOSC=PriPLL; SOSCEN=disabled; POSCEN=disabled; CLKLOCK=unlocked; OSWEN=Switch is Complete; IOLOCK=not-active; 
    OSCCONL = 0x0300;
    //
    // CPDIV=1:4; PLLEN=enabled; RCDIV=FRC/1; DOZE=1:1; DOZEN=disabled; ROI=disabled; 
    CLKDIV = 0x00A0;
    //
    // TUN=Center frequency; 
    OSCTUN = 0x0000;
    //
    // ROEN=disabled; ROSEL=disabled; RODIV=Base clock value; ROSSLP=disabled; 
    REFOCON = 0x0000;
    //
    // WDTO=disabled; TRAPR=disabled; SLEEP=disabled; BOR=disabled; DPSLP=disabled; CM=disabled; SWR=disabled; SWDTEN=disabled; EXTR=disabled; POR=disabled; IDLE=disabled; IOPUWR=disabled; VREGS=disabled; 
    RCON = 0x0000;
}' language='C' />
					</flowline>
				</macro>
				<macro >
					<flowline name='Main' description='' >
						<return name='Return' type='v0' description='' isconst='0' isinit='0' usrinit='' setinit='' />
						<command class_type='call' title='Call Macro' macro='OSCILLATOR_INITIALIZE' />
						<command class_type='call' title='Call Component Macro' component='I2C_Master1' macro='Initialise' />
						<command class_type='delay' title='Delay' exp='1' type='2' />
						<command class_type='call' title='Call Component Macro' component='lcd_I2C1' macro='Start' />
						<command class_type='delay' title='Delay' exp='1' type='2' />
						<command class_type='call' title='Call Component Macro' component='lcd_I2C1' macro='Clear' />
						<command class_type='delay' title='Delay' exp='1' type='2' />
						<command class_type='call' title='Call Component Macro' component='lcd_I2C1' macro='PrintString' >
							<argument exp='&quot;Hello World&quot;' />
						</command>
					</flowline>
				</macro>
			</macros>
			<component class_type='ref' guid='24219805-113d-4b12-b6bd-e1b0b0c33981' vmin='4' vmaj='1' codename='I2C_Master1' x='0' y='16' z='0.755' xsz='60' ysz='26' zsz='1.51' xang='0' yang='0' zang='0' xquat='0' yquat='0' zquat='0' wquat='1' visible='1' interactive='1' solid='1' layer='1' poslock='0' >
				<resources />
				<properties />
				<values >
					<value target='CHANNEL' data='001' />
					<value target='BAUD_LIST' data='001' />
					<value target='SRC' data='000' />
					<value target='SMB' data='000' />
					<value target='StopDelay' data='1' />
					<value target='BAUD' data='1000' />
					<value target='SDA' data='$PORTB.9' />
					<value target='SCL' data='$PORTB.8' />
					<value target='label' data='I2C Master' />
					<value target='ScopeTraces' data='0' />
					<value target='ConsoleData' data='' />
					<value target='Injector' data='000' />
					<value target='InjectorHandle' data='' />
				</values>
				<events />
				<apis />
				<variables />
				<macros />
			</component>
			<component class_type='ref' guid='bcd6a955-12c6-4ed4-a22f-f16eb62e0762' vmin='1' vmaj='1' codename='lcd_I2C1' x='0' y='-24' z='3.575' xsz='1' ysz='1' zsz='1' xang='0' yang='0' zang='0' xquat='0' yquat='0' zquat='0' wquat='1' visible='1' interactive='1' solid='1' layer='1' poslock='0' >
				<resources />
				<properties />
				<values >
					<value target='Channel' data='001' />
					<value target='SDA' data='$PORTB.9' />
					<value target='SCL' data='$PORTB.8' />
					<value target='Address' data='32' />
					<value target='Rows' data='004' />
					<value target='Columns' data='020' />
				</values>
				<events />
				<apis />
				<variables />
				<macros />
			</component>
		</component>
	</components>
	<keymap />
	<panel2d shadows='0' lighting='0' brightness='256' perspective='0' >
		<background rgb='16777215' img='' style='0' />
		<camera xe='0' ye='0' ze='300' xt='0' yt='0' zt='0' xquat='0' yquat='0' zquat='0' wquat='1' />
	</panel2d>
	<panel3d shadows='0' lighting='2' brightness='0' perspective='0' >
		<background rgb='8409120' img='' style='0' />
		<table rgb='7360576' img='' style='0' size='25' />
		<camera xe='0' ye='0' ze='300' xt='0' yt='0' zt='0' xquat='0' yquat='0' zquat='0' wquat='1' />
	</panel3d>
	<layout >
		<view type='0' name='Main' mode='0' placement='LAAAAAAAAAABAAAA---------------------wAAAAAUAAAAfAQAAAoDAAA' zoom='75' scrollx='0' scrolly='0' flags='0' />
		<view type='0' name='OSCILLATOR_INITIALIZE' mode='0' placement='LAAAAAAAAAABAAAA---------------------wAAAAAUAAAAfAQAAAoDAAA' zoom='75' scrollx='0' scrolly='0' flags='0' />
	</layout>
</document>
</root>
