Updated library to work with the FRDM KL25Z board. Original code downloaded from DFRobot. Warning. For the 5 way switch to work correctly the LCD4884 shiled needs to be modified. The PCB line between resistor 202 and 102 just bellow the RED power LED needs to be cut and a connection from the 202 resistor to the 3V3 pin needs to be made.

Dependents:   FRDM_LCD4884

LCD4884.cpp

Committer:
COX
Date:
2013-03-09
Revision:
0:28f3c9274ea7

File content as of revision 0:28f3c9274ea7:

/*
Modified by COX
version 0.1

Editor     : COX
Date       : 06.03.2013

*
* Update DFRobot source to work on FRDM KL25Z
*
*/

#include "LCD4884.h"
#include "font_6x8.h"
#include "font_big.h"

DigitalOut SpiClk(SPI_SCK);    //2- Serial Clock(Master Output)
DigitalOut SpiMosi(SPI_MOSI);  //3- Master Output,Slave Input
DigitalOut LcdDC(LCD_DC);      //4- Data/Command(command active low)
DigitalOut SpiCS(SPI_CS);      //5- Chip Select,Slave Transmit Enable(active low,Master Output)
DigitalOut LcdRst(LCD_RST);    //6- One Reset button
PwmOut     LcdBl(LCD_BL);      //7- LCD backlight

LCD4884::LCD4884()
{};

/******************************************************************/
void LCD4884::backlight(float dat)
{
    LcdBl = dat;
}

/******************************************************************/
void LCD4884::LCD_init(void)
{
    /* pin intializer */
    SpiClk = LOW;
    SpiMosi = LOW;
    SpiCS = LOW;
    LcdDC = LOW;
    LcdBl = LOW;

    LcdRst = LOW;
    wait(ONE_US);
    LcdRst = HIGH;
    
    SpiCS = LOW;  //Chip Select, Slave Transmit Enable(active low, Master Output)
    wait(ONE_US);
    SpiCS = HIGH;
    wait(ONE_US);
    LcdBl = LCD_INITIAL_BRIGHTNESS;
    
    //data_type=0, all are command bytes
    LCD_write_byte(0x21, 0); //Function Set:0 0 1 0 0 PD V H=0010 0001;PD=0,V=0,H=1;
    LCD_write_byte(0xc0, 0); //Set Vop:1 Vop6 Vop5 Vop4 Vop3 Vop2 Vop1 Vop0=1100 0000
    LCD_write_byte(0x06, 0); //Set Temperature Coefficient:0 0 0 0 0 1 Tc1 Tc0=0000 0110;Tc1=1,Tc0=0(Vlcd temperature coefficient 2)
    LCD_write_byte(0x13, 0); //Set Bias System (BSx):0 0 0 1 0 BS2 BS1 BS0=0001 0011;BS2=0, BS1=1, BS0=1==>N=4,MUX RATE=1:48

    LCD_write_byte(0x20, 0);//Function Set:0 0 1 0 0 PD V H=0010 0000;PD=0,V=0,H=0;
    LCD_clear();
    LCD_write_byte(0x0c, 0);//Display Control: 0 0 0 0 1 D 0 E=0000 1100 ;D=1,E=0:normal mode

    SpiCS = LOW;
}

/******************************************************************/
void LCD4884::LCD_write_byte(unsigned char dat, unsigned char dat_type)
{
    unsigned int i;
    SpiCS = LOW; //Chip Enable:Active LOW

    if (dat_type == 0)
        LcdDC = LOW; // D/C=0:the current data byte is interpreted as command byte
    else
        LcdDC = HIGH; // D/C=1:write data to display RAM

    for(i=0;i<8;i++)
    {
        if(dat&0x80) //1000 0000
        {
            SpiMosi = HIGH;
        }
        else
        {
            SpiMosi = LOW;
        }
        SpiClk = LOW;
        dat = dat << 1;
        SpiClk = HIGH;
    }
    SpiCS = HIGH;
}

/******************************************************************/
void LCD4884::LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
                  unsigned char Pix_x,unsigned char Pix_y)
{
    unsigned int i,n;
    unsigned char row;

    if (Pix_y%8==0)
        row=Pix_y/8; //row from 1 to 6;Pix_y from R0 to R47
    else
        row=Pix_y/8+1; //Quotient+1
    
    for (n=0;n<row;n++)
    {
        LCD_set_XY(X,Y);
        for(i=0; i<Pix_x; i++)
        {
            LCD_write_byte(map[i+n*Pix_x], 1); // D/C=1:write data to display RAM
        }
        Y++;
    }
}

