blob: 8798a3cca7982f712ebaf7378fc407bce3f0ec07 [file] [log] [blame]
/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
/**
*
* @file lcd.c
* @brief The LCD driver for the ST7637.
* @author FL
* @date 07/2007
*
**/
/******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "lcd.h"
#include "circle.h"
/// @cond Internal
/* Private define ------------------------------------------------------------*/
#define V9_MADCTRVAL 0x90 /*!< Left orientation value. */
#define V12_MADCTRVAL 0x30 /*!< Up orientation value. */
#define V3_MADCTRVAL 0x50 /*!< Right orientation value. */
#define V6_MADCTRVAL 0xF0 /*!< Bottom orientation value. */
#define BACKLIGHT_DIVIDER 500 /*!< LCD handler step. */
/* Private variables ---------------------------------------------------------*/
// vars for timer dedicated for lcd backlight
static TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
static TIM_OCInitTypeDef TIM_OCInitStructure;
static int HandlerDivider = 0;
int Current_CCR_BackLightStart = DEFAULT_CCR_BACKLIGHTSTART;
/* External variable ---------------------------------------------------------*/
extern GPIO_InitTypeDef GPIO_InitStructure;
extern u16 CCR_BackLight_Tab[5];
extern int CurrentRotateScreen;
extern Rotate_H12_V_Match_TypeDef CurrentScreenOrientation;
/*! ASCII Table. Each character is 7 column (7dots large) on two pages (16dots high)
7 column character: Two 8 bit data to display one column*/
static const u8 AsciiDotsTable[95 * 14 ] = {
/* ASCII 32 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 33 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x13,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 34 */ 0x00,0x00,0x00,0xe0,0x00,0x20,0x00,0x00,0x00,0xe0,0x00,0x20,0x00,0x00,
/* ASCII 35 */ 0x00,0x00,0x35,0x00,0x0f,0x80,0x35,0x60,0x0f,0x80,0x05,0x60,0x00,0x00,
/* ASCII 36 */ 0x00,0x00,0x0d,0x80,0x0a,0x40,0x3a,0x60,0x06,0x40,0x00,0x00,0x00,0x00,
/* ASCII 37 */ 0x00,0x00,0x02,0x40,0x02,0xa0,0x0a,0x40,0x15,0x00,0x09,0x00,0x00,0x00,
/* ASCII 38 */ 0x00,0x00,0x0c,0x00,0x13,0x00,0x14,0x80,0x08,0x80,0x14,0x00,0x00,0x00,
/* ASCII 39 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 40 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x80,0x60,0x60,0x00,0x00,0x00,0x00,
/* ASCII 41 */ 0x00,0x00,0x00,0x00,0x60,0x60,0x1f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 42 */ 0x00,0x00,0x00,0x40,0x03,0x40,0x00,0xe0,0x03,0x40,0x00,0x40,0x00,0x00,
/* ASCII 43 */ 0x02,0x00,0x02,0x00,0x02,0x00,0x1f,0xc0,0x02,0x00,0x02,0x00,0x02,0x00,
/* ASCII 44 */ 0x00,0x00,0x00,0x00,0x60,0x00,0x38,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
/* ASCII 45 */ 0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,
/* ASCII 46 */ 0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 47 */ 0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x00,
/* ASCII 48 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x0f,0xc0,0x00,0x00,
/* ASCII 49 */ 0x00,0x00,0x10,0x00,0x10,0x20,0x1f,0xe0,0x10,0x00,0x10,0x00,0x00,0x00,
/* ASCII 50 */ 0x00,0x00,0x18,0x40,0x14,0x20,0x12,0x20,0x11,0x20,0x18,0xc0,0x00,0x00,
/* ASCII 51 */ 0x00,0x00,0x08,0x40,0x10,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,
/* ASCII 52 */ 0x00,0x00,0x06,0x00,0x05,0x00,0x04,0xc0,0x14,0x20,0x1f,0xe0,0x14,0x00,
/* ASCII 53 */ 0x00,0x00,0x08,0x00,0x11,0xe0,0x11,0x20,0x11,0x20,0x0e,0x20,0x00,0x00,
/* ASCII 54 */ 0x00,0x00,0x0f,0x80,0x11,0x40,0x11,0x20,0x11,0x20,0x0e,0x20,0x00,0x00,
/* ASCII 55 */ 0x00,0x00,0x00,0x60,0x00,0x20,0x18,0x20,0x07,0x20,0x00,0xe0,0x00,0x00,
/* ASCII 56 */ 0x00,0x00,0x0e,0xc0,0x11,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,
/* ASCII 57 */ 0x00,0x00,0x11,0xc0,0x12,0x20,0x12,0x20,0x0a,0x20,0x07,0xc0,0x00,0x00,
/* ASCII 58 */ 0x00,0x00,0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 59 */ 0x00,0x00,0x00,0x00,0x30,0x00,0x19,0x80,0x09,0x80,0x00,0x00,0x00,0x00,
/* ASCII 60 */ 0x02,0x00,0x05,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x10,0x40,0x00,0x00,
/* ASCII 61 */ 0x00,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x00,0x00,
/* ASCII 62 */ 0x10,0x40,0x10,0x40,0x08,0x80,0x05,0x00,0x05,0x00,0x02,0x00,0x00,0x00,
/* ASCII 63 */ 0x00,0x00,0x00,0x00,0x10,0x80,0x14,0x40,0x02,0x40,0x01,0x80,0x00,0x00,
/* ASCII 64 */ 0x00,0x00,0x1f,0xe0,0x20,0x10,0x23,0x10,0x24,0x90,0x17,0xe0,0x00,0x00,
/* ASCII 65 */ 0x10,0x00,0x1c,0x00,0x17,0xa0,0x04,0x60,0x17,0x80,0x1c,0x00,0x10,0x00,
/* ASCII 66 */ 0x10,0x20,0x1f,0xe0,0x11,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,
/* ASCII 67 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x08,0x60,0x00,0x00,
/* ASCII 68 */ 0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x20,0x08,0x40,0x07,0x80,0x00,0x00,
/* ASCII 69 */ 0x10,0x20,0x1f,0xe0,0x11,0x20,0x13,0xa0,0x10,0x20,0x18,0x60,0x00,0x00,
/* ASCII 70 */ 0x00,0x00,0x10,0x20,0x1f,0xe0,0x11,0x20,0x03,0xa0,0x00,0x20,0x00,0x60,
/* ASCII 71 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x12,0x20,0x0e,0x60,0x02,0x00,
/* ASCII 72 */ 0x10,0x20,0x1f,0xe0,0x11,0x20,0x01,0x00,0x11,0x20,0x1f,0xe0,0x10,0x20,
/* ASCII 73 */ 0x00,0x00,0x10,0x20,0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x20,0x00,0x00,
/* ASCII 74 */ 0x00,0x00,0x0e,0x00,0x10,0x20,0x10,0x20,0x0f,0xe0,0x00,0x20,0x00,0x00,
/* ASCII 75 */ 0x10,0x20,0x1f,0xe0,0x12,0x20,0x03,0x00,0x04,0xa0,0x18,0x60,0x10,0x20,
/* ASCII 76 */ 0x00,0x00,0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x00,0x1c,0x00,0x00,0x00,
/* ASCII 77 */ 0x10,0x20,0x1f,0xe0,0x10,0xe0,0x03,0x00,0x10,0xe0,0x1f,0xe0,0x10,0x20,
/* ASCII 78 */ 0x10,0x20,0x1f,0xe0,0x10,0xe0,0x07,0x00,0x18,0x20,0x1f,0xe0,0x00,0x20,
/* ASCII 79 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x0f,0xc0,0x00,0x00,
/* ASCII 80 */ 0x00,0x00,0x10,0x20,0x1f,0xe0,0x12,0x20,0x02,0x20,0x01,0xc0,0x00,0x00,
/* ASCII 81 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x30,0x20,0x30,0x20,0x2f,0xc0,0x00,0x00,
/* ASCII 82 */ 0x10,0x20,0x1f,0xe0,0x12,0x20,0x02,0x20,0x06,0x20,0x09,0xc0,0x10,0x00,
/* ASCII 83 */ 0x00,0x00,0x18,0xc0,0x09,0x20,0x11,0x20,0x11,0x40,0x0e,0x60,0x00,0x00,
/* ASCII 84 */ 0x00,0x60,0x00,0x20,0x10,0x20,0x1f,0xe0,0x10,0x20,0x00,0x20,0x00,0x60,
/* ASCII 85 */ 0x00,0x20,0x0f,0xe0,0x10,0x20,0x10,0x00,0x10,0x20,0x0f,0xe0,0x00,0x20,
/* ASCII 86 */ 0x00,0x20,0x00,0xe0,0x07,0x20,0x18,0x00,0x07,0x20,0x00,0xe0,0x00,0x20,
/* ASCII 87 */ 0x00,0x20,0x0f,0xe0,0x10,0x20,0x0f,0x00,0x10,0x20,0x0f,0xe0,0x00,0x20,
/* ASCII 88 */ 0x10,0x20,0x18,0x60,0x04,0x80,0x03,0x00,0x04,0x80,0x18,0x60,0x10,0x20,
/* ASCII 89 */ 0x00,0x20,0x00,0x60,0x11,0xa0,0x1e,0x00,0x11,0xa0,0x00,0x60,0x00,0x20,
/* ASCII 90 */ 0x00,0x00,0x18,0x60,0x14,0x20,0x13,0x20,0x10,0xa0,0x18,0x60,0x00,0x00,
/* ASCII 91 */ 0x00,0x00,0x00,0x00,0x7f,0xe0,0x40,0x20,0x40,0x20,0x00,0x00,0x00,0x00,
/* ASCII 92 */ 0x00,0x00,0x00,0x20,0x01,0xc0,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
/* ASCII 93 */ 0x00,0x00,0x00,0x00,0x40,0x20,0x40,0x20,0x7f,0xe0,0x00,0x00,0x00,0x00,
/* ASCII 94 */ 0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x60,0x00,0x80,0x01,0x00,0x00,0x00,
/* ASCII 95 */ 0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
/* ASCII 96 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x00,0x00,0x00,
/* ASCII 97 */ 0x00,0x00,0x0d,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x1f,0x00,0x10,0x00,
/* ASCII 98 */ 0x10,0x20,0x1f,0xe0,0x11,0x00,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,
/* ASCII 99 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x09,0x80,0x00,0x00,
/* ASCII 100 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x11,0x20,0x1f,0xe0,0x10,0x00,
/* ASCII 101 */ 0x00,0x00,0x0f,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x13,0x00,0x00,0x00,
/* ASCII 102 */ 0x00,0x00,0x10,0x80,0x1f,0xc0,0x10,0xa0,0x10,0xa0,0x10,0xa0,0x00,0x00,
/* ASCII 103 */ 0x00,0x00,0x0f,0x00,0x50,0x80,0x50,0x80,0x51,0x00,0x3f,0x80,0x00,0x80,
/* ASCII 104 */ 0x10,0x20,0x1f,0xe0,0x11,0x00,0x00,0x80,0x10,0x80,0x1f,0x00,0x10,0x00,
/* ASCII 105 */ 0x00,0x00,0x10,0x80,0x10,0x80,0x1f,0xa0,0x10,0x00,0x10,0x00,0x00,0x00,
/* ASCII 106 */ 0x00,0x00,0x40,0x80,0x40,0x80,0x40,0xa0,0x3f,0x80,0x00,0x00,0x00,0x00,
/* ASCII 107 */ 0x10,0x20,0x1f,0xe0,0x02,0x00,0x16,0x80,0x19,0x80,0x10,0x80,0x00,0x00,
/* ASCII 108 */ 0x00,0x00,0x10,0x00,0x10,0x20,0x1f,0xe0,0x10,0x00,0x10,0x00,0x00,0x00,
/* ASCII 109 */ 0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x00,0x10,0x80,0x1f,0x00,0x10,0x00,
/* ASCII 110 */ 0x10,0x80,0x1f,0x80,0x11,0x00,0x00,0x80,0x10,0x80,0x1f,0x00,0x10,0x00,
/* ASCII 111 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,
/* ASCII 112 */ 0x40,0x80,0x7f,0x80,0x51,0x00,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,
/* ASCII 113 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x51,0x00,0x7f,0x80,0x40,0x80,
/* ASCII 114 */ 0x00,0x00,0x10,0x80,0x1f,0x80,0x11,0x00,0x10,0x80,0x10,0x80,0x00,0x00,
/* ASCII 115 */ 0x00,0x00,0x19,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x0d,0x80,0x00,0x00,
/* ASCII 116 */ 0x00,0x00,0x00,0x80,0x0f,0xc0,0x10,0x80,0x10,0x80,0x10,0x80,0x08,0x00,
/* ASCII 117 */ 0x00,0x80,0x0f,0x80,0x10,0x00,0x10,0x00,0x08,0x80,0x1f,0x80,0x10,0x00,
/* ASCII 118 */ 0x00,0x80,0x03,0x80,0x0c,0x80,0x10,0x00,0x0c,0x80,0x03,0x80,0x00,0x80,
/* ASCII 119 */ 0x00,0x80,0x0f,0x80,0x10,0x80,0x0e,0x00,0x10,0x80,0x0f,0x80,0x00,0x80,
/* ASCII 120 */ 0x10,0x80,0x19,0x80,0x06,0x00,0x06,0x00,0x19,0x80,0x10,0x80,0x00,0x00,
/* ASCII 121 */ 0x00,0x80,0x41,0x80,0x46,0x80,0x78,0x00,0x4c,0x80,0x03,0x80,0x00,0x80,
/* ASCII 122 */ 0x00,0x00,0x19,0x80,0x14,0x80,0x12,0x80,0x11,0x80,0x18,0x80,0x00,0x00,
/* ASCII 123 */ 0x00,0x00,0x00,0x00,0x04,0x00,0x3b,0xc0,0x40,0x20,0x00,0x00,0x00,0x00,
/* ASCII 124 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,
/* ASCII 125 */ 0x00,0x00,0x00,0x00,0x40,0x20,0x3b,0xc0,0x04,0x00,0x00,0x00,0x00,0x00,
/* ASCII 126 */ 0x00,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x00,0x00};
int OrientationOffsetX [] = { 0 /* V12*/,0 /* V3*/,+4 /* V6*/,+4 /* V9*/ };
int OrientationOffsetY [] = { +4 /* V12*/,0 /* V3*/,0 /* V6*/,+4 /* V9*/ };
/* Private function prototypes -----------------------------------------------*/
static void LCD_7637_Controller( void );
static void LCD_DrawChar( u8 x, u8 y, u8 width, const u8 *bmp, u16 textColor, u16 bGndColor, u16 charMagniCoeff );
static void LCD_BackLightChange( void );
static void LCD_BackLightConfig( void );
static void LCD_CtrlLinesWrite( GPIO_TypeDef* GPIOx, u32 CtrlPins, BitAction BitVal );
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
*
* LCD_DataLinesConfig
*
*******************************************************************************/
/**
* Configure data lines D0~D7 in Input Floating mode for read from LCD or in
* Output Push-Pull mode for write on LCD
*
* @param[in] Mode Specifies the configuration mode for data lines D0~D7.
* @n @c Input: configure in Input Floating mode
* @n @c Output: configure in Output Push-Pul mode
*
**/
/******************************************************************************/
static void LCD_DataLinesConfig( DataConfigMode_TypeDef Mode )
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LCD_DATA_PINS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
if( Mode == Input )
{
/* Configure D0~D7 lines as Input */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
}
else
{
/* Configure D0~D7 lines in Output Push-Pull mode */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
}
GPIO_Init( GPIOx_D_LCD, &GPIO_InitStructure );
}
/*******************************************************************************
*
* LCD_DataLinesWrite
*
*******************************************************************************/
/**
* Write a value on D0~D7
*
* @param[in] GPIOx GPIO port to write on.
* @param[in] PortVal The value to write. Only the lowest 8 bits are taken into
* account.
*
**/
/******************************************************************************/
static void LCD_DataLinesWrite( GPIO_TypeDef* GPIOx, u32 PortVal )
{
// Write only the lowest 8 bits!
GPIOx->ODR = ( (GPIOx->ODR) & 0xFF00 ) | (u8)PortVal;
}
/*******************************************************************************
*
* LCD_CtrlLinesConfig
*
*******************************************************************************/
/**
* Configure control lines in Output Push-Pull mode.
*
**/
/******************************************************************************/
static void LCD_CtrlLinesConfig( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LCD_CTRL_PINS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOx_CTRL_LCD, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = CtrlPin_CS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOx_CS_LCD, &GPIO_InitStructure );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_SET ); /* CS = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_RESET ); /* RST = 0 */
}
/*******************************************************************************
*
* LCD_CtrlLinesWrite
*
*******************************************************************************/
/**
* Set or reset control lines.
*
* @param[in] GPIOx Where x can be 0, 1 or 2 to select the GPIO peripheral.
* @param[in] CtrlPins The Control line.
* @param[in] BitVal
*
**/
/******************************************************************************/
static void LCD_CtrlLinesWrite( GPIO_TypeDef* GPIOx, u32 CtrlPins, BitAction BitVal )
{
/* Set or Reset the control line */
GPIO_WriteBit( GPIOx, CtrlPins, BitVal );
}
/*******************************************************************************
*
* LCD_CheckLCDStatus
*
*******************************************************************************/
/**
* Check whether LCD LCD is busy or not.
*
**/
/******************************************************************************/
static void LCD_CheckLCDStatus( void )
{
unsigned char ID1;
unsigned char ID2;
unsigned char ID3;
LCD_SendLCDCmd( ST7637_RDDID );
/* Configure Data lines as Input */
LCD_DataLinesConfig (Input );
/* Start the LCD send data sequence */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET ); /* CS = 0 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
/* Read data to the LCD */
GPIO_ReadInputData( GPIOx_D_LCD );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
ID1 = GPIO_ReadInputData( GPIOx_D_LCD );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
ID2 = GPIO_ReadInputData( GPIOx_D_LCD );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
ID3 = GPIO_ReadInputData( GPIOx_D_LCD );
LCD_DataLinesConfig( Output );
}
/*******************************************************************************
*
* LCD_DrawChar
*
*******************************************************************************/
/**
* Draw a character on the LCD screen.
*
* @param[in] x The line where to display the character shape.
* @param[in] y The column start address.
* @param[in] width The number of columns (dots) in a character width.
* @param[in] bmp The character (monochrome) bitmap. A pointer of the dot matrix data.
* @param[in] textColor The character color.
* @param[in] bGndColor The character background color.
* @param[in] charMagniCoeff The character magnifying coefficient.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
static void LCD_DrawChar( u8 x, u8 y, u8 width, const u8* bmp, u16 textColor, u16 bGndColor, u16 charMagniCoeff )
{
int i;
int j;
int k1;
int k2;
// Select the area for LCD output.
LCD_SetRect_For_Cmd( x, y, 7 * charMagniCoeff, 14 * charMagniCoeff );
// Select LCD output mode.
LCD_SendLCDCmd( ST7637_RAMWR );
for( i = 0; i < 7; i++ )
{
for( k1 = 0; k1 < charMagniCoeff; k1++ )
{
for( j = 0x80; j; j >>= 1 ) // 8
{
for( k2 = 0; k2 < charMagniCoeff; k2++ )
{
LCD_SendLCDData( ( bmp[2*i] & j ) ? ( textColor & 255 ) : ( bGndColor & 255 ) );
LCD_SendLCDData( ( bmp[2*i] & j ) ? ( textColor >> 8 ) : ( bGndColor >> 8 ) );
}
}
for( j = 0x80; j > 2; j >>= 1 ) // 8
{
for( k2 = 0; k2 < charMagniCoeff; k2++ )
{
LCD_SendLCDData( ( bmp[2*i+1] & j ) ? ( textColor & 255 ) : ( bGndColor & 255 ) );
LCD_SendLCDData( ( bmp[2*i+1] & j ) ? ( textColor >> 8 ) : ( bGndColor >> 8 ) );
}
}
}
}
}
/*******************************************************************************
*
* LCD_DisplayRotate
*
*******************************************************************************/
/**
* Configure the LCD controller for a given orientation.
*
* @param[in] H12 The new screen orientation.
*
**/
/******************************************************************************/
static void LCD_DisplayRotate( Rotate_H12_V_Match_TypeDef H12 )
{
// Memory Access Control 0x36
LCD_SendLCDCmd( ST7637_MADCTR );
switch( H12 )
{
case V3 :
LCD_SendLCDData( V3_MADCTRVAL );
break;
case V6 :
LCD_SendLCDData( V6_MADCTRVAL );
break;
case V9 :
LCD_SendLCDData( V9_MADCTRVAL );
break;
case V12 :
default :
LCD_SendLCDData( V12_MADCTRVAL );
break;
}
}
/*******************************************************************************
*
* LCD_7637_Controller
*
*******************************************************************************/
/**
* Initialization of the controller registers.
*
* @note See ST7637.PDF for more information.
*
**/
/******************************************************************************/
static void LCD_7637_Controller( void )
{
extern void starting_delay ( long unsigned );
/** Apply hardware reset **/
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_RESET ); /* RST = 0 */
starting_delay( 0x500 );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
starting_delay( 0x500 );
//default mode is output
LCD_DataLinesConfig( Output );
LCD_CheckLCDStatus();
LCD_SendLCDCmd( ST7637_SWRESET );
//-----------disable autoread + Manual read once ----------------------------
LCD_SendLCDCmd( ST7637_AUTOLOADSET ); // Auto Load Set 0xD7
LCD_SendLCDData( 0xBF ); // Auto Load Disable
LCD_SendLCDCmd( ST7637_EPCTIN ); // EE Read/write mode 0xE0
LCD_SendLCDData( 0x00 ); // Set read mode
LCD_SendLCDCmd( ST7637_EPMRD ); // Read active 0xE3
LCD_SendLCDCmd( ST7637_EPCTOUT ); // Cancel control 0xE1
//---------------------------------- Sleep OUT ------------------------------
LCD_SendLCDCmd( ST7637_DISPOFF ); // display off 0x28
LCD_SendLCDCmd( ST7637_SLPOUT ); // Sleep Out 0x11
//--------------------------------Vop setting--------------------------------
LCD_SendLCDCmd( ST7637_VOPSET ); // Set Vop by initial Module 0xC0
LCD_SendLCDData( 0xFB ); // Vop = 13.64
LCD_SendLCDData( 0x00 ); // base on Module
//----------------------------Set Register-----------------------------------
LCD_SendLCDCmd( ST7637_BIASSEL ); // Bias select 0xC3
LCD_SendLCDData( 0x00 ); // 1/12 Bias, base on Module
LCD_SendLCDCmd( ST7637_BSTBMPXSEL ); // Setting Booster times 0xC4
LCD_SendLCDData( 0x05 ); // Booster X 8
LCD_SendLCDCmd( ST7637_BSTEFFSEL ); // Booster eff 0xC5
LCD_SendLCDData( 0x11 ); // BE = 0x01 (Level 2)
LCD_SendLCDCmd( ST7637_VGSORCSEL ); // Vg with booster x2 control 0xcb
LCD_SendLCDData( 0x01 ); // Vg from Vdd2
LCD_SendLCDCmd( ST7637_ID1SET ); // ID1 = 00 0xcc
LCD_SendLCDData( 0x00 ); //
LCD_SendLCDCmd( ST7637_ID3SET ); // ID3 = 00 0xce
LCD_SendLCDData( 0x00 ); //
LCD_SendLCDCmd( 0xB7 ); // Glass direction
LCD_SendLCDData( 0xC0 ); //
LCD_SendLCDCmd( ST7637_ANASET ); // Analog circuit setting 0xd0
LCD_SendLCDData( 0x1D ); //
LCD_SendLCDCmd( 0xB4 ); // PTL mode set
LCD_SendLCDData( 0x18 ); // power normal mode
LCD_SendLCDCmd( ST7637_INVOFF ); // Display Inversion OFF 0x20
LCD_SendLCDCmd( 0x2A ); // column range
LCD_SendLCDData( 0x04 ); //
LCD_SendLCDData( 0x83 ); //
LCD_SendLCDCmd( 0x2B ); // raw range
LCD_SendLCDData( 0x04 ); //
LCD_SendLCDData( 0x83 ); //
LCD_SendLCDCmd( ST7637_COLMOD ); // Color mode = 65k 0x3A
LCD_SendLCDData( 0x05 ); //
LCD_SendLCDCmd( ST7637_MADCTR ); // Memory Access Control 0x36
LCD_SendLCDData( V9_MADCTRVAL );
LCD_SendLCDCmd( ST7637_DUTYSET ); // Duty = 132 duty 0xb0
LCD_SendLCDData( 0x7F );
LCD_SendLCDCmd( 0x29 ); // Display ON
LCD_SendLCDCmd( 0xF9 ); // Gamma
LCD_SendLCDData( 0x00 ); //
LCD_SendLCDData( 0x03 ); //
LCD_SendLCDData( 0x05 ); //
LCD_SendLCDData( 0x07 ); //
LCD_SendLCDData( 0x09 ); //
LCD_SendLCDData( 0x0B ); //
LCD_SendLCDData( 0x0D ); //
LCD_SendLCDData( 0x0F ); //
LCD_SendLCDData( 0x11 ); //
LCD_SendLCDData( 0x13 ); //
LCD_SendLCDData( 0x15 ); //
LCD_SendLCDData( 0x17 ); //
LCD_SendLCDData( 0x19 ); //
LCD_SendLCDData( 0x1B ); //
LCD_SendLCDData( 0x1D ); //
LCD_SendLCDData( 0x1F ); //
}
/*******************************************************************************
*
* LCD_BackLightConfig
*
*******************************************************************************/
/**
* Setting of the PWM that drives the backlight intensity.
*
**/
/******************************************************************************/
static void LCD_BackLightConfig( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOB clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
/* GPIOB Configuration:TIM4 2 in Output */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStructure );
/* TIM4 Configuration -----------------------------------------------------*/
/* TIM4CLK = 12 MHz, Prescaler = 0x0 */
/* Enable TIM4 clock */
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4, ENABLE );
TIM_DeInit( TIM4 );
TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
TIM_OCStructInit( &TIM_OCInitStructure );
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure );
/* Output Compare Toggle Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = Current_CCR_BackLightStart;
TIM_OC2Init( TIM4, &TIM_OCInitStructure );
TIM_OC4PreloadConfig( TIM4, TIM_OCPreload_Disable );
TIM_ARRPreloadConfig( TIM4, ENABLE );
/* Enable TIM4 IT */
TIM_ITConfig( TIM4, TIM_IT_CC2, ENABLE );
// Go !!!
TIM_Cmd( TIM4, ENABLE );
}
/*******************************************************************************
*
* LCD_BackLightChange
*
*******************************************************************************/
/**
* Modify the PWM rate.
*
**/
/******************************************************************************/
static void LCD_BackLightChange( void )
{
/* Output Compare Toggle Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_Pulse = Current_CCR_BackLightStart;
TIM_OCInit( TIM4, &TIM_OCInitStructure );
}
/* Public functions for CircleOS ---------------------------------------------*/
/*******************************************************************************
*
* LCD_Init
*
*******************************************************************************/
/**
*
* Initialize LCD. Called at CircleOS startup.
*
* @attention This function must <b>NOT</b> be called by the user.
*
**/
/******************************************************************************/
void LCD_Init( void )
{
LCD_SetBackLight( UTIL_ReadBackupRegister( BKP_BKLIGHT ) );
/* Do some gpio configs*/
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIO clock for LCD */
RCC_APB2PeriphClockCmd( GPIO_LCD_CTRL_PERIPH, ENABLE );
RCC_APB2PeriphClockCmd( GPIO_LCD_D_PERIPH, ENABLE );
RCC_APB2PeriphClockCmd( GPIO_LCD_CS_PERIPH, ENABLE );
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
/* Init BackLight*/
LCD_BackLightConfig();
/* Configure control lines signals as output mode */
LCD_CtrlLinesConfig();
/* LCD LCD Init */
LCD_7637_Controller();
}
/*******************************************************************************
*
* LCD_Handler
*
*******************************************************************************/
/**
*
* Called by the CircleOS scheduler to manage LCD tasks.
*
* @attention This function must <b>NOT</b> be called by the user.
*
**/
/******************************************************************************/
void LCD_Handler( void )
{
if( ++HandlerDivider % BACKLIGHT_DIVIDER )
{
return;
}
LCD_BackLightChange();
}
/// @endcond
/* Public functions ----------------------------------------------------------*/
/*******************************************************************************
*
* LCD_SendLCDCmd
*
*******************************************************************************/
/**
*
* Send on command byte to the LCD.
*
* @param[in] Cmd An unsigned char containing the user command to send to the LCD.
*
**/
/******************************************************************************/
void LCD_SendLCDCmd( u8 Cmd )
{
/* Start the LCD send data sequence */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET ); /* CS = 0 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_RESET ); /* WR = 0 */
/* Write data to the LCD */
LCD_DataLinesWrite( GPIOx_D_LCD, (u32)Cmd );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
}
/*******************************************************************************
*
* LCD_SendLCDData
*
*******************************************************************************/
/**
*
* Send one data byte to the LCD.
*
* @param[in] Data An unsigned character containing the data to send to the LCD.
* @pre An LCD_SendLCDCmd was done with a command waiting for data.
*
*
**/
/******************************************************************************/
void LCD_SendLCDData( u8 Data )
{
/* Configure Data lines as Output */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_SET );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET );
LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_RESET );
/* Write data to the LCD */
LCD_DataLinesWrite( GPIOx_D_LCD,(u32)Data );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET );
}
/***********************************************************************************
*
* LCD_ReadLCDData
*
************************************************************************************/
/**
*
* Read one data byte from the LCD.
*
* @return An unsigned 32 bit word containing the data returned by a LCD command.
* @pre An LCD_SendLCDCmd was done with a command returning data.
*
**/
/********************************************************************************/
u32 LCD_ReadLCDData( void )
{
u32 LCDData = 0;
/* Configure Data lines as Input */
LCD_DataLinesConfig(Input);
/* Start the LCD send data sequence */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET ); /* CS = 0 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
/* Read data from the LCD */
LCDData = (GPIO_ReadInputData( GPIOx_D_LCD ) & LCD_DATA_PINS );
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
/* Read the LCD returned data */
LCD_DataLinesConfig( Output );
return LCDData;
}
/*******************************************************************************
*
* LCD_FillRect
*
*******************************************************************************/
/**
*
* Fill a rectangle with a provided color.
*
* @param[in] x The horizontal coordinate of the rectangle low left corner.
* @param[in] y The vertical coordinate of the rectangle low left corner.
* @param[in] width The rectangle width in pixels.
* @param[in] height The rectangle height in pixels.
* @param[in] color The RGB color to fill the rectangle with.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void LCD_FillRect( u16 x, u16 y, u16 width, u16 height, u16 color )
{
u8 Line;
u8 Column;
/* Select LCD screen area. */
LCD_SetRect_For_Cmd( x, y, width, height );
/* Send LCD RAM write command. */
LCD_SendLCDCmd( ST7637_RAMWR );
/* Fill selected LCD screen area with provided color. */
for( Line = 0; Line < width; Line++ )
{
for( Column = 0; Column < height; Column++ )
{
LCD_SendLCDData( color & 0xff );
LCD_SendLCDData( ( color >> 8 ) & 0xff );
}
}
#ifdef TESTLCD
/* Configure Data lines as Input */
LCD_DataLinesConfig( Input );
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_RESET ); /* RST = 0 */
LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
/* Start the LCD send data sequence */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_RESET ); /* WR = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
/* Configure Data lines as Input */
LCD_DataLinesConfig( Output );
LCD_DataLinesWrite( GPIOx_D_LCD, ~0 );
LCD_DataLinesWrite( GPIOx_D_LCD, 0 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~1 );
LCD_DataLinesWrite( GPIOx_D_LCD, 1 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~2 );
LCD_DataLinesWrite( GPIOx_D_LCD, 2 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~4 );
LCD_DataLinesWrite( GPIOx_D_LCD, 4 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~8 );
LCD_DataLinesWrite( GPIOx_D_LCD, 8 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~0x10 );
LCD_DataLinesWrite( GPIOx_D_LCD, 0x10 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~0x20 );
LCD_DataLinesWrite( GPIOx_D_LCD, 0x20 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~0x40 );
LCD_DataLinesWrite( GPIOx_D_LCD, 0x40 );
LCD_DataLinesWrite( GPIOx_D_LCD, ~0x80 );
LCD_DataLinesWrite( GPIOx_D_LCD, 0x80 );
LCD_DataLinesConfig( Input );
#endif
}
/*******************************************************************************
*
* LCD_DrawRect
*
*******************************************************************************/
/**
*
* Draw a rectangle with a provided color.
*
* @param[in] x The horizontal coordinate of the rectangle low left corner.
* @param[in] y The vertical coordinate of the rectangle low left corner.
* @param[in] width The rectangle width in pixels.
* @param[in] height The rectangle height in pixels.
* @param[in] color The RGB color to draw the rectangle with.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void LCD_DrawRect( u16 x, u16 y, u16 width, u16 height, u16 color )
{
// Draw horizontal sides.
LCD_FillRect( x, y, width, 1, color );
LCD_FillRect( x, y + height - 1, width, 1, color );
// Draw vertical sides.
LCD_FillRect( x, y, 1, height, color );
LCD_FillRect( x + width - 1, y, 1, height, color );
}
/*******************************************************************************
*
* LCD_DrawPixel
*
*******************************************************************************/
/**
*
* Draw a pixel on the LCD with the provided color.
*
* @param[in] XPos The horizontal coordinate of the pixel.
* @param[in] YPos The vertical coordinate of the pixel.
* @param[in] Color The RGB color to draw the pixel with.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void LCD_DrawPixel( u8 XPos, u8 YPos, u16 Color )
{
/* Select LCD screen area. */
LCD_SetRect_For_Cmd( XPos, YPos, 1, 1 );
/* Send LCD RAM write command. */
LCD_SendLCDCmd( ST7637_RAMWR );
// Draw pixel.
LCD_SendLCDData( Color );
LCD_SendLCDData( Color >> 8 );
}
/*******************************************************************************
*
* LCD_RectRead
*
*******************************************************************************/
/**
*
* Save the pixels of a rectangle part of the LCD into a RAM variable.
*
* @param[in] x The horizontal coordinate of the rectangle low left corner.
* @param[in] y The vertical coordinate of the rectangle low left corner.
* @param[in] width The rectangle width in pixels.
* @param[in] height The rectangle height in pixels.
* @param[out] bmp The variable to store the read data into.
*
* @warning One pixel weights 2 bytes.
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void LCD_RectRead( u16 x, u16 y, u16 width, u16 height, u8* bmp )
{
int i;
int bytesize = (width * height) *2; // 2 bytes per pixel.
/* Select LCD screen area. */
LCD_SetRect_For_Cmd( x, y, width, height );
/* Send LCD RAM write command. */
LCD_SendLCDCmd(ST7637_RAMRD);
// First read byte is dummy!
LCD_ReadLCDData();
// Read pixels from LCD screen.
for( i = 0; i < bytesize; i++ )
{
*bmp++ = LCD_ReadLCDData();
}
}
/*******************************************************************************
*
* LCD_GetPixel
*
*******************************************************************************/
/**
*
* Read the RGB color of the pixel the coordinate are provided in parameter.
*
* @param[in] x The horizontal coordinate of the pixel.
* @param[in] y The vertical coordinate of the pixel.
* @return An unsigned 16 bit word containing the RGB color of the pixel.
*
* @warning The (0x0) point in on the low left corner.
* @see LCD_RectRead
*
**/
/******************************************************************************/
u16 LCD_GetPixel( u8 x, u8 y )
{
u16 val;
LCD_RectRead( x, y, 1, 1, (u8*)&val );
return val;
}
/*******************************************************************************
*
* LCD_DisplayChar
*
*******************************************************************************/
/**
*
* Display at provided coordinates the provided ASCII character with the provided
* text and background colors and with the provided magnify coefficient.
*
* @param[in] x The horizontal coordinate of the character.
* @param[in] y The vertical coordinate of the character.
* @param[in] Ascii The ASCII code of the character to display.
* @n Ascii must be higher than 31 and lower than 127.
* @param[in] TextColor The color used to draw the character.
* @param[in] BGndColor The background color of the drawn character.
* @param[in] CharMagniCoeff The magnify coefficient used to draw the character.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void LCD_DisplayChar( u8 x, u8 y, u8 Ascii, u16 TextColor, u16 BGndColor, u16 CharMagniCoeff)
{
// Display the selected bitmap according to the provided ASCII character.
LCD_DrawChar( x, y, 7, (u8*)&AsciiDotsTable[ (Ascii-32) * 14 ], TextColor, BGndColor, CharMagniCoeff );
}
/*******************************************************************************
*
* LCD_SetRect_For_Cmd
*
*******************************************************************************/
/**
*
* Define the rectangle for the next command to be applied.
*
* @param[in] x The horizontal coordinate of the rectangle low left corner.
* @param[in] y The vertical coordinate of the rectangle low left corner.
* @param[in] width The rectangle width in pixels.
* @param[in] height The rectangle height in pixels.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void LCD_SetRect_For_Cmd( s16 x, s16 y, s16 width, s16 height )
{
LCD_SendLCDCmd( ST7637_CASET );
LCD_SendLCDData( y + OrientationOffsetX[ CurrentScreenOrientation ] );
LCD_SendLCDData( y + OrientationOffsetX[ CurrentScreenOrientation ] + height - 1 );
LCD_SendLCDCmd( ST7637_RASET );
LCD_SendLCDData( x + OrientationOffsetY[ CurrentScreenOrientation ] );
LCD_SendLCDData( x + OrientationOffsetY[ CurrentScreenOrientation ] + width - 1 );
}
/*******************************************************************************
*
* LCD_SetBackLight
*
*******************************************************************************/
/**
*
* Modify the PWM rate. Any value below BACKLIGHTMIN reset the value to the
* default value (DEFAULT_CCR_BACKLIGHTSTART).
*
* @param[in] newBacklightStart The new PWM rate.
*
**/
/******************************************************************************/
void LCD_SetBackLight( u32 newBacklightStart )
{
if( newBacklightStart >= BACKLIGHTMIN )
{
Current_CCR_BackLightStart = newBacklightStart;
}
else
{
Current_CCR_BackLightStart = DEFAULT_CCR_BACKLIGHTSTART;
}
}
/*******************************************************************************
*
* LCD_SetBackLightOff
*
*******************************************************************************/
/**
*
* Switch the LCD back light off.
*
**/
/******************************************************************************/
void LCD_SetBackLightOff( void )
{
Current_CCR_BackLightStart = 0;
}
/*******************************************************************************
*
* LCD_SetBackLightOn
*
*******************************************************************************/
/**
*
* Switch the LCD back light on.
*
**/
/******************************************************************************/
void LCD_SetBackLightOn( void )
{
Current_CCR_BackLightStart = DEFAULT_CCR_BACKLIGHTSTART;
}
/*******************************************************************************
*
* LCD_GetBackLight
*
*******************************************************************************/
/**
*
* Returns le LCD PWM rate.
*
* @return The current LCD PWM rate.
*
**/
/******************************************************************************/
u32 LCD_GetBackLight( void )
{
return Current_CCR_BackLightStart;
}
/*******************************************************************************
*
* LCD_SetRotateScreen
*
*******************************************************************************/
/**
*
* Enable or disable the ability of the screen display to rotate according to
* the MEMs information.
*
* @param[in] RotateScreen 0 to disable screen rotation and 1 to enable.
*
**/
/******************************************************************************/
void LCD_SetRotateScreen( u8 RotateScreen)
{
CurrentRotateScreen = RotateScreen;
}
/*******************************************************************************
*
* LCD_GetRotateScreen
*
*******************************************************************************/
/**
*
* Return the screen rotation mode.
*
* @retval 0 screen rotation is disabled.
* @retval 1 screen rotation is enabled.
*
**/
/******************************************************************************/
u8 LCD_GetRotateScreen( void )
{
return CurrentRotateScreen;
}
/*******************************************************************************
*
* LCD_SetScreenOrientation
*
*******************************************************************************/
/**
*
* Set the screen orientation.
*
* @param[in] ScreenOrientation The new screen orientation.
*
**/
/******************************************************************************/
void LCD_SetScreenOrientation( Rotate_H12_V_Match_TypeDef ScreenOrientation )
{
CurrentScreenOrientation = ScreenOrientation;
LCD_DisplayRotate( CurrentScreenOrientation );
}
/*******************************************************************************
*
* LCD_GetScreenOrientation
*
*******************************************************************************/
/**
*
* Return current screen orientation.
*
* @return A Rotate_H12_V_Match_TypeDef telling the current screen orientation.
*
**/
/******************************************************************************/
Rotate_H12_V_Match_TypeDef LCD_GetScreenOrientation( void )
{
return CurrentScreenOrientation;
}