/*---------------------------------------------------------------------------
 * Dateiname   : lcd.c
 * Version     : 0.3
 * Zweck       : Display Messages
 * Organiation : Fachhochschule Hamburg
 * Autor       : Clemens Drews
 * Datum       : 30.11.97
 * Änderung    : beep.h für den prototypen von delay eingebunden
 *---------------------------------------------------------------------------
 */

#include <lcd.h>
#include <bsp.h>
#include <string.h>
#include <sem.h>

#define LCD_RS	BIT8
#define LCD_RW	BIT9
#define LCD_EN	BIT10
#define LCD_FUNCTION_SET	0x38
#define LCD_SET_RAMADDRESS	0x80
#define LCD_LINE_ONE_ADRESS	0x00
#define LCD_LINE_TWO_ADRESS	0x40
#define LCD_SET_DISPLAY_ON	0x0E
#define LCD_SET_DISPLAY_OFF	0x08
#define LCD_SET_SHIFT_MODE	0x1C
#define LCD_SET_ENTRY_MODE	0x06
#define LCD_CLEAR_DISPLAY	0x01 
#define LCD_HOME_CURSOR		0x02

static volatile UWORD * lcd = (UWORD*)0x80000 ;

sem_t lcd_sem ;


/* int lcd_print( char * str ){ */
/*   Ausgabe des Strings auf dem LCD Display */
/*   int i ; */
/*   lcd_command(LCD_CLEAR_DISPLAY) ; */
/*   lcd_command(LCD_HOME_CURSOR) ; */
/*   for( i = 0 ; i < strlen(str) ; i ++ ){ */
/*     if(str[i]=='\n'){ */
/*       lcd_command( LCD_SET_RAMADDRESS|LCD_LINE_TWO_ADRESS) ; */
/*     } */
/*     else */
/*       lcd_write( str[i] ) ; */
/*   } */
/*   return i+1 ; */
/* } */

static void lcd_command( UBYTE command ){
  *lcd = (UWORD) command | LCD_EN ;
  *lcd = (UWORD) command & (UWORD)0x00ff ;
  *lcd = (UWORD) command | LCD_EN;
  delay(1) ;
}


void lcd_init(){
/*   sem_init(&lcd_sem); */
/*   sem_v(&lcd_sem); */
  lcd_command( LCD_FUNCTION_SET ) ;	
  lcd_command( LCD_FUNCTION_SET ) ;	
  lcd_command( LCD_FUNCTION_SET ) ;	
  lcd_command( LCD_FUNCTION_SET ) ;
  lcd_command( LCD_FUNCTION_SET ) ;	
  delay(4);
  lcd_command( 0x0C ) ;	
  lcd_command( 0x01 ) ;
}


void lcd_write( UBYTE ch ){
/*   sem_p(&lcd_sem); */
  if(ch =='\n'){
    lcd_command( LCD_SET_RAMADDRESS|LCD_LINE_TWO_ADRESS) ;
  }else{
    * lcd = ((UWORD)0x00ff & (UWORD)ch) |LCD_RS| LCD_EN ;
    * lcd = ((UWORD)0x00ff & (UWORD)ch) |LCD_RS;
    * lcd = ((UWORD)0x00ff & (UWORD)ch) |LCD_RS| LCD_EN;
    delay(1) ;
  }
/*   sem_v(&lcd_sem); */
}

