Skip to content
Snippets Groups Projects
Forked from card10 / firmware
1871 commits behind the upstream repository.
LCD_Driver.c 8.34 KiB
/*****************************************************************************
* | File      	:		LCD_Driver.c
* | Author      :   Waveshare team
* | Function    :   Electronic paper driver
* | Info        :
*----------------
* |	This version:   V1.0
* | Date        :   2018-11-18
* | Info        :   
#
# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to  whom the Software is
# furished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
******************************************************************************/
#include "LCD_Driver.h"

/*******************************************************************************
function:
	Hardware reset
*******************************************************************************/
static void LCD_Reset(void)
{
	//DEV_Digital_Write(DEV_CS_PIN,0);
	DEV_Delay_ms(20);
	//DEV_Digital_Write(DEV_RST_PIN,0);
	DEV_Delay_ms(20);
	//DEV_Digital_Write(DEV_RST_PIN,1);
	DEV_Delay_ms(20);
}

/*******************************************************************************
function:
	Setting backlight
parameter	:
		value : Range 0~1000   Duty cycle is value/1000	
*******************************************************************************/
void LCD_SetBacklight(UWORD Value)
{
	DEV_Set_BL(Value);
}

/*******************************************************************************
function:
		Write register address and data
*******************************************************************************/
void LCD_WriteData_Byte(UBYTE da) 
{	
	//DEV_Digital_Write(DEV_CS_PIN,0);
	DEV_Digital_Write(DEV_DC_PIN,1);
	DEV_SPI_WRITE(da);  
	//DEV_Digital_Write(DEV_CS_PIN,1);
}  

 void LCD_WriteData_Word(UWORD da)
{
	UBYTE i=(da>>8)&0xff;
	//DEV_Digital_Write(DEV_CS_PIN,0);
	DEV_Digital_Write(DEV_DC_PIN,1);
	DEV_SPI_WRITE(i);
	DEV_SPI_WRITE(da);
	//DEV_Digital_Write(DEV_CS_PIN,1);
}	  

void LCD_WriteReg(UBYTE da)	 
{	
	//DEV_Digital_Write(DEV_CS_PIN,0);
	DEV_Digital_Write(DEV_DC_PIN,0);
	DEV_SPI_WRITE(da);
	//DEV_Digital_Write(DEV_CS_PIN,1);
}

/******************************************************************************
function:	
		Common register initialization
******************************************************************************/
void LCD_Init(void)
{
	LCD_Reset();

	//************* Start Initial Sequence **********// 
	LCD_WriteReg(0x11);//Sleep exit 
	DEV_Delay_ms (120);
  LCD_WriteReg(0x21); 
  LCD_WriteReg(0x21); 

  LCD_WriteReg(0xB1); 
  LCD_WriteData_Byte(0x05);
  LCD_WriteData_Byte(0x3A);
  LCD_WriteData_Byte(0x3A);

  LCD_WriteReg(0xB2);
  LCD_WriteData_Byte(0x05);
  LCD_WriteData_Byte(0x3A);
  LCD_WriteData_Byte(0x3A);

  LCD_WriteReg(0xB3); 
  LCD_WriteData_Byte(0x05);  
  LCD_WriteData_Byte(0x3A);
  LCD_WriteData_Byte(0x3A);
  LCD_WriteData_Byte(0x05);
  LCD_WriteData_Byte(0x3A);
  LCD_WriteData_Byte(0x3A);

  LCD_WriteReg(0xB4);
  LCD_WriteData_Byte(0x03);

  LCD_WriteReg(0xC0);
  LCD_WriteData_Byte(0x62);
  LCD_WriteData_Byte(0x02);
  LCD_WriteData_Byte(0x04);

  LCD_WriteReg(0xC1);
  LCD_WriteData_Byte(0xC0);

  LCD_WriteReg(0xC2);
  LCD_WriteData_Byte(0x0D);
  LCD_WriteData_Byte(0x00);

  LCD_WriteReg(0xC3);
  LCD_WriteData_Byte(0x8D);
  LCD_WriteData_Byte(0x6A);   

  LCD_WriteReg(0xC4);
  LCD_WriteData_Byte(0x8D); 
  LCD_WriteData_Byte(0xEE); 

  LCD_WriteReg(0xC5);  /*VCOM*/
  LCD_WriteData_Byte(0x0E);    

  LCD_WriteReg(0xE0);
  LCD_WriteData_Byte(0x10);
  LCD_WriteData_Byte(0x0E);
  LCD_WriteData_Byte(0x02);
  LCD_WriteData_Byte(0x03);
  LCD_WriteData_Byte(0x0E);
  LCD_WriteData_Byte(0x07);
  LCD_WriteData_Byte(0x02);
  LCD_WriteData_Byte(0x07);
  LCD_WriteData_Byte(0x0A);
  LCD_WriteData_Byte(0x12);
  LCD_WriteData_Byte(0x27);
  LCD_WriteData_Byte(0x37);
  LCD_WriteData_Byte(0x00);
  LCD_WriteData_Byte(0x0D);
  LCD_WriteData_Byte(0x0E);
  LCD_WriteData_Byte(0x10);

  LCD_WriteReg(0xE1);
  LCD_WriteData_Byte(0x10);
  LCD_WriteData_Byte(0x0E);
  LCD_WriteData_Byte(0x03);
  LCD_WriteData_Byte(0x03);
  LCD_WriteData_Byte(0x0F);
  LCD_WriteData_Byte(0x06);
  LCD_WriteData_Byte(0x02);
  LCD_WriteData_Byte(0x08);
  LCD_WriteData_Byte(0x0A);
  LCD_WriteData_Byte(0x13);
  LCD_WriteData_Byte(0x26);
  LCD_WriteData_Byte(0x36);
  LCD_WriteData_Byte(0x00);
  LCD_WriteData_Byte(0x0D);
  LCD_WriteData_Byte(0x0E);
  LCD_WriteData_Byte(0x10);

  LCD_WriteReg(0x3A); 
  LCD_WriteData_Byte(0x05);

  LCD_WriteReg(0x36);
  LCD_WriteData_Byte(0xA8);//

  LCD_WriteReg(0x29); 
} 

