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);
}