GPS Tracker with a TFT display, GPLV3

Dependencies:   MAX17055 MAX32620FTHR MAX77650 SerialGPS

LCD_Driver.cpp

Committer:
DimiterK
Date:
2018-08-18
Revision:
0:48d0ba737b93

File content as of revision 0:48d0ba737b93:


/***********************************************************************************************************************
* | file        :   LCD_Driver.c
* | version     :   V1.0
* | date        :   2017-10-16
* | function    :   On the ST7735S chip driver and clear screen, drawing lines, drawing, writing
                    and other functions to achieve
***********************************************************************************************************************/

#include "LCD_Driver.h"

#include <stdlib.h>     //itoa()
#include <stdio.h>
#include "fonts.h"

LCD_DIS sLCD_DIS;

/***********************************************************************************************************************
            ------------------------------------------------------------------------
            |\\\                                                                ///|
            |\\\                        Drive layer                             ///|
            ------------------------------------------------------------------------
***********************************************************************************************************************/
/*******************************************************************************
function:
            Hardware reset
*******************************************************************************/
SPI spi0(P0_5, P0_6, P0_4); // mosi, miso, sclk

DigitalOut cs0(P0_7);
DigitalOut rst(P1_5);
DigitalOut dc(P1_4);

static void LCD_Reset(void)
{
    RST_HIGH();
    wait_ms(100);
    RST_LOW();
    wait_ms(100);
    RST_HIGH();
    wait_ms(100);
}

/*******************************************************************************
function:
        Write register address and data
*******************************************************************************/
static void LCD_WriteReg(uint8_t Reg)
{
    DC_LOW();
    cs0 = 0;    
    spi0.write(Reg);    
    cs0 = 1;
}

static void LCD_WriteData_8Bit(uint8_t Data)
{
    DC_HIGH();
    cs0 = 0;    
    spi0.write(Data);
    cs0 = 1;
}


static void LCD_WriteData_NLen16Bit(uint16_t Data,uint32_t DataLen)
{
    uint32_t i;
    DC_HIGH();
    cs0 = 0;    
    for(i = 0; i < DataLen; i++) {
        spi0.write( (uint8_t)(Data >> 8) );
        spi0.write((uint8_t)(Data & 0XFF) );
    }
    cs0 = 1;
}

/*******************************************************************************
function:
        Common register initialization
*******************************************************************************/
static void LCD_InitReg(void)
{
    spi0.frequency(4000000);
    cs0 = 1;
    
    //ST7735R Frame Rate
    LCD_WriteReg(0xB1);
    LCD_WriteData_8Bit(0x01);
    LCD_WriteData_8Bit(0x2C);
    LCD_WriteData_8Bit(0x2D);

    LCD_WriteReg(0xB2);
    LCD_WriteData_8Bit(0x01);
    LCD_WriteData_8Bit(0x2C);
    LCD_WriteData_8Bit(0x2D);

    LCD_WriteReg(0xB3);
    LCD_WriteData_8Bit(0x01);
    LCD_WriteData_8Bit(0x2C);
    LCD_WriteData_8Bit(0x2D);
    LCD_WriteData_8Bit(0x01);
    LCD_WriteData_8Bit(0x2C);
    LCD_WriteData_8Bit(0x2D);

    LCD_WriteReg(0xB4); //Column inversion
    LCD_WriteData_8Bit(0x07);

    //ST7735R Power Sequence
    LCD_WriteReg(0xC0);
    LCD_WriteData_8Bit(0xA2);
    LCD_WriteData_8Bit(0x02);
    LCD_WriteData_8Bit(0x84);
    LCD_WriteReg(0xC1);
    LCD_WriteData_8Bit(0xC5);

    LCD_WriteReg(0xC2);
    LCD_WriteData_8Bit(0x0A);
    LCD_WriteData_8Bit(0x00);

    LCD_WriteReg(0xC3);
    LCD_WriteData_8Bit(0x8A);
    LCD_WriteData_8Bit(0x2A);
    LCD_WriteReg(0xC4);
    LCD_WriteData_8Bit(0x8A);
    LCD_WriteData_8Bit(0xEE);

    LCD_WriteReg(0xC5); //VCOM
    LCD_WriteData_8Bit(0x0E);

    //ST7735R Gamma Sequence
    LCD_WriteReg(0xe0);
    LCD_WriteData_8Bit(0x0f);
    LCD_WriteData_8Bit(0x1a);
    LCD_WriteData_8Bit(0x0f);
    LCD_WriteData_8Bit(0x18);
    LCD_WriteData_8Bit(0x2f);
    LCD_WriteData_8Bit(0x28);
    LCD_WriteData_8Bit(0x20);
    LCD_WriteData_8Bit(0x22);
    LCD_WriteData_8Bit(0x1f);
    LCD_WriteData_8Bit(0x1b);
    LCD_WriteData_8Bit(0x23);
    LCD_WriteData_8Bit(0x37);
    LCD_WriteData_8Bit(0x00);
    LCD_WriteData_8Bit(0x07);
    LCD_WriteData_8Bit(0x02);
    LCD_WriteData_8Bit(0x10);

    LCD_WriteReg(0xe1);
    LCD_WriteData_8Bit(0x0f);
    LCD_WriteData_8Bit(0x1b);
    LCD_WriteData_8Bit(0x0f);
    LCD_WriteData_8Bit(0x17);
    LCD_WriteData_8Bit(0x33);
    LCD_WriteData_8Bit(0x2c);
    LCD_WriteData_8Bit(0x29);
    LCD_WriteData_8Bit(0x2e);
    LCD_WriteData_8Bit(0x30);
    LCD_WriteData_8Bit(0x30);
    LCD_WriteData_8Bit(0x39);
    LCD_WriteData_8Bit(0x3f);
    LCD_WriteData_8Bit(0x00);
    LCD_WriteData_8Bit(0x07);
    LCD_WriteData_8Bit(0x03);
    LCD_WriteData_8Bit(0x10);

    LCD_WriteReg(0xF0); //Enable test command
    LCD_WriteData_8Bit(0x01);

    LCD_WriteReg(0xF6); //Disable ram power save mode
    LCD_WriteData_8Bit(0x00);

    LCD_WriteReg(0x3A); //65k mode
    LCD_WriteData_8Bit(0x05);

}


/********************************************************************************
function:   Set the display scan and color transfer modes
parameter:
        Scan_dir   :   Scan direction
        Colorchose :   RGB or GBR color format
********************************************************************************/
void LCD_SetGramScanWay(LCD_SCAN_DIR Scan_dir)
{
    //Get the screen scan direction
    sLCD_DIS.LCD_Scan_Dir = Scan_dir;

    //Get GRAM and LCD width and height
    if(Scan_dir == L2R_U2D || Scan_dir == L2R_D2U || Scan_dir == R2L_U2D || Scan_dir == R2L_D2U) {
        sLCD_DIS.LCD_Dis_Column = LCD_HEIGHT ;
        sLCD_DIS.LCD_Dis_Page = LCD_WIDTH ;
    } else {
        sLCD_DIS.LCD_Dis_Column = LCD_WIDTH ;
        sLCD_DIS.LCD_Dis_Page = LCD_HEIGHT ;
    }

    // Gets the scan direction of GRAM
    uint16_t MemoryAccessReg_Data=0;  //0x36
    switch (Scan_dir) {
    case L2R_U2D:
        MemoryAccessReg_Data = 0X00 | 0x00;//x Scan direction | y Scan direction
        break;
    case L2R_D2U:
        MemoryAccessReg_Data = 0x00 | 0x80;//0xC8 | 0X10
        break;
    case R2L_U2D:// 0X4
        MemoryAccessReg_Data = 0x40 | 0x00;
        break;
    case R2L_D2U:// 0XC
        MemoryAccessReg_Data = 0x40 | 0x80;
        break;
    case U2D_L2R://0X2
        MemoryAccessReg_Data = 0X00 | 0X00 | 0x20;
        break;
    case U2D_R2L://0X6
        MemoryAccessReg_Data = 0x00 | 0X40 | 0x20;
        break;
    case D2U_L2R://0XA
        MemoryAccessReg_Data = 0x80 | 0x00 | 0x20;
        break;
    case D2U_R2L://0XE
        MemoryAccessReg_Data = 0x40 | 0x80 | 0x20;
        break;
    }

    //please set (MemoryAccessReg_Data & 0x10) != 1
    if((MemoryAccessReg_Data && 0x20) != 1) {
        sLCD_DIS.LCD_X_Adjust = LCD_X;
        sLCD_DIS.LCD_Y_Adjust = LCD_Y;
    } else {
        sLCD_DIS.LCD_X_Adjust = LCD_Y;
        sLCD_DIS.LCD_Y_Adjust = LCD_X;
    }

    // Set the read / write scan direction of the frame memory
    LCD_WriteReg(0x36); //MX, MY, RGB mode
#if defined(LCD_1IN44)
    LCD_WriteData_8Bit( MemoryAccessReg_Data | 0x08);   //0x08 set RGB
#elif defined(LCD_1IN8)
    LCD_WriteData_8Bit( MemoryAccessReg_Data & 0xf7);   //RGB color filter panel
#endif

}

/***********************************************************************************************************************
            ------------------------------------------------------------------------
            |\\\                                                                ///|
            |\\\                        App layer                               ///|
            ------------------------------------------------------------------------
***********************************************************************************************************************/

/********************************************************************************
function:
            initialization
********************************************************************************/
void LCD_Init( LCD_SCAN_DIR Lcd_ScanDir )
{

    //Hardware reset
    LCD_Reset();

    //Set the initialization register
    LCD_InitReg();

    //Set the display scan and color transfer modes
    LCD_SetGramScanWay( Lcd_ScanDir );
    wait_ms(200);

    //sleep out
    LCD_WriteReg(0x11);
    wait_ms(120);

    //Turn on the LCD display
    LCD_WriteReg(0x29);
}

/********************************************************************************
function:   Sets the start position and size of the display area
parameter:
        Xstart  :   X direction Start coordinates
        Ystart  :   Y direction Start coordinates
        Xend    :   X direction end coordinates
        Yend    :   Y direction end coordinates
********************************************************************************/
void LCD_SetWindows( POINT Xstart, POINT Ystart, POINT Xend, POINT Yend )
{

    //set the X coordinates
    LCD_WriteReg ( 0x2A );
    LCD_WriteData_8Bit ( 0x00 );                        //Set the horizontal starting point to the high octet
    LCD_WriteData_8Bit ( (Xstart & 0xff) + sLCD_DIS.LCD_X_Adjust);          //Set the horizontal starting point to the low octet
    LCD_WriteData_8Bit ( 0x00 );                //Set the horizontal end to the high octet
    LCD_WriteData_8Bit ( (( Xend - 1 ) & 0xff) + sLCD_DIS.LCD_X_Adjust);    //Set the horizontal end to the low octet

    //set the Y coordinates
    LCD_WriteReg ( 0x2B );
    LCD_WriteData_8Bit ( 0x00 );
    LCD_WriteData_8Bit ( (Ystart & 0xff) + sLCD_DIS.LCD_Y_Adjust);
    LCD_WriteData_8Bit ( 0x00 );
    LCD_WriteData_8Bit ( ( (Yend - 1) & 0xff )+ sLCD_DIS.LCD_Y_Adjust);

    LCD_WriteReg(0x2C);

}

/********************************************************************************
function:   Set the display point (Xpoint, Ypoint)
parameter:
        xStart :   X direction Start coordinates
        xEnd   :   X direction end coordinates
********************************************************************************/
void LCD_SetCursor ( POINT Xpoint, POINT Ypoint )
{
    LCD_SetWindows ( Xpoint, Ypoint, Xpoint , Ypoint );
}

/********************************************************************************
function:   Set show color
parameter:
        Color  :   Set show color
********************************************************************************/
void LCD_SetColor( COLOR Color ,POINT Xpoint, POINT Ypoint)
{
    LCD_WriteData_NLen16Bit(Color ,(uint32_t)Xpoint * (uint32_t)Ypoint);
}

/********************************************************************************
function:   Point (Xpoint, Ypoint) Fill the color
parameter:
        Xpoint :   The x coordinate of the point
        Ypoint :   The y coordinate of the point
        Color  :   Set the color
********************************************************************************/
void LCD_SetPointlColor ( POINT Xpoint, POINT Ypoint, COLOR Color )
{
    if ( ( Xpoint <= sLCD_DIS.LCD_Dis_Column ) && ( Ypoint <= sLCD_DIS.LCD_Dis_Page ) ) {
        LCD_SetCursor (Xpoint, Ypoint);
        LCD_SetColor ( Color , 1 , 1);
    }
}

/********************************************************************************
function:   Fill the area with the color
parameter:
        Xstart :   Start point x coordinate
        Ystart :   Start point y coordinate
        Xend   :   End point coordinates
        Yend   :   End point coordinates
        Color  :   Set the color
********************************************************************************/
void LCD_SetArealColor (POINT Xstart, POINT Ystart, POINT Xend, POINT Yend, COLOR  Color)
{
    if((Xend > Xstart) && (Yend > Ystart)) {
        LCD_SetWindows( Xstart , Ystart , Xend , Yend  );
        LCD_SetColor ( Color ,Xend - Xstart , Yend - Ystart );
    }
}

/********************************************************************************
function:
            Clear screen
********************************************************************************/
void LCD_Clear(COLOR  Color)
{
    LCD_SetArealColor(0,0, sLCD_DIS.LCD_Dis_Column , sLCD_DIS.LCD_Dis_Page, Color);
}

/********************************************************************************************/

void DC_LOW(void)
{
    dc = 0;
}
void DC_HIGH(void)
{
    dc= 1;
}

void RST_LOW(void)
{
    rst = 0;
}
void RST_HIGH(void)
{
    rst = 1;
}