/******************************************************************************
function:	Set the cursor position
parameter	:
		Xstart: 	Start UWORD x coordinate
	  Ystart:		Start UWORD y coordinate
	  Xend  :		End UWORD coordinates
	  Yend  :		End UWORD coordinatesen
******************************************************************************/
void LCD_SetCursor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD  Yend)
{ 
	Xstart = Xstart + 1;
	Xend = Xend + 1;
	Ystart = Ystart + 26;
	Yend = Yend+26;
	LCD_WriteReg(0x2a);
	LCD_WriteData_Byte(Xstart>>8);
	LCD_WriteData_Byte(Xstart);
	LCD_WriteData_Byte(Xend >>8);
	LCD_WriteData_Byte(Xend );

	LCD_WriteReg(0x2b);
	LCD_WriteData_Byte(Ystart>>8);
	LCD_WriteData_Byte(Ystart);
	LCD_WriteData_Byte(Yend>>8);
	LCD_WriteData_Byte(Yend);

	LCD_WriteReg(0x2C);
}

/******************************************************************************
function:	Clear screen function, refresh the screen to a certain color
parameter	:
		Color :		The color you want to clear all the screen
******************************************************************************/
void LCD_Clear(UWORD Color)
{
	UWORD i,j;  	
	LCD_SetCursor(0,0,LCD_WIDTH-1,LCD_HEIGHT-1);
	for(i = 0; i < LCD_WIDTH; i++){
		for(j = 0; j < LCD_HEIGHT; j++){
			LCD_WriteData_Word(Color);
		}
	 }
}

/******************************************************************************
function:	Refresh a certain area to the same color
parameter	:
		Xstart: 	Start UWORD x coordinate
	  Ystart:		Start UWORD y coordinate
	  Xend  :		End UWORD coordinates
	  Yend  :		End UWORD coordinates
	  color :		Set the color
******************************************************************************/
void LCD_ClearWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD color)
{          
	UWORD i,j; 
	LCD_SetCursor(Xstart, Ystart, Xend-1,Yend-1);
	for(i = Ystart; i <= Yend-1; i++){													   	 	
		for(j = Xstart; j <= Xend-1; j++){
			LCD_WriteData_Word(color);
		}
	} 					  	    
}  

/******************************************************************************
function: Set the color of an area
parameter	:
		Xstart: 	Start UWORD x coordinate
	  Ystart:		Start UWORD y coordinate
	  Xend  :		End UWORD coordinates
	  Yend  :		End UWORD coordinates
	  Color :		Set the color
******************************************************************************/
void LCD_SetWindowColor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD  Color)
{
	LCD_SetCursor( Xstart,Ystart,Xend,Yend);
	LCD_WriteData_Word(Color); 	    
}

/******************************************************************************
function: Draw a UWORD
parameter	:
		X			: 	Set the X coordinate
	  Y			:		Set the Y coordinate
	  Color :		Set the color
******************************************************************************/
void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
{
	LCD_SetCursor(x,y,x,y);
	LCD_WriteData_Word(Color); 	    
}