Jason, Here is some working 'C' code for setting up an HD44780 based LCD. Compare to yours the general idea. Note I always send the character position as the first byte of a display array. This is just my way of doing things, but that is why RS is changed in the data send function. const char initLCD[]={0x33,0x32,0x28,0x01,0x02,0x0D,0};//spot the fact you use 0x3C when 0x03 has to be sent twice to switch to 4 bit mode. /Library file for LCD and VFD displays that are HD44780 compliant // //Copyright C D Barnard 12/01/2003 //V1.01 //12/3/2003 amended init wait time from 40uS to 1mS to cover all LCD's //12/11/2008 added decimal point to disp_num for incubator project #define TOP #include #include "incubator_lcd.h" #include //compiler provided library #ifndef LCDPORT #define LCDPORT PORTB #endif #ifndef ENPORT #define ENPORT PORTB #endif #ifndef RSPORT #define RSPORT PORTB #endif //**************************************************************** // #define TOP = top nibble of port, not defined bottom nibble void disp_init(unsigned char *tmpPtr) { unsigned char currentCH; rs=0; Wait(20); //Delay 20mS to enable LCD to initialise #ifdef TOP while(*tmpPtr) { currentCH=*tmpPtr; LCDPORT&=0x0F; LCDPORT|=(currentCH&0xF0); sendit(rs); //swap nibble currentCH<<=4; LCDPORT&=0x0F; LCDPORT|=currentCH; sendit(rs); Wait(1); tmpPtr++;// increment pointer to next character in array } #else while(*tmpPtr) { currentCH=*tmpPtr; LCDPORT&=0xF0; LCDPORT|=(currentCH&0x0F); sendit(rs); currentCH>>=4; LCDPORT|=currentCH; sendit(rs); Wait(1); tmpPtr++; } #endif } //#endif //#ifdef _display void display(unsigned char *tmpPtr) { unsigned char currentCH; rs=0; //RS in Command mode for position byte #ifdef TOP while(*tmpPtr) //LCD Data on bits D4-D7 of PORT { currentCH=*tmpPtr; LCDPORT&=0x0F; LCDPORT|=(currentCH&0xF0); //Mask off upper nibble sendit(rs); currentCH<<=4; //Now select lower nibble LCDPORT&=0x0F; LCDPORT|=currentCH; sendit(rs); t40(); rs=1; //make sure RS is in data mode tmpPtr++; //get next character //#asmline clrwdt } #else while(*tmpPtr) //LCD Data on bits D0->D3 of PORT { currentCH=*tmpPtr; LCDPORT&=0xF0; LCDPORT|=(currentCH&0x0F); sendit(rs); currentCH>>=4; LCDPORT|=currentCH; sendit(rs); t40(); tmpPtr++; } #endif } Colin -- cdb, colin@btech-online.co.uk on 3/05/2010 Web presence: www.btech-online.co.uk Hosted by: www.1and1.co.uk/?k_id=7988359 -- http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist