#include <system.h>
#include "lcd3.h"
void ShiftOut(char serdata)
{
for ( bitcnt = 0; bitcnt < 8; bitcnt++ )
{
if (serdata & 10000000b)
{
//delay_us(45);
set_bit(porta, PinSrData);
}
else clear_bit(porta, PinSrData);
clear_bit(porta, PinSrClk); //Strobe Serial Clock
delay_us(2);
set_bit(porta, PinSrClk);
serdata <<= 1;
}
clear_bit(porta, PinLatch); //Strobe Parallel Latch
delay_us(2);
set_bit(porta, PinLatch);
}
void FuncMode(void)
{
clear_bit(sdata, RS);
ShiftOut(sdata);
delay_us(2);
}
void DatMode(void)
{
set_bit(sdata, RS);
ShiftOut(sdata);
delay_us(2);
}
void LcdSetup(void)
{
set_bit(STATUS, RP0); // select the register bank 1
clear_bit(trisa,PinSrClk);
clear_bit(trisa,PinSrData);
clear_bit(trisa,PinLatch);
clear_bit(STATUS, RP0);
clear_bit(porta,PinSrClk);
clear_bit(porta,PinSrData);
clear_bit(porta,PinLatch);
sdata = 0;
FuncMode();
LCD8Bit( system_set_4_bit ); /* This sequence resets the LCD */
delay_ms(5);
LCD8Bit( system_set_4_bit );
delay_ms(5);
LCD8Bit( system_set_4_bit );
delay_ms(5);
LCD4Bit( system_set_4_bit );
delay_ms(2);
LCD4Bit( display_off );
delay_ms(2);
LCD4Bit( entry_mode );
delay_ms(2);
LCD4Bit( display_on );
delay_ms(2);
LCD4Bit( set_dd_ram );
delay_ms(2);
LCD4Bit(clear_lcd);
DatMode();
}
void LCD8Bit(char ebit)
{
if (ebit & 0x80)
set_bit(sdata,PinLCD_DATA_7);
else clear_bit(sdata,PinLCD_DATA_7);
if (ebit & 0x40)
set_bit(sdata,PinLCD_DATA_6);
else clear_bit(sdata,PinLCD_DATA_6);
if (ebit & 0x20)
set_bit(sdata,PinLCD_DATA_5);
else clear_bit(sdata,PinLCD_DATA_5);
if (ebit & 0x10)
set_bit(sdata,PinLCD_DATA_4);
else clear_bit(sdata,PinLCD_DATA_4);
ShiftOut(sdata);
delay_us(2);
set_bit(sdata,EN);
ShiftOut(sdata);
delay_us(2);
clear_bit(sdata,EN);
ShiftOut(sdata);
delay_us(2);
}
void LCD4Bit(char fbit)
{
//for (lc = 0; lc = 2; lc++)
{
if (fbit & 0x80)
set_bit(sdata,PinLCD_DATA_7);
else clear_bit(sdata,PinLCD_DATA_7);
if (fbit & 0x40)
set_bit(sdata,PinLCD_DATA_6);
else clear_bit(sdata,PinLCD_DATA_6);
if (fbit & 0x20)
set_bit(sdata,PinLCD_DATA_5);
else clear_bit(sdata,PinLCD_DATA_5);
if (fbit & 0x10)
set_bit(sdata,PinLCD_DATA_4);
else clear_bit(sdata,PinLCD_DATA_4);
ShiftOut(sdata) ;
// delay_us(2);
set_bit(sdata,EN);
ShiftOut(sdata);
// delay_us(2);
clear_bit(sdata,EN);
ShiftOut(sdata);
// delay_us(2);
fbit <<= 4;
//}
if (fbit & 0x80)
set_bit(sdata,PinLCD_DATA_7);
else clear_bit(sdata,PinLCD_DATA_7);
if (fbit & 0x40)
set_bit(sdata,PinLCD_DATA_6);
else clear_bit(sdata,PinLCD_DATA_6);
if (fbit & 0x20)
set_bit(sdata,PinLCD_DATA_5);
else clear_bit(sdata,PinLCD_DATA_5);
if (fbit & 0x10)
set_bit(sdata,PinLCD_DATA_4);
else clear_bit(sdata,PinLCD_DATA_4);
ShiftOut(sdata) ;
// delay_us(2);
set_bit(sdata,EN);
ShiftOut(sdata);
// delay_us(2);
clear_bit(sdata,EN);
ShiftOut(sdata);
// delay_us(2);
}
void LcdSetPos(char Pos)
{
FuncMode();
LCD4Bit( 0x80 + Pos );
DatMode();
}
void LcdWrite( const char *lcdptr )
{
char pi;
char ch;
pi = 0;
while(lcdptr[pi] != 0)
{
ch = lcdptr[pi++];
LCD4Bit(ch);
}
}
void LcdInt(int n)
{
if(n>99)
LCD4Bit(((n/100)%10)+'0');
if(n>9)
LCD4Bit(((n/10)%10)+'0');
LCD4Bit((n%10)+'0');
}
Copyright © 2002-2006 SourceBoost Technologies