#include "lcd.h"
unsigned char BF;
void LCD_Init(void){
if(ENDIAN == LOWER)
BF = LOWEND;
else
BF = UPPEND;
}
void LCD_DATA(unsigned char data,unsigned char type){
#ifdef LCD_RW //IF THE LCD_RW DEFINITION IS USED
WaitLCDBusy(); //TEST LCD FOR BUSY
#endif //IF NOT SMALL DELAY AFTER
if(type == CMD){
LCD_RS = 0; //COMMAND MODE
} else {
LCD_RS = 1; //CHARACTER/DATA MODE
}
LCD_NYB(data>>4); //WRITE THE UPPER NIBBLE
LCD_NYB(data); //WRITE THE LOWER NIBBLE
#ifndef LCD_RW
if(type == CMD){ //IF TYPE = COMMAND
DelayUs(2000); //DELAY 2 MilliSeconds
} else { //IF TYPE = DATA
DelayUs(50); //DELAY 50 MicroSeconds
}
#endif
}
#ifdef LCD_RW
void WaitLCDBusy(void){
LCD_RS=0; //COMMAND MODE
LCD_RW=1; //READ MODE
if(ENDIAN == LOWER){ //ENDIAN = 0?
LCD_TRIS |= LOWMSK; //YES = SET LOWER NIBBLE INPUT
} else { //ELSE ENDIAN = 1
LCD_TRIS |= UPPMSK; //SET UPPER NIBBLE INPUT
}
LCD_E=1; //ENABLE LCD DATA LINES
while(LCD_DAT & BF); //TEST BUSY FLAG BIT
LCD_E=0; //DISABLE LCD DATA LINES
if(ENDIAN == LOWER){ //ENDIAN = 0?
LCD_TRIS &= UPPMSK; //YES = SET LOWER NIBBLE OUTPUT
} else { //ELSE ENDIAN = 1
LCD_TRIS &= LOWMSK; //SET UPPER NIBBLE OUTPUT
}
LCD_RW=0;
}
#endif
void LCD_NYB(unsigned char nyb){
if(ENDIAN == LOWER){ //ENDIAN = 0? Yes Send the data LOWER
LCD_PORT &= UPPMSK; //CLEAR LOWER PORT NIBBLE
LCD_PORT |= (nyb & LOWMSK); //SEND DATA LINE THE INFO
} else { //ENDIAN = 1 so send to HIGHER
LCD_PORT &= LOWMSK; //CLEAR UPPER PORT NIBBLE
LCD_PORT |= ((nyb << 4) & UPPMSK); //SHIFT DATA OVER << 4, CLEAR LOWER NIBBLE
}
LCD_E = 1; //ENABLE LCD DATA LINE
LCD_E = 0; //DISABLE LCD DATA LINE
}
void DelayUs(unsigned long time){
unsigned long timetemp;
unsigned long x;
timetemp = (( 1 / MYFOSC) * time);
for(x=0;x<timetemp;x++){
Nop();
}
}