/**************************************************************************************/
void LCD4884::LCD_write_string(unsigned char X,unsigned char Y,char *s, char mode)
{
    LCD_set_XY(X,Y);
    while (*s)
    {
        LCD_write_char(*s, mode);
        s++;
    }
}

/**************************************************************************************/
void LCD4884::LCD_prop_write_string(unsigned char X,unsigned char Y,char *s, char mode)
{
    LCD_set_XY(X,Y);
    while (*s)
    {
        LCD_prop_write_char(*s, mode);
        s++;
    }
}

/*************************************************************************************/
void LCD4884::LCD_write_chinese(unsigned char X, unsigned char Y,unsigned char *c,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row)
{
    unsigned char i,n;
    LCD_set_XY(X,Y);                             
    for (i=0;i<num;)
    {
        for (n=0; n<ch_with*2; n++)
        {
            if (n==ch_with)
            {
                if (i==0)
                    LCD_set_XY(X,Y+1);
                else
                  LCD_set_XY((X+(ch_with+row)*i),Y+1);
            }
            LCD_write_byte(c[(i*ch_with*2)+n],1);
        }
        i++; 
        LCD_set_XY((X+(ch_with+row)*i),Y); 
    }
}


/******************************************************************/
void LCD4884::LCD_write_string_big ( unsigned char X,unsigned char Y, char *string, char mode )
{
    while ( *string )
    {
        LCD_write_char_big( X, Y, *string , mode );
        
        if(*string++ == '.')
            X += 5;
        else
            X += 12;
    }
}

/******************************************************************/
/* write char in big font */
void LCD4884::LCD_write_char_big (unsigned char X,unsigned char Y, unsigned char ch, char mode)
{
   unsigned char i, j;
   unsigned char *pFont;
   unsigned char ch_dat;
   
   pFont = (unsigned char *) big_number;
   
   if(ch == '.')
        ch = 10;
   else if (ch == '+')
        ch = 11;
   else if (ch == '-')
        ch = 12;
   else
        ch = ch & 0x0f;

   for(i=0;i<3;i++)
   {
        LCD_set_XY ( X, Y+i);

        for(j=0; j<16; j++)
        {
            ch_dat = *(pFont+ch*48 + i*16 +j);
            LCD_write_byte( (mode == MENU_NORMAL)? ch_dat : (ch_dat^0xff), 1);
        }
   }
}
  
/******************************************************************/
void LCD4884::LCD_write_char(unsigned char c, char mode)
{
    unsigned char line;
    unsigned char *pFont;
    unsigned char ch; 
    
    pFont = (unsigned char *)font6_8; //pointer *pFont points at font6_8[][6]
    c -= 32; // the ASCII of "SP" is 32

    for (line=0; line<6; line++)
    {
        ch = *(pFont+c*6+line); //read c from the font6_8[][6] (the detail information is in the "font6x8.h")
        LCD_write_byte( (mode==MENU_NORMAL)? ch: (ch^ 0xff) , 1); //MENU_NORMAL=0,True:return ch;False:return ch
    }
}

/*******************************************************************/
unsigned char LCD4884::LCD_prop_write_char(unsigned char c, char mode)
{
    int line, line_s=0, line_e=2;
    unsigned char *pFont;
    unsigned char ch;

    pFont = (unsigned char *)font6_8;
    if (c -= 32)
    {
        for (line_s=0; line_s<6; line_s++)
        {
            if(*(pFont+c*6+line_s))
                break;
        }
        for (line_e=5; line_e<0; line_e--)
        {
            if(*(pFont+c*6+line_e))
                break;
        }
    }
    for (line=line_s; line<line_e+1; line++)
    {
        ch = *(pFont+c*6+line);
        LCD_write_byte( (mode==MENU_NORMAL)? ch: (ch^ 0xff) , 1);
    }
    LCD_write_byte( (mode==MENU_NORMAL)? 0:0xff, 1);
    return ((unsigned char)(line_e+2 - line_s));
}

/******************************************************************/
void LCD4884::LCD_set_XY(unsigned char X, unsigned char Y)
{
    LCD_write_byte(0x40 | Y, 0);        // column
    LCD_write_byte(0x80 | X, 0);        // row
}

/******************************************************************/
void LCD4884::LCD_clear(void)
{
    unsigned int i;

    LCD_write_byte(0x0c, 0);
    LCD_write_byte(0x80, 0);

    for (i=0; i<504; i++)  //6*84
    {
        LCD_write_byte(0, 1);
    }
}