LCD display

Dependents:   LAB05_Oppgave4

Fork of LCDLib by Rune Langoy

TextLCD.cpp

Committer:
rlanghbv
Date:
2015-09-20
Revision:
2:f0a520c95838
Parent:
1:8902f6be12a5
Child:
3:d2f70de20dbe

File content as of revision 2:f0a520c95838:

/*
 * LCD.c
 *
 * Created: 20.01.2012 13:05:38
 *  Author: rul
 */

#include "mbed.h"
#include "LCD_IO_MAP.h"
#include "TextLCD.h"

#define SET_EN() (LCD_EN=1)
#define SET_RS() (LCD_RS=1)
#define SET_RW() (LCD_RW=1)

#define CLEAR_EN() (LCD_EN=0)
#define CLEAR_RS() (LCD_RS=0)
#define CLEAR_RW() (LCD_RW=0)


//Enables the LCD Module for use 2-Lines...
TextLCD::TextLCD()
{
    CLEAR_EN(); //EN =0
    wait_ms(500);

    init_4BitMode2LinesDisplayOn();  //enabler 4 bit mode
    wait_us(100);

    lcdComand(0x28);//(0b0010 1000);	// 4- bit mode   LCD 2 line 5x7 Matrix
    wait_us(100);
    lcdComand(0xE);//(0b0000 1110);  //Hva gjør vi her ?
    wait_us(100);
    lcdComand(0x01); //(0b00000001); //Hva gjør vi her ?
    wait_us(100);
    lcdComand(0x06);//(0b00000110);  //Hva gjør vi her ?
    wait_us(100);
}


// Causes the LCD-module to read the data on the data input pins
void TextLCD::pulseEn()
{
    SET_EN();		// EN = 1 for L-to-H /
    wait_us(200);
    CLEAR_EN();		// EN = 0 for H-to-L
}

//Writes the low lible of data to the LCD-module data pins D4 to D7
void TextLCD::writeLcdBitD4toD7(char data)
{
    if ( ( data >> 3) & 0x01) LCD_D7=1;
    else  LCD_D7=0;
    if ( ( data >> 2) & 0x01) LCD_D6=1;
    else  LCD_D6=0;
    if ( ( data >> 1) & 0x01) LCD_D5=1;
    else  LCD_D5=0;
    if (  data  & 0x01)  LCD_D4=1;
    else  LCD_D4=0;
}

//Enable 4 bit mode  From KS0066U Documentation
void TextLCD::init_4BitMode2LinesDisplayOn()
{
    //Start by selecting configuration mode
    CLEAR_RS();
    CLEAR_RW();

    //Enable 4 bit mode  From KS0066U Documentation
    writeLcdBitD4toD7(0x2);//(0b0010);   // Select 4- bit start
    pulseEn();	//LCD exec function
    wait_us(100);

    writeLcdBitD4toD7(0x2);////(0b0010);   // Select 4- bit start  (Already on the out port no need to write once more )
    pulseEn();	//LCD exec function
    wait_us(100);

    writeLcdBitD4toD7(0xC);//(0b1100);   // 2 Lines + Disp On
    pulseEn();	//LCD exec function
    wait_us(100);
}


//Writes the byte comand to the LCD-module using 4 bits mode
void TextLCD::lcdComand(unsigned char cmd)
{
    writeLcdBitD4toD7(cmd>>4); //Write the first high cmd nibble

    CLEAR_RS();		// RS = 0 for command
    CLEAR_RW();		// RW = 0 for write

    pulseEn();  //EN Hi-Lo

    writeLcdBitD4toD7(cmd); //Write the second low cmd nibble

    pulseEn();  //EN H to Lo

    wait_us(100); //wait
}

void TextLCD::lcdData(unsigned char data)
{
    writeLcdBitD4toD7(data>>4); //Write the first high data nibble

    SET_RS();       // RS = 1 for data
    CLEAR_RW();     // RW = 0 for write
    pulseEn();      // EN H to Lo
    wait_us(100); //wait

    writeLcdBitD4toD7(data);

    pulseEn();  //EN H to Lo
    wait_us(100); //wait
}



//Moves cursor to the X,Y position
void TextLCD::gotoxy(int x, int y)
{
    unsigned char firstCharAdr[]= { 0x80,0xc0,0x94,0xD4};
    lcdComand(firstCharAdr[y-1]+ x -1);

    wait_us(100);
}

int TextLCD::_putc(int value)
{
    lcdData(value);
    return value;
}

int TextLCD::_getc() {
    return -1;
}

//Writes a string to the LCD Display
void TextLCD::lcd_print(char *str)
{
    unsigned char i =0;
    while(str[i] !=0) {
        lcdData(str[i]);
        i++;
    }
}