/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LCD_H
#define __LCD_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
/** @addtogroup BSP
* @{
*/
/** @addtogroup Components
* @{
*/
/** @addtogroup LCD
* @{
*/
/** @defgroup LCD_Exported_Types
* @{
*/
/** @defgroup LCD_Driver_structure LCD Driver structure
* @{
*/
typedef struct
{
void (*Init)(void);
uint16_t (*ReadID)(void);
void (*DisplayOn)(void);
void (*DisplayOff)(void);
void (*SetCursor)(uint16_t, uint16_t);
void (*WritePixel)(uint16_t, uint16_t, uint16_t);
uint16_t (*ReadPixel)(uint16_t, uint16_t);
/* Optimized operation */
void (*SetDisplayWindow)(uint16_t, uint16_t, uint16_t, uint16_t);
void (*DrawHLine)(uint16_t, uint16_t, uint16_t, uint16_t);
void (*DrawVLine)(uint16_t, uint16_t, uint16_t, uint16_t);
uint16_t (*GetLcdPixelWidth)(void);
uint16_t (*GetLcdPixelHeight)(void);
void (*DrawBitmap)(uint16_t, uint16_t, uint8_t*);
void (*DrawRGBImage)(uint16_t, uint16_t, uint16_t, uint16_t, uint8_t*);
}LCD_DrvTypeDef;
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __LCD_H */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __st7789v_H
#define __st7789v_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "lcd.h"
/** @addtogroup BSP
* @{
*/
/** @addtogroup Components
* @{
*/
/** @addtogroup st7789v
* @{
*/
/** @defgroup st7789v_Exported_Types
* @{
*/
/**
* @}
*/
/** @defgroup st7789v_Exported_Constants
* @{
*/
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] st7789v Size
*/
#define st7789v_LCD_PIXEL_WIDTH ((uint16_t)128)
#define st7789v_LCD_PIXEL_HEIGHT ((uint16_t)160)
/**
* @brief LCD Lines depending on the chosen fonts.
*/
#define LCD_LINE_0 LINE(0)
#define LCD_LINE_1 LINE(1)
#define LCD_LINE_2 LINE(2)
#define LCD_LINE_3 LINE(3)
#define LCD_LINE_4 LINE(4)
#define LCD_LINE_5 LINE(5)
#define LCD_LINE_6 LINE(6)
#define LCD_LINE_7 LINE(7)
#define LCD_LINE_8 LINE(8)
#define LCD_LINE_9 LINE(9)
#define LCD_LINE_10 LINE(10)
#define LCD_LINE_11 LINE(11)
#define LCD_LINE_12 LINE(12)
#define LCD_LINE_13 LINE(13)
#define LCD_LINE_14 LINE(14)
#define LCD_LINE_15 LINE(15)
#define LCD_LINE_16 LINE(16)
#define LCD_LINE_17 LINE(17)
#define LCD_LINE_18 LINE(18)
#define LCD_LINE_19 LINE(19)
/**
* @}
*/
/** @defgroup ADAFRUIT_SPI_LCD_Exported_Functions
* @{
*/
void st7789v_Init(void);
uint16_t st7789v_ReadID(void);
void st7789v_DisplayOn(void);
void st7789v_DisplayOff(void);
void st7789v_SetCursor(uint16_t Xpos, uint16_t Ypos);
void st7789v_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode);
void st7789v_WriteReg(uint8_t LCDReg, uint8_t LCDRegValue);
uint8_t st7789v_ReadReg(uint8_t LCDReg);
void st7789v_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
void st7789v_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
void st7789v_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
uint16_t st7789v_GetLcdPixelWidth(void);
uint16_t st7789v_GetLcdPixelHeight(void);
void st7789v_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp);
/* LCD driver structure */
extern LCD_DrvTypeDef st7789v_drv;
/* LCD IO functions */
void LCD_IO_Init(void);
void LCD_IO_WriteMultipleData(uint8_t *pData, uint32_t Size);
void LCD_IO_WriteReg(uint8_t Reg);
void LCD_Delay(uint32_t delay);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __st7789v_H */
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/* Includes ------------------------------------------------------------------*/
#include "st7789v.h"
/** @addtogroup BSP
* @{
*/
/** @addtogroup Components
* @{
*/
/** @addtogroup st7789v
* @brief This file provides a set of functions needed to drive the
* st7789v LCD.
* @{
*/
/** @defgroup st7789v_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @defgroup st7789v_Private_Defines
* @{
*/
/**
* @}
*/
/** @defgroup st7789v_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup st7789v_Private_Variables
* @{
*/
LCD_DrvTypeDef st7789v_drv =
{
st7789v_Init,
0,
st7789v_DisplayOn,
st7789v_DisplayOff,
st7789v_SetCursor,
st7789v_WritePixel,
0,
st7789v_SetDisplayWindow,
st7789v_DrawHLine,
st7789v_DrawVLine,
st7789v_GetLcdPixelWidth,
st7789v_GetLcdPixelHeight,
st7789v_DrawBitmap,
};
static uint16_t ArrayRGB[320] = {0};
/**
* @}
*/
/** @defgroup st7789v_Private_FunctionPrototypes
* @{
*/
/**
* @}
*/
/** @defgroup st7789v_Private_Functions
* @{
*/
/**
* @brief Writes to the selected LCD register.
* @param LCDReg: Address of the selected register.
* @param LCDRegValue: value to write to the selected register.
* @retval None
*/
void st7789v_WriteReg(uint8_t LCDReg, uint8_t LCDRegValue)
{
LCD_IO_WriteReg(LCDReg);
LCD_IO_WriteMultipleData(&LCDRegValue, 1);
}
/**
* @brief Initialize the st7789v LCD Component.
* @param None
* @retval None
*/
void st7789v_Init(void)
{
/* Initialize st7789v low level bus layer -----------------------------------*/
LCD_IO_Init();
/* Out of sleep mode, 0 args, no delay */
st7789v_WriteReg(0x11, 0x00);
/**/
st7789v_WriteReg(0x36, 0x00);
st7789v_WriteReg(0x3A, 0x06);
st7789v_WriteReg(0xB2, 0x0C);
st7789v_WriteReg(0xB2, 0x0C);
st7789v_WriteReg(0xB2, 0x00);
st7789v_WriteReg(0xB2, 0x33);
st7789v_WriteReg(0xB2, 0x33);
st7789v_WriteReg(0xB7, 0x35); //VGH=13.26V, VGL=-10.43V
st7789v_WriteReg(0xBB, 0x38); //VCOM
st7789v_WriteReg(0xC0, 0x2C);
st7789v_WriteReg(0xC2, 0x01);
st7789v_WriteReg(0xC3, 0x1A); //VAP //5V
st7789v_WriteReg(0xC4, 0x20);
st7789v_WriteReg(0xC6, 0x0F);
st7789v_WriteReg(0xD0, 0xA4);
st7789v_WriteReg(0xD0, 0xA1);
st7789v_WriteReg(0xE0 , 0xD0);
st7789v_WriteReg(0xE0, 0x1E);
st7789v_WriteReg(0xE0, 0x24);
st7789v_WriteReg(0xE0, 0x0A);
st7789v_WriteReg(0xE0 , 0x0A);
st7789v_WriteReg(0xE0 , 0x26);
st7789v_WriteReg(0xE0, 0x44);
st7789v_WriteReg(0xE0, 0x44);
st7789v_WriteReg(0xE0, 0x57);
st7789v_WriteReg(0xE0, 0x29);
st7789v_WriteReg(0xE0 , 0x14);
st7789v_WriteReg(0xE0, 0x14);
st7789v_WriteReg(0xE0 , 0x30);
st7789v_WriteReg(0xE0 , 0x34);
st7789v_WriteReg(0xE1, 0xD0);
st7789v_WriteReg(0xE1 , 0x1E);
st7789v_WriteReg(0xE1, 0x23);
st7789v_WriteReg(0xE1 , 0x0A);
st7789v_WriteReg(0xE1, 0x09);
st7789v_WriteReg(0xE1, 0x25);
st7789v_WriteReg(0xE1 , 0x43);
st7789v_WriteReg(0xE1, 0x33);
st7789v_WriteReg(0xE1, 0x56);
st7789v_WriteReg(0xE1 , 0x28);
st7789v_WriteReg(0xE1 , 0x14);
st7789v_WriteReg(0xE1, 0x14);
st7789v_WriteReg(0xE1, 0x2F);
st7789v_WriteReg(0xE1 , 0x34);
st7789v_WriteReg(0x29,0x00);
st7789v_WriteReg(0x21, 0x00);
st7789v_WriteReg(0x2A, 0x00);
st7789v_WriteReg(0x2A , 0x00);
st7789v_WriteReg(0x2A , 0x00);
st7789v_WriteReg(0x2A , 0xEF);
st7789v_WriteReg(0x2B, 0x00);
st7789v_WriteReg(0x2B , 0x00);
st7789v_WriteReg(0x2B , 0x00);
st7789v_WriteReg(0x2B , 0xEF);
}
/**
* @brief Enables the Display.
* @param None
* @retval None
*/
void st7789v_DisplayOn(void)
{
uint8_t data = 0;
LCD_IO_WriteReg(0x13);/* Partial off (Normal): NORON */
LCD_Delay(10);
LCD_IO_WriteReg(0x29);/* Display on: DISPON */
LCD_Delay(10);
LCD_IO_WriteReg(0x36);/* Memory data access control: MADCTL */
data = 0xC0;
LCD_IO_WriteMultipleData(&data, 1);
}
/**
* @brief Disables the Display.
* @param None
* @retval None
*/
void st7789v_DisplayOff(void)
{
uint8_t data = 0;
LCD_IO_WriteReg(0x13);/* Partial off (Normal): NORON */
LCD_Delay(10);
LCD_IO_WriteReg(0x28);/* Display off: DISPOFF */
LCD_Delay(10);
LCD_IO_WriteReg(0x36);/* Memory data access control: MADCTL */
data = 0xC0;
LCD_IO_WriteMultipleData(&data, 1);
}
/**
* @brief Sets Cursor position.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @retval None
*/
void st7789v_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
uint8_t data = 0;
LCD_IO_WriteReg(0x2A);/* Column address set: CASET */
data = (Xpos) >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = (Xpos) & 0xFF;
LCD_IO_WriteMultipleData(&data, 1);
LCD_IO_WriteReg(0x2B);/* Row address set: RASET */
data = (Ypos) >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = (Ypos) & 0xFF;
LCD_IO_WriteMultipleData(&data, 1);
LCD_IO_WriteReg(0x2C);/* Memory write: RAMWR */
}
/**
* @brief Writes pixel.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param RGBCode: the RGB pixel color
* @retval None
*/
void st7789v_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
uint8_t data = 0;
if((Xpos >= st7789v_LCD_PIXEL_WIDTH) || (Ypos >= st7789v_LCD_PIXEL_HEIGHT))
{
return;
}
/* Set Cursor */
st7789v_SetCursor(Xpos, Ypos);
data = RGBCode >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = RGBCode;
LCD_IO_WriteMultipleData(&data, 1);
}
/**
* @brief Sets a display window
* @param Xpos: specifies the X bottom left position.
* @param Ypos: specifies the Y bottom left position.
* @param Height: display window height.
* @param Width: display window width.
* @retval None
*/
void st7789v_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
uint8_t data = 0;
/* Column addr set, 4 args, no delay: XSTART = Xpos, XEND = (Xpos + Width - 1) */
LCD_IO_WriteReg(0x2A);/* Column address set: CASET */
data = (Xpos) >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = (Xpos) & 0xFF;
LCD_IO_WriteMultipleData(&data, 1);
data = (Xpos + Width - 1) >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = (Xpos + Width - 1) & 0xFF;
LCD_IO_WriteMultipleData(&data, 1);
/* Row addr set, 4 args, no delay: YSTART = Ypos, YEND = (Ypos + Height - 1) */
LCD_IO_WriteReg(0x2B);/* Row address set: RASET */
data = (Ypos) >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = (Ypos) & 0xFF;
LCD_IO_WriteMultipleData(&data, 1);
data = (Ypos + Height - 1) >> 8;
LCD_IO_WriteMultipleData(&data, 1);
data = (Ypos + Height - 1) & 0xFF;
LCD_IO_WriteMultipleData(&data, 1);
}
/**
* @brief Draws horizontal line.
* @param RGBCode: Specifies the RGB color
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Length: specifies the line length.
* @retval None
*/
void st7789v_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length)
{
uint8_t counter = 0;
if(Xpos + Length > st7789v_LCD_PIXEL_WIDTH) return;
/* Set Cursor */
st7789v_SetCursor(Xpos, Ypos);
for(counter = 0; counter < Length; counter++)
{
ArrayRGB[counter] = RGBCode;
}
LCD_IO_WriteMultipleData((uint8_t*)&ArrayRGB[0], Length * 2);
}
/**
* @brief Draws vertical line.
* @param RGBCode: Specifies the RGB color
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Length: specifies the line length.
* @retval None
*/
void st7789v_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length)
{
uint8_t counter = 0;
if(Ypos + Length > st7789v_LCD_PIXEL_HEIGHT) return;
for(counter = 0; counter < Length; counter++)
{
st7789v_WritePixel(Xpos, Ypos + counter, RGBCode);
}
}
/**
* @brief Gets the LCD pixel Width.
* @param None
* @retval The Lcd Pixel Width
*/
uint16_t st7789v_GetLcdPixelWidth(void)
{
return st7789v_LCD_PIXEL_WIDTH;
}
/**
* @brief Gets the LCD pixel Height.
* @param None
* @retval The Lcd Pixel Height
*/
uint16_t st7789v_GetLcdPixelHeight(void)
{
return st7789v_LCD_PIXEL_HEIGHT;
}
/**
* @brief Displays a bitmap picture loaded in the internal Flash.
* @param BmpAddress: Bmp picture address in the internal Flash.
* @retval None
*/
void st7789v_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp)
{
uint32_t index = 0, size = 0;
/* Read bitmap size */
size = *(volatile uint16_t *) (pbmp + 2);
size |= (*(volatile uint16_t *) (pbmp + 4)) << 16;
/* Get bitmap data address offset */
index = *(volatile uint16_t *) (pbmp + 10);
index |= (*(volatile uint16_t *) (pbmp + 12)) << 16;
size = (size - index)/2;
pbmp += index;
/* Set GRAM write direction and BGR = 0 */
/* Memory access control: MY = 0, MX = 1, MV = 0, ML = 0 */
st7789v_WriteReg(0x36, 0x40);// LCD_REG_54 0x36 /* Memory data access control: MADCTL */
/* Set Cursor */
st7789v_SetCursor(Xpos, Ypos);
LCD_IO_WriteMultipleData((uint8_t*)pbmp, size*2);
/* Set GRAM write direction and BGR = 0 */
/* Memory access control: MY = 1, MX = 1, MV = 0, ML = 0 */
st7789v_WriteReg(0x36, 0xC0);/* Memory data access control: MADCTL */
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/* Includes ------------------------------------------------------------------*/
#include "st7735.h"
/** @addtogroup BSP
* @{
*/
/** @addtogroup Components
* @{
*/
/** @addtogroup ST7735
* @brief This file provides a set of functions needed to drive the
* ST7735 LCD.
* @{
*/
/** @defgroup ST7735_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @defgroup ST7735_Private_Defines
* @{
*/
/**
* @}
*/
/** @defgroup ST7735_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup ST7735_Private_Variables
* @{
*/
LCD_DrvTypeDef st7735_drv =
{
st7735_Init,
0,
st7735_DisplayOn,
st7735_DisplayOff,
st7735_SetCursor,
st7735_WritePixel,
0,
st7735_SetDisplayWindow,
st7735_DrawHLine,
st7735_DrawVLine,
st7735_GetLcdPixelWidth,
st7735_GetLcdPixelHeight,
st7735_DrawBitmap,
};
static uint16_t ArrayRGB[320] = {0};
/**
* @}
*/
/** @defgroup ST7735_Private_FunctionPrototypes
* @{
*/
/**
* @}
*/
/** @defgroup ST7735_Private_Functions
* @{
*/
/**
* @brief Initialize the ST7735 LCD Component.
* @param None
* @retval None
*/
void st7735_Init(void)
{
/* Initialize ST7735 low level bus layer -----------------------------------*/
LCD_IO_Init();
LCD_HW_RESET();
/* Out of sleep mode*/
LCD_IO_WriteReg(0x11);
LCD_Delay(120);//120ms
/* Frame rate ctrl - normal mode, 3 args:Rate = fosc/(1x2+40) * (LINE+2C+2D)*/
LCD_IO_WriteReg(0xB1);
LCD_IO_WriteData(0x01);
LCD_IO_WriteData(0x2C);
LCD_IO_WriteData(0x2D);
/* Frame rate control - idle mode, 3 args:Rate = fosc/(1x2+40) * (LINE+2C+2D) */
LCD_IO_WriteReg(0xB2);
LCD_IO_WriteData(0x01);
LCD_IO_WriteData(0x2C);
LCD_IO_WriteData(0x2D);
/* Frame rate ctrl - partial mode, 6 args: Dot inversion mode, Line inversion mode */
LCD_IO_WriteReg(0xB3);
LCD_IO_WriteData(0x01);
LCD_IO_WriteData(0x2C);
LCD_IO_WriteData(0x2D);
LCD_IO_WriteData(0x01);
LCD_IO_WriteData(0x2C);
LCD_IO_WriteData(0x2D);
/* Display inversion ctrl, 1 arg, no delay: No inversion */
st7735_WriteReg(0xB4, 0x07);
/* Power control, 3 args, no delay: -4.6V , AUTO mode */
LCD_IO_WriteReg(0xC0);
LCD_IO_WriteData(0xA2);
LCD_IO_WriteData(0x02);
LCD_IO_WriteData(0x84);
/* Power control, 1 arg, no delay: VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD */
st7735_WriteReg(0xC1, 0xC5);
/* Power control, 2 args, no delay: Opamp current small, Boost frequency */
LCD_IO_WriteReg(0xC2);
LCD_IO_WriteData(0x0A);
LCD_IO_WriteData(0x00);
/* Power control, 2 args, no delay: BCLK/2, Opamp current small & Medium low */
LCD_IO_WriteReg(0xC3);
LCD_IO_WriteData(0x8A);
LCD_IO_WriteData(0x2A);
/* Power control, 2 args, no delay */
LCD_IO_WriteReg(0xC4);
LCD_IO_WriteData(0x8A);
LCD_IO_WriteData(0xEE);
/* Power control, 1 arg, no delay */
st7735_WriteReg(0xC5, 0x0E);
/* Don't invert display, no args, no delay */
LCD_IO_WriteReg(0x20);
/* Set color mode, 1 arg, no delay: 16-bit color */
st7735_WriteReg(0x3A, 0x05);
/* Column addr set, 4 args, no delay: XSTART = 0, XEND = 127 */
LCD_IO_WriteReg(0x2A);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x7F);
/* Row addr set, 4 args, no delay: YSTART = 0, YEND = 159 */
LCD_IO_WriteReg(0x2B);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x9F);
/* Magical unicorn dust, 16 args, no delay */
LCD_IO_WriteReg(0xE0);
LCD_IO_WriteData(0x02);
LCD_IO_WriteData(0x1c);
LCD_IO_WriteData(0x07);
LCD_IO_WriteData(0x12);
LCD_IO_WriteData(0x37);
LCD_IO_WriteData(0x32);
LCD_IO_WriteData(0x29);
LCD_IO_WriteData(0x2d);
LCD_IO_WriteData(0x29);
LCD_IO_WriteData(0x25);
LCD_IO_WriteData(0x2B);
LCD_IO_WriteData(0x39);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x01);
LCD_IO_WriteData(0x03);
LCD_IO_WriteData(0x10);
/* Sparkles and rainbows, 16 args, no delay */
LCD_IO_WriteReg(0xE0);
LCD_IO_WriteData(0x03);
LCD_IO_WriteData(0x1d);
LCD_IO_WriteData(0x07);
LCD_IO_WriteData(0x06);
LCD_IO_WriteData(0x2E);
LCD_IO_WriteData(0x2C);
LCD_IO_WriteData(0x29);
LCD_IO_WriteData(0x2D);
LCD_IO_WriteData(0x2E);
LCD_IO_WriteData(0x2E);
LCD_IO_WriteData(0x37);
LCD_IO_WriteData(0x3F);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x00);
LCD_IO_WriteData(0x02);
LCD_IO_WriteData(0x10);
/* Normal display on, no args, no delay */
st7735_WriteReg(0x13, 0x00);
/* Main screen turn on, no delay */
st7735_WriteReg(0x29, 0x00);
/* Memory access control: MY = 1, MX = 1, MV = 0, ML = 0 */
st7735_WriteReg(0x36, 0xC0);
}
/**
* @brief Enables the Display.
* @param None
* @retval None
*/
void st7735_DisplayOn(void)
{
LCD_IO_WriteReg(0x13);
LCD_Delay(10);
LCD_IO_WriteReg(0x29);
LCD_Delay(10);
LCD_IO_WriteReg(0x36);
LCD_IO_WriteData(0xC0);
}
/**
* @brief Disables the Display.
* @param None
* @retval None
*/
void st7735_DisplayOff(void)
{
LCD_IO_WriteReg(0x13);
LCD_Delay(10);
LCD_IO_WriteReg(0x28);
LCD_Delay(10);
LCD_IO_WriteReg(0x36);
LCD_IO_WriteData(0xC0);
}
/**
* @brief Sets Cursor position.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @retval None
*/
void st7735_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
LCD_IO_WriteReg(0x2A);
LCD_IO_WriteData((Xpos) >> 8);
LCD_IO_WriteData((Xpos) & 0xFF);
LCD_IO_WriteReg(0x2B);
LCD_IO_WriteData((Ypos) >> 8);
LCD_IO_WriteData((Ypos) & 0xFF);
LCD_IO_WriteReg(0x2C);
}
/**
* @brief Writes pixel.
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param RGBCode: the RGB pixel color
* @retval None
*/
void st7735_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
{
if((Xpos >= ST7735_LCD_PIXEL_WIDTH) || (Ypos >= ST7735_LCD_PIXEL_HEIGHT))
{
return;
}
/* Set Cursor */
st7735_SetCursor(Xpos, Ypos);
LCD_IO_WriteData(RGBCode >> 8);
LCD_IO_WriteData(RGBCode);
}
/**
* @brief Writes to the selected LCD register.
* @param LCDReg: Address of the selected register.
* @param LCDRegValue: value to write to the selected register.
* @retval None
*/
void st7735_WriteReg(uint8_t LCDReg, uint8_t LCDRegValue)
{
LCD_IO_WriteReg(LCDReg);
LCD_IO_WriteData(LCDRegValue);
}
/**
* @brief Sets a display window
* @param Xpos: specifies the X bottom left position.
* @param Ypos: specifies the Y bottom left position.
* @param Height: display window height.
* @param Width: display window width.
* @retval None
*/
void st7735_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
/* Column addr set, 4 args, no delay: XSTART = Xpos, XEND = (Xpos + Width - 1) */
LCD_IO_WriteReg(0x2A);
LCD_IO_WriteData((Xpos) >> 8);
LCD_IO_WriteData((Xpos) & 0xFF);
LCD_IO_WriteData((Xpos + Width - 1) >> 8);
LCD_IO_WriteData((Xpos + Width - 1) & 0xFF);
/* Row addr set, 4 args, no delay: YSTART = Ypos, YEND = (Ypos + Height - 1) */
LCD_IO_WriteReg(0x2B);
LCD_IO_WriteData((Ypos) >> 8 );
LCD_IO_WriteData((Ypos) & 0xFF );
LCD_IO_WriteData((Ypos + Height - 1) >> 8 );
LCD_IO_WriteData((Ypos + Height - 1) & 0xFF );
}
/**
* @brief Draws horizontal line.
* @param RGBCode: Specifies the RGB color
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Length: specifies the line length.
* @retval None
*/
void st7735_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length)
{
uint8_t counter = 0;
if(Xpos + Length > ST7735_LCD_PIXEL_WIDTH) return;
/* Set Cursor */
st7735_SetCursor(Xpos, Ypos);
for(counter = 0; counter < Length; counter++)
{
ArrayRGB[counter] = RGBCode;
}
LCD_IO_WriteMultipleData((uint8_t*)&ArrayRGB[0], Length * 2);
}
/**
* @brief Draws vertical line.
* @param RGBCode: Specifies the RGB color
* @param Xpos: specifies the X position.
* @param Ypos: specifies the Y position.
* @param Length: specifies the line length.
* @retval None
*/
void st7735_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length)
{
uint8_t counter = 0;
if(Ypos + Length > ST7735_LCD_PIXEL_HEIGHT) return;
for(counter = 0; counter < Length; counter++)
{
st7735_WritePixel(Xpos, Ypos + counter, RGBCode);
}
}
/**
* @brief Gets the LCD pixel Width.
* @param None
* @retval The Lcd Pixel Width
*/
uint16_t st7735_GetLcdPixelWidth(void)
{
return ST7735_LCD_PIXEL_WIDTH;
}
/**
* @brief Gets the LCD pixel Height.
* @param None
* @retval The Lcd Pixel Height
*/
uint16_t st7735_GetLcdPixelHeight(void)
{
return ST7735_LCD_PIXEL_HEIGHT;
}
/**
* @brief Displays a bitmap picture loaded in the internal Flash.
* @param BmpAddress: Bmp picture address in the internal Flash.
* @retval None
*/
void st7735_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp)
{
uint32_t index = 0, size = 0;
/* Read bitmap size */
size = *(volatile uint16_t *) (pbmp + 2);
size |= (*(volatile uint16_t *) (pbmp + 4)) << 16;
/* Get bitmap data address offset */
index = *(volatile uint16_t *) (pbmp + 10);
index |= (*(volatile uint16_t *) (pbmp + 12)) << 16;
size = (size - index)/2;
pbmp += index;
/* Set GRAM write direction and BGR = 0 */
/* Memory access control: MY = 0, MX = 1, MV = 0, ML = 0 */
st7735_WriteReg(0x36, 0x40);
/* Set Cursor */
st7735_SetCursor(Xpos, Ypos);
LCD_IO_WriteMultipleData((uint8_t*)pbmp, size*2);
/* Set GRAM write direction and BGR = 0 */
/* Memory access control: MY = 1, MX = 1, MV = 0, ML = 0 */
st7735_WriteReg(0x36, 0xC0);
}
#ifndef __ST7735_H
#define __ST7735_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "../Common/lcd.h"
#include "stm32f1xx_board.h"
/** @addtogroup BSP
* @{
*/
/** @addtogroup Components
* @{
*/
/** @addtogroup ST7735
* @{
*/
/** @defgroup ST7735_Exported_Types
* @{
*/
/**
* @}
*/
/** @defgroup ST7735_Exported_Constants
* @{
*/
/**
* @brief ST7735 Size
*/
#define ST7735_LCD_PIXEL_WIDTH ((uint16_t)128)
#define ST7735_LCD_PIXEL_HEIGHT ((uint16_t)160)
/**
* @brief LCD Lines depending on the chosen fonts.
*/
#define LCD_LINE_0 LINE(0)
#define LCD_LINE_1 LINE(1)
#define LCD_LINE_2 LINE(2)
#define LCD_LINE_3 LINE(3)
#define LCD_LINE_4 LINE(4)
#define LCD_LINE_5 LINE(5)
#define LCD_LINE_6 LINE(6)
#define LCD_LINE_7 LINE(7)
#define LCD_LINE_8 LINE(8)
#define LCD_LINE_9 LINE(9)
#define LCD_LINE_10 LINE(10)
#define LCD_LINE_11 LINE(11)
#define LCD_LINE_12 LINE(12)
#define LCD_LINE_13 LINE(13)
#define LCD_LINE_14 LINE(14)
#define LCD_LINE_15 LINE(15)
#define LCD_LINE_16 LINE(16)
#define LCD_LINE_17 LINE(17)
#define LCD_LINE_18 LINE(18)
#define LCD_LINE_19 LINE(19)
/**
* @}
*/
/** @defgroup ADAFRUIT_SPI_LCD_Exported_Functions
* @{
*/
void st7735_Init(void);
uint16_t st7735_ReadID(void);
void st7735_DisplayOn(void);
void st7735_DisplayOff(void);
void st7735_SetCursor(uint16_t Xpos, uint16_t Ypos);
void st7735_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode);
void st7735_WriteReg(uint8_t LCDReg, uint8_t LCDRegValue);
uint8_t st7735_ReadReg(uint8_t LCDReg);
void st7735_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
void st7735_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
void st7735_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
uint16_t st7735_GetLcdPixelWidth(void);
uint16_t st7735_GetLcdPixelHeight(void);
void st7735_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp);
/* LCD driver structure */
extern LCD_DrvTypeDef st7735_drv;
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __ST7735_H */