Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: CMSIS_STM32L4xx CMSIS_DSP_401 STM32L4xx_HAL_Driver
Components/st7735/st7735.c@2:a9f205b30d61, 2015-11-12 (annotated)
- Committer:
- EricLew
- Date:
- Thu Nov 12 20:53:23 2015 +0000
- Revision:
- 2:a9f205b30d61
- Parent:
- 0:ad9dfc0179dc
commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| EricLew | 0:ad9dfc0179dc | 1 | /** |
| EricLew | 0:ad9dfc0179dc | 2 | ****************************************************************************** |
| EricLew | 0:ad9dfc0179dc | 3 | * @file st7735.c |
| EricLew | 0:ad9dfc0179dc | 4 | * @author MCD Application Team |
| EricLew | 0:ad9dfc0179dc | 5 | * @version V1.1.1 |
| EricLew | 0:ad9dfc0179dc | 6 | * @date 24-November-2014 |
| EricLew | 0:ad9dfc0179dc | 7 | * @brief This file includes the driver for ST7735 LCD mounted on the Adafruit |
| EricLew | 0:ad9dfc0179dc | 8 | * 1.8" TFT LCD shield (reference ID 802). |
| EricLew | 0:ad9dfc0179dc | 9 | ****************************************************************************** |
| EricLew | 0:ad9dfc0179dc | 10 | * @attention |
| EricLew | 0:ad9dfc0179dc | 11 | * |
| EricLew | 0:ad9dfc0179dc | 12 | * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> |
| EricLew | 0:ad9dfc0179dc | 13 | * |
| EricLew | 0:ad9dfc0179dc | 14 | * Redistribution and use in source and binary forms, with or without modification, |
| EricLew | 0:ad9dfc0179dc | 15 | * are permitted provided that the following conditions are met: |
| EricLew | 0:ad9dfc0179dc | 16 | * 1. Redistributions of source code must retain the above copyright notice, |
| EricLew | 0:ad9dfc0179dc | 17 | * this list of conditions and the following disclaimer. |
| EricLew | 0:ad9dfc0179dc | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
| EricLew | 0:ad9dfc0179dc | 19 | * this list of conditions and the following disclaimer in the documentation |
| EricLew | 0:ad9dfc0179dc | 20 | * and/or other materials provided with the distribution. |
| EricLew | 0:ad9dfc0179dc | 21 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
| EricLew | 0:ad9dfc0179dc | 22 | * may be used to endorse or promote products derived from this software |
| EricLew | 0:ad9dfc0179dc | 23 | * without specific prior written permission. |
| EricLew | 0:ad9dfc0179dc | 24 | * |
| EricLew | 0:ad9dfc0179dc | 25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| EricLew | 0:ad9dfc0179dc | 26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| EricLew | 0:ad9dfc0179dc | 27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| EricLew | 0:ad9dfc0179dc | 28 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| EricLew | 0:ad9dfc0179dc | 29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| EricLew | 0:ad9dfc0179dc | 30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| EricLew | 0:ad9dfc0179dc | 31 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| EricLew | 0:ad9dfc0179dc | 32 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| EricLew | 0:ad9dfc0179dc | 33 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| EricLew | 0:ad9dfc0179dc | 34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| EricLew | 0:ad9dfc0179dc | 35 | * |
| EricLew | 0:ad9dfc0179dc | 36 | ****************************************************************************** |
| EricLew | 0:ad9dfc0179dc | 37 | */ |
| EricLew | 0:ad9dfc0179dc | 38 | |
| EricLew | 0:ad9dfc0179dc | 39 | /* Includes ------------------------------------------------------------------*/ |
| EricLew | 0:ad9dfc0179dc | 40 | #include "st7735.h" |
| EricLew | 0:ad9dfc0179dc | 41 | |
| EricLew | 0:ad9dfc0179dc | 42 | /** @addtogroup BSP |
| EricLew | 0:ad9dfc0179dc | 43 | * @{ |
| EricLew | 0:ad9dfc0179dc | 44 | */ |
| EricLew | 0:ad9dfc0179dc | 45 | |
| EricLew | 0:ad9dfc0179dc | 46 | /** @addtogroup Components |
| EricLew | 0:ad9dfc0179dc | 47 | * @{ |
| EricLew | 0:ad9dfc0179dc | 48 | */ |
| EricLew | 0:ad9dfc0179dc | 49 | |
| EricLew | 0:ad9dfc0179dc | 50 | /** @addtogroup ST7735 |
| EricLew | 0:ad9dfc0179dc | 51 | * @brief This file provides a set of functions needed to drive the |
| EricLew | 0:ad9dfc0179dc | 52 | * ST7735 LCD. |
| EricLew | 0:ad9dfc0179dc | 53 | * @{ |
| EricLew | 0:ad9dfc0179dc | 54 | */ |
| EricLew | 0:ad9dfc0179dc | 55 | |
| EricLew | 0:ad9dfc0179dc | 56 | /** @defgroup ST7735_Private_TypesDefinitions |
| EricLew | 0:ad9dfc0179dc | 57 | * @{ |
| EricLew | 0:ad9dfc0179dc | 58 | */ |
| EricLew | 0:ad9dfc0179dc | 59 | |
| EricLew | 0:ad9dfc0179dc | 60 | /** |
| EricLew | 0:ad9dfc0179dc | 61 | * @} |
| EricLew | 0:ad9dfc0179dc | 62 | */ |
| EricLew | 0:ad9dfc0179dc | 63 | |
| EricLew | 0:ad9dfc0179dc | 64 | /** @defgroup ST7735_Private_Defines |
| EricLew | 0:ad9dfc0179dc | 65 | * @{ |
| EricLew | 0:ad9dfc0179dc | 66 | */ |
| EricLew | 0:ad9dfc0179dc | 67 | |
| EricLew | 0:ad9dfc0179dc | 68 | /** |
| EricLew | 0:ad9dfc0179dc | 69 | * @} |
| EricLew | 0:ad9dfc0179dc | 70 | */ |
| EricLew | 0:ad9dfc0179dc | 71 | |
| EricLew | 0:ad9dfc0179dc | 72 | /** @defgroup ST7735_Private_Macros |
| EricLew | 0:ad9dfc0179dc | 73 | * @{ |
| EricLew | 0:ad9dfc0179dc | 74 | */ |
| EricLew | 0:ad9dfc0179dc | 75 | |
| EricLew | 0:ad9dfc0179dc | 76 | /** |
| EricLew | 0:ad9dfc0179dc | 77 | * @} |
| EricLew | 0:ad9dfc0179dc | 78 | */ |
| EricLew | 0:ad9dfc0179dc | 79 | |
| EricLew | 0:ad9dfc0179dc | 80 | /** @defgroup ST7735_Private_Variables |
| EricLew | 0:ad9dfc0179dc | 81 | * @{ |
| EricLew | 0:ad9dfc0179dc | 82 | */ |
| EricLew | 0:ad9dfc0179dc | 83 | |
| EricLew | 0:ad9dfc0179dc | 84 | |
| EricLew | 0:ad9dfc0179dc | 85 | LCD_DrvTypeDef st7735_drv = |
| EricLew | 0:ad9dfc0179dc | 86 | { |
| EricLew | 0:ad9dfc0179dc | 87 | st7735_Init, |
| EricLew | 0:ad9dfc0179dc | 88 | 0, |
| EricLew | 0:ad9dfc0179dc | 89 | st7735_DisplayOn, |
| EricLew | 0:ad9dfc0179dc | 90 | st7735_DisplayOff, |
| EricLew | 0:ad9dfc0179dc | 91 | st7735_SetCursor, |
| EricLew | 0:ad9dfc0179dc | 92 | st7735_WritePixel, |
| EricLew | 0:ad9dfc0179dc | 93 | 0, |
| EricLew | 0:ad9dfc0179dc | 94 | st7735_SetDisplayWindow, |
| EricLew | 0:ad9dfc0179dc | 95 | st7735_DrawHLine, |
| EricLew | 0:ad9dfc0179dc | 96 | st7735_DrawVLine, |
| EricLew | 0:ad9dfc0179dc | 97 | st7735_GetLcdPixelWidth, |
| EricLew | 0:ad9dfc0179dc | 98 | st7735_GetLcdPixelHeight, |
| EricLew | 0:ad9dfc0179dc | 99 | st7735_DrawBitmap, |
| EricLew | 0:ad9dfc0179dc | 100 | }; |
| EricLew | 0:ad9dfc0179dc | 101 | |
| EricLew | 0:ad9dfc0179dc | 102 | static uint16_t ArrayRGB[320] = {0}; |
| EricLew | 0:ad9dfc0179dc | 103 | |
| EricLew | 0:ad9dfc0179dc | 104 | /** |
| EricLew | 0:ad9dfc0179dc | 105 | * @} |
| EricLew | 0:ad9dfc0179dc | 106 | */ |
| EricLew | 0:ad9dfc0179dc | 107 | |
| EricLew | 0:ad9dfc0179dc | 108 | /** @defgroup ST7735_Private_FunctionPrototypes |
| EricLew | 0:ad9dfc0179dc | 109 | * @{ |
| EricLew | 0:ad9dfc0179dc | 110 | */ |
| EricLew | 0:ad9dfc0179dc | 111 | |
| EricLew | 0:ad9dfc0179dc | 112 | /** |
| EricLew | 0:ad9dfc0179dc | 113 | * @} |
| EricLew | 0:ad9dfc0179dc | 114 | */ |
| EricLew | 0:ad9dfc0179dc | 115 | |
| EricLew | 0:ad9dfc0179dc | 116 | /** @defgroup ST7735_Private_Functions |
| EricLew | 0:ad9dfc0179dc | 117 | * @{ |
| EricLew | 0:ad9dfc0179dc | 118 | */ |
| EricLew | 0:ad9dfc0179dc | 119 | |
| EricLew | 0:ad9dfc0179dc | 120 | /** |
| EricLew | 0:ad9dfc0179dc | 121 | * @brief Initialize the ST7735 LCD Component. |
| EricLew | 0:ad9dfc0179dc | 122 | * @param None |
| EricLew | 0:ad9dfc0179dc | 123 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 124 | */ |
| EricLew | 0:ad9dfc0179dc | 125 | void st7735_Init(void) |
| EricLew | 0:ad9dfc0179dc | 126 | { |
| EricLew | 0:ad9dfc0179dc | 127 | uint8_t data = 0; |
| EricLew | 0:ad9dfc0179dc | 128 | |
| EricLew | 0:ad9dfc0179dc | 129 | /* Initialize ST7735 low level bus layer -----------------------------------*/ |
| EricLew | 0:ad9dfc0179dc | 130 | LCD_IO_Init(); |
| EricLew | 0:ad9dfc0179dc | 131 | /* Out of sleep mode, 0 args, no delay */ |
| EricLew | 0:ad9dfc0179dc | 132 | st7735_WriteReg(LCD_REG_17, 0x00); |
| EricLew | 0:ad9dfc0179dc | 133 | /* Frame rate ctrl - normal mode, 3 args:Rate = fosc/(1x2+40) * (LINE+2C+2D)*/ |
| EricLew | 0:ad9dfc0179dc | 134 | LCD_IO_WriteReg(LCD_REG_177); |
| EricLew | 0:ad9dfc0179dc | 135 | data = 0x01; |
| EricLew | 0:ad9dfc0179dc | 136 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 137 | data = 0x2C; |
| EricLew | 0:ad9dfc0179dc | 138 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 139 | data = 0x2D; |
| EricLew | 0:ad9dfc0179dc | 140 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 141 | /* Frame rate control - idle mode, 3 args:Rate = fosc/(1x2+40) * (LINE+2C+2D) */ |
| EricLew | 0:ad9dfc0179dc | 142 | st7735_WriteReg(LCD_REG_178, 0x01); |
| EricLew | 0:ad9dfc0179dc | 143 | st7735_WriteReg(LCD_REG_178, 0x2C); |
| EricLew | 0:ad9dfc0179dc | 144 | st7735_WriteReg(LCD_REG_178, 0x2D); |
| EricLew | 0:ad9dfc0179dc | 145 | /* Frame rate ctrl - partial mode, 6 args: Dot inversion mode, Line inversion mode */ |
| EricLew | 0:ad9dfc0179dc | 146 | st7735_WriteReg(LCD_REG_179, 0x01); |
| EricLew | 0:ad9dfc0179dc | 147 | st7735_WriteReg(LCD_REG_179, 0x2C); |
| EricLew | 0:ad9dfc0179dc | 148 | st7735_WriteReg(LCD_REG_179, 0x2D); |
| EricLew | 0:ad9dfc0179dc | 149 | st7735_WriteReg(LCD_REG_179, 0x01); |
| EricLew | 0:ad9dfc0179dc | 150 | st7735_WriteReg(LCD_REG_179, 0x2C); |
| EricLew | 0:ad9dfc0179dc | 151 | st7735_WriteReg(LCD_REG_179, 0x2D); |
| EricLew | 0:ad9dfc0179dc | 152 | /* Display inversion ctrl, 1 arg, no delay: No inversion */ |
| EricLew | 0:ad9dfc0179dc | 153 | st7735_WriteReg(LCD_REG_180, 0x07); |
| EricLew | 0:ad9dfc0179dc | 154 | /* Power control, 3 args, no delay: -4.6V , AUTO mode */ |
| EricLew | 0:ad9dfc0179dc | 155 | st7735_WriteReg(LCD_REG_192, 0xA2); |
| EricLew | 0:ad9dfc0179dc | 156 | st7735_WriteReg(LCD_REG_192, 0x02); |
| EricLew | 0:ad9dfc0179dc | 157 | st7735_WriteReg(LCD_REG_192, 0x84); |
| EricLew | 0:ad9dfc0179dc | 158 | /* Power control, 1 arg, no delay: VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD */ |
| EricLew | 0:ad9dfc0179dc | 159 | st7735_WriteReg(LCD_REG_193, 0xC5); |
| EricLew | 0:ad9dfc0179dc | 160 | /* Power control, 2 args, no delay: Opamp current small, Boost frequency */ |
| EricLew | 0:ad9dfc0179dc | 161 | st7735_WriteReg(LCD_REG_194, 0x0A); |
| EricLew | 0:ad9dfc0179dc | 162 | st7735_WriteReg(LCD_REG_194, 0x00); |
| EricLew | 0:ad9dfc0179dc | 163 | /* Power control, 2 args, no delay: BCLK/2, Opamp current small & Medium low */ |
| EricLew | 0:ad9dfc0179dc | 164 | st7735_WriteReg(LCD_REG_195, 0x8A); |
| EricLew | 0:ad9dfc0179dc | 165 | st7735_WriteReg(LCD_REG_195, 0x2A); |
| EricLew | 0:ad9dfc0179dc | 166 | /* Power control, 2 args, no delay */ |
| EricLew | 0:ad9dfc0179dc | 167 | st7735_WriteReg(LCD_REG_196, 0x8A); |
| EricLew | 0:ad9dfc0179dc | 168 | st7735_WriteReg(LCD_REG_196, 0xEE); |
| EricLew | 0:ad9dfc0179dc | 169 | /* Power control, 1 arg, no delay */ |
| EricLew | 0:ad9dfc0179dc | 170 | st7735_WriteReg(LCD_REG_197, 0x0E); |
| EricLew | 0:ad9dfc0179dc | 171 | /* Don't invert display, no args, no delay */ |
| EricLew | 0:ad9dfc0179dc | 172 | LCD_IO_WriteReg(LCD_REG_32); |
| EricLew | 0:ad9dfc0179dc | 173 | /* Set color mode, 1 arg, no delay: 16-bit color */ |
| EricLew | 0:ad9dfc0179dc | 174 | st7735_WriteReg(LCD_REG_58, 0x05); |
| EricLew | 0:ad9dfc0179dc | 175 | /* Column addr set, 4 args, no delay: XSTART = 0, XEND = 127 */ |
| EricLew | 0:ad9dfc0179dc | 176 | LCD_IO_WriteReg(LCD_REG_42); |
| EricLew | 0:ad9dfc0179dc | 177 | data = 0x00; |
| EricLew | 0:ad9dfc0179dc | 178 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 179 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 180 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 181 | data = 0x7F; |
| EricLew | 0:ad9dfc0179dc | 182 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 183 | /* Row addr set, 4 args, no delay: YSTART = 0, YEND = 159 */ |
| EricLew | 0:ad9dfc0179dc | 184 | LCD_IO_WriteReg(LCD_REG_43); |
| EricLew | 0:ad9dfc0179dc | 185 | data = 0x00; |
| EricLew | 0:ad9dfc0179dc | 186 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 187 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 188 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 189 | data = 0x9F; |
| EricLew | 0:ad9dfc0179dc | 190 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 191 | /* Magical unicorn dust, 16 args, no delay */ |
| EricLew | 0:ad9dfc0179dc | 192 | st7735_WriteReg(LCD_REG_224, 0x02); |
| EricLew | 0:ad9dfc0179dc | 193 | st7735_WriteReg(LCD_REG_224, 0x1c); |
| EricLew | 0:ad9dfc0179dc | 194 | st7735_WriteReg(LCD_REG_224, 0x07); |
| EricLew | 0:ad9dfc0179dc | 195 | st7735_WriteReg(LCD_REG_224, 0x12); |
| EricLew | 0:ad9dfc0179dc | 196 | st7735_WriteReg(LCD_REG_224, 0x37); |
| EricLew | 0:ad9dfc0179dc | 197 | st7735_WriteReg(LCD_REG_224, 0x32); |
| EricLew | 0:ad9dfc0179dc | 198 | st7735_WriteReg(LCD_REG_224, 0x29); |
| EricLew | 0:ad9dfc0179dc | 199 | st7735_WriteReg(LCD_REG_224, 0x2d); |
| EricLew | 0:ad9dfc0179dc | 200 | st7735_WriteReg(LCD_REG_224, 0x29); |
| EricLew | 0:ad9dfc0179dc | 201 | st7735_WriteReg(LCD_REG_224, 0x25); |
| EricLew | 0:ad9dfc0179dc | 202 | st7735_WriteReg(LCD_REG_224, 0x2B); |
| EricLew | 0:ad9dfc0179dc | 203 | st7735_WriteReg(LCD_REG_224, 0x39); |
| EricLew | 0:ad9dfc0179dc | 204 | st7735_WriteReg(LCD_REG_224, 0x00); |
| EricLew | 0:ad9dfc0179dc | 205 | st7735_WriteReg(LCD_REG_224, 0x01); |
| EricLew | 0:ad9dfc0179dc | 206 | st7735_WriteReg(LCD_REG_224, 0x03); |
| EricLew | 0:ad9dfc0179dc | 207 | st7735_WriteReg(LCD_REG_224, 0x10); |
| EricLew | 0:ad9dfc0179dc | 208 | /* Sparkles and rainbows, 16 args, no delay */ |
| EricLew | 0:ad9dfc0179dc | 209 | st7735_WriteReg(LCD_REG_225, 0x03); |
| EricLew | 0:ad9dfc0179dc | 210 | st7735_WriteReg(LCD_REG_225, 0x1d); |
| EricLew | 0:ad9dfc0179dc | 211 | st7735_WriteReg(LCD_REG_225, 0x07); |
| EricLew | 0:ad9dfc0179dc | 212 | st7735_WriteReg(LCD_REG_225, 0x06); |
| EricLew | 0:ad9dfc0179dc | 213 | st7735_WriteReg(LCD_REG_225, 0x2E); |
| EricLew | 0:ad9dfc0179dc | 214 | st7735_WriteReg(LCD_REG_225, 0x2C); |
| EricLew | 0:ad9dfc0179dc | 215 | st7735_WriteReg(LCD_REG_225, 0x29); |
| EricLew | 0:ad9dfc0179dc | 216 | st7735_WriteReg(LCD_REG_225, 0x2D); |
| EricLew | 0:ad9dfc0179dc | 217 | st7735_WriteReg(LCD_REG_225, 0x2E); |
| EricLew | 0:ad9dfc0179dc | 218 | st7735_WriteReg(LCD_REG_225, 0x2E); |
| EricLew | 0:ad9dfc0179dc | 219 | st7735_WriteReg(LCD_REG_225, 0x37); |
| EricLew | 0:ad9dfc0179dc | 220 | st7735_WriteReg(LCD_REG_225, 0x3F); |
| EricLew | 0:ad9dfc0179dc | 221 | st7735_WriteReg(LCD_REG_225, 0x00); |
| EricLew | 0:ad9dfc0179dc | 222 | st7735_WriteReg(LCD_REG_225, 0x00); |
| EricLew | 0:ad9dfc0179dc | 223 | st7735_WriteReg(LCD_REG_225, 0x02); |
| EricLew | 0:ad9dfc0179dc | 224 | st7735_WriteReg(LCD_REG_225, 0x10); |
| EricLew | 0:ad9dfc0179dc | 225 | /* Normal display on, no args, no delay */ |
| EricLew | 0:ad9dfc0179dc | 226 | st7735_WriteReg(LCD_REG_19, 0x00); |
| EricLew | 0:ad9dfc0179dc | 227 | /* Main screen turn on, no delay */ |
| EricLew | 0:ad9dfc0179dc | 228 | st7735_WriteReg(LCD_REG_41, 0x00); |
| EricLew | 0:ad9dfc0179dc | 229 | /* Memory access control: MY = 1, MX = 1, MV = 0, ML = 0 */ |
| EricLew | 0:ad9dfc0179dc | 230 | st7735_WriteReg(LCD_REG_54, 0xC0); |
| EricLew | 0:ad9dfc0179dc | 231 | } |
| EricLew | 0:ad9dfc0179dc | 232 | |
| EricLew | 0:ad9dfc0179dc | 233 | /** |
| EricLew | 0:ad9dfc0179dc | 234 | * @brief Enables the Display. |
| EricLew | 0:ad9dfc0179dc | 235 | * @param None |
| EricLew | 0:ad9dfc0179dc | 236 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 237 | */ |
| EricLew | 0:ad9dfc0179dc | 238 | void st7735_DisplayOn(void) |
| EricLew | 0:ad9dfc0179dc | 239 | { |
| EricLew | 0:ad9dfc0179dc | 240 | uint8_t data = 0; |
| EricLew | 0:ad9dfc0179dc | 241 | LCD_IO_WriteReg(LCD_REG_19); |
| EricLew | 0:ad9dfc0179dc | 242 | LCD_Delay(10); |
| EricLew | 0:ad9dfc0179dc | 243 | LCD_IO_WriteReg(LCD_REG_41); |
| EricLew | 0:ad9dfc0179dc | 244 | LCD_Delay(10); |
| EricLew | 0:ad9dfc0179dc | 245 | LCD_IO_WriteReg(LCD_REG_54); |
| EricLew | 0:ad9dfc0179dc | 246 | data = 0xC0; |
| EricLew | 0:ad9dfc0179dc | 247 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 248 | } |
| EricLew | 0:ad9dfc0179dc | 249 | |
| EricLew | 0:ad9dfc0179dc | 250 | /** |
| EricLew | 0:ad9dfc0179dc | 251 | * @brief Disables the Display. |
| EricLew | 0:ad9dfc0179dc | 252 | * @param None |
| EricLew | 0:ad9dfc0179dc | 253 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 254 | */ |
| EricLew | 0:ad9dfc0179dc | 255 | void st7735_DisplayOff(void) |
| EricLew | 0:ad9dfc0179dc | 256 | { |
| EricLew | 0:ad9dfc0179dc | 257 | uint8_t data = 0; |
| EricLew | 0:ad9dfc0179dc | 258 | LCD_IO_WriteReg(LCD_REG_19); |
| EricLew | 0:ad9dfc0179dc | 259 | LCD_Delay(10); |
| EricLew | 0:ad9dfc0179dc | 260 | LCD_IO_WriteReg(LCD_REG_40); |
| EricLew | 0:ad9dfc0179dc | 261 | LCD_Delay(10); |
| EricLew | 0:ad9dfc0179dc | 262 | LCD_IO_WriteReg(LCD_REG_54); |
| EricLew | 0:ad9dfc0179dc | 263 | data = 0xC0; |
| EricLew | 0:ad9dfc0179dc | 264 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 265 | } |
| EricLew | 0:ad9dfc0179dc | 266 | |
| EricLew | 0:ad9dfc0179dc | 267 | /** |
| EricLew | 0:ad9dfc0179dc | 268 | * @brief Sets Cursor position. |
| EricLew | 0:ad9dfc0179dc | 269 | * @param Xpos: specifies the X position. |
| EricLew | 0:ad9dfc0179dc | 270 | * @param Ypos: specifies the Y position. |
| EricLew | 0:ad9dfc0179dc | 271 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 272 | */ |
| EricLew | 0:ad9dfc0179dc | 273 | void st7735_SetCursor(uint16_t Xpos, uint16_t Ypos) |
| EricLew | 0:ad9dfc0179dc | 274 | { |
| EricLew | 0:ad9dfc0179dc | 275 | uint8_t data = 0; |
| EricLew | 0:ad9dfc0179dc | 276 | LCD_IO_WriteReg(LCD_REG_42); |
| EricLew | 0:ad9dfc0179dc | 277 | data = (Xpos) >> 8; |
| EricLew | 0:ad9dfc0179dc | 278 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 279 | data = (Xpos) & 0xFF; |
| EricLew | 0:ad9dfc0179dc | 280 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 281 | LCD_IO_WriteReg(LCD_REG_43); |
| EricLew | 0:ad9dfc0179dc | 282 | data = (Ypos) >> 8; |
| EricLew | 0:ad9dfc0179dc | 283 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 284 | data = (Ypos) & 0xFF; |
| EricLew | 0:ad9dfc0179dc | 285 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 286 | LCD_IO_WriteReg(LCD_REG_44); |
| EricLew | 0:ad9dfc0179dc | 287 | } |
| EricLew | 0:ad9dfc0179dc | 288 | |
| EricLew | 0:ad9dfc0179dc | 289 | /** |
| EricLew | 0:ad9dfc0179dc | 290 | * @brief Writes pixel. |
| EricLew | 0:ad9dfc0179dc | 291 | * @param Xpos: specifies the X position. |
| EricLew | 0:ad9dfc0179dc | 292 | * @param Ypos: specifies the Y position. |
| EricLew | 0:ad9dfc0179dc | 293 | * @param RGBCode: the RGB pixel color |
| EricLew | 0:ad9dfc0179dc | 294 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 295 | */ |
| EricLew | 0:ad9dfc0179dc | 296 | void st7735_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode) |
| EricLew | 0:ad9dfc0179dc | 297 | { |
| EricLew | 0:ad9dfc0179dc | 298 | uint8_t data = 0; |
| EricLew | 0:ad9dfc0179dc | 299 | if((Xpos >= ST7735_LCD_PIXEL_WIDTH) || (Ypos >= ST7735_LCD_PIXEL_HEIGHT)) |
| EricLew | 0:ad9dfc0179dc | 300 | { |
| EricLew | 0:ad9dfc0179dc | 301 | return; |
| EricLew | 0:ad9dfc0179dc | 302 | } |
| EricLew | 0:ad9dfc0179dc | 303 | |
| EricLew | 0:ad9dfc0179dc | 304 | /* Set Cursor */ |
| EricLew | 0:ad9dfc0179dc | 305 | st7735_SetCursor(Xpos, Ypos); |
| EricLew | 0:ad9dfc0179dc | 306 | |
| EricLew | 0:ad9dfc0179dc | 307 | data = RGBCode >> 8; |
| EricLew | 0:ad9dfc0179dc | 308 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 309 | data = RGBCode; |
| EricLew | 0:ad9dfc0179dc | 310 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 311 | } |
| EricLew | 0:ad9dfc0179dc | 312 | |
| EricLew | 0:ad9dfc0179dc | 313 | |
| EricLew | 0:ad9dfc0179dc | 314 | /** |
| EricLew | 0:ad9dfc0179dc | 315 | * @brief Writes to the selected LCD register. |
| EricLew | 0:ad9dfc0179dc | 316 | * @param LCDReg: Address of the selected register. |
| EricLew | 0:ad9dfc0179dc | 317 | * @param LCDRegValue: value to write to the selected register. |
| EricLew | 0:ad9dfc0179dc | 318 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 319 | */ |
| EricLew | 0:ad9dfc0179dc | 320 | void st7735_WriteReg(uint8_t LCDReg, uint8_t LCDRegValue) |
| EricLew | 0:ad9dfc0179dc | 321 | { |
| EricLew | 0:ad9dfc0179dc | 322 | LCD_IO_WriteReg(LCDReg); |
| EricLew | 0:ad9dfc0179dc | 323 | LCD_IO_WriteMultipleData(&LCDRegValue, 1); |
| EricLew | 0:ad9dfc0179dc | 324 | } |
| EricLew | 0:ad9dfc0179dc | 325 | |
| EricLew | 0:ad9dfc0179dc | 326 | /** |
| EricLew | 0:ad9dfc0179dc | 327 | * @brief Sets a display window |
| EricLew | 0:ad9dfc0179dc | 328 | * @param Xpos: specifies the X bottom left position. |
| EricLew | 0:ad9dfc0179dc | 329 | * @param Ypos: specifies the Y bottom left position. |
| EricLew | 0:ad9dfc0179dc | 330 | * @param Height: display window height. |
| EricLew | 0:ad9dfc0179dc | 331 | * @param Width: display window width. |
| EricLew | 0:ad9dfc0179dc | 332 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 333 | */ |
| EricLew | 0:ad9dfc0179dc | 334 | void st7735_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) |
| EricLew | 0:ad9dfc0179dc | 335 | { |
| EricLew | 0:ad9dfc0179dc | 336 | uint8_t data = 0; |
| EricLew | 0:ad9dfc0179dc | 337 | /* Column addr set, 4 args, no delay: XSTART = Xpos, XEND = (Xpos + Width - 1) */ |
| EricLew | 0:ad9dfc0179dc | 338 | LCD_IO_WriteReg(LCD_REG_42); |
| EricLew | 0:ad9dfc0179dc | 339 | data = (Xpos) >> 8; |
| EricLew | 0:ad9dfc0179dc | 340 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 341 | data = (Xpos) & 0xFF; |
| EricLew | 0:ad9dfc0179dc | 342 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 343 | data = (Xpos + Width - 1) >> 8; |
| EricLew | 0:ad9dfc0179dc | 344 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 345 | data = (Xpos + Width - 1) & 0xFF; |
| EricLew | 0:ad9dfc0179dc | 346 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 347 | /* Row addr set, 4 args, no delay: YSTART = Ypos, YEND = (Ypos + Height - 1) */ |
| EricLew | 0:ad9dfc0179dc | 348 | LCD_IO_WriteReg(LCD_REG_43); |
| EricLew | 0:ad9dfc0179dc | 349 | data = (Ypos) >> 8; |
| EricLew | 0:ad9dfc0179dc | 350 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 351 | data = (Ypos) & 0xFF; |
| EricLew | 0:ad9dfc0179dc | 352 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 353 | data = (Ypos + Height - 1) >> 8; |
| EricLew | 0:ad9dfc0179dc | 354 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 355 | data = (Ypos + Height - 1) & 0xFF; |
| EricLew | 0:ad9dfc0179dc | 356 | LCD_IO_WriteMultipleData(&data, 1); |
| EricLew | 0:ad9dfc0179dc | 357 | } |
| EricLew | 0:ad9dfc0179dc | 358 | |
| EricLew | 0:ad9dfc0179dc | 359 | /** |
| EricLew | 0:ad9dfc0179dc | 360 | * @brief Draws horizontal line. |
| EricLew | 0:ad9dfc0179dc | 361 | * @param RGBCode: Specifies the RGB color |
| EricLew | 0:ad9dfc0179dc | 362 | * @param Xpos: specifies the X position. |
| EricLew | 0:ad9dfc0179dc | 363 | * @param Ypos: specifies the Y position. |
| EricLew | 0:ad9dfc0179dc | 364 | * @param Length: specifies the line length. |
| EricLew | 0:ad9dfc0179dc | 365 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 366 | */ |
| EricLew | 0:ad9dfc0179dc | 367 | void st7735_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length) |
| EricLew | 0:ad9dfc0179dc | 368 | { |
| EricLew | 0:ad9dfc0179dc | 369 | uint8_t counter = 0; |
| EricLew | 0:ad9dfc0179dc | 370 | |
| EricLew | 0:ad9dfc0179dc | 371 | if(Xpos + Length > ST7735_LCD_PIXEL_WIDTH) return; |
| EricLew | 0:ad9dfc0179dc | 372 | |
| EricLew | 0:ad9dfc0179dc | 373 | /* Set Cursor */ |
| EricLew | 0:ad9dfc0179dc | 374 | st7735_SetCursor(Xpos, Ypos); |
| EricLew | 0:ad9dfc0179dc | 375 | |
| EricLew | 0:ad9dfc0179dc | 376 | for(counter = 0; counter < Length; counter++) |
| EricLew | 0:ad9dfc0179dc | 377 | { |
| EricLew | 0:ad9dfc0179dc | 378 | ArrayRGB[counter] = RGBCode; |
| EricLew | 0:ad9dfc0179dc | 379 | } |
| EricLew | 0:ad9dfc0179dc | 380 | LCD_IO_WriteMultipleData((uint8_t*)&ArrayRGB[0], Length * 2); |
| EricLew | 0:ad9dfc0179dc | 381 | } |
| EricLew | 0:ad9dfc0179dc | 382 | |
| EricLew | 0:ad9dfc0179dc | 383 | /** |
| EricLew | 0:ad9dfc0179dc | 384 | * @brief Draws vertical line. |
| EricLew | 0:ad9dfc0179dc | 385 | * @param RGBCode: Specifies the RGB color |
| EricLew | 0:ad9dfc0179dc | 386 | * @param Xpos: specifies the X position. |
| EricLew | 0:ad9dfc0179dc | 387 | * @param Ypos: specifies the Y position. |
| EricLew | 0:ad9dfc0179dc | 388 | * @param Length: specifies the line length. |
| EricLew | 0:ad9dfc0179dc | 389 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 390 | */ |
| EricLew | 0:ad9dfc0179dc | 391 | void st7735_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length) |
| EricLew | 0:ad9dfc0179dc | 392 | { |
| EricLew | 0:ad9dfc0179dc | 393 | uint8_t counter = 0; |
| EricLew | 0:ad9dfc0179dc | 394 | |
| EricLew | 0:ad9dfc0179dc | 395 | if(Ypos + Length > ST7735_LCD_PIXEL_HEIGHT) return; |
| EricLew | 0:ad9dfc0179dc | 396 | for(counter = 0; counter < Length; counter++) |
| EricLew | 0:ad9dfc0179dc | 397 | { |
| EricLew | 0:ad9dfc0179dc | 398 | st7735_WritePixel(Xpos, Ypos + counter, RGBCode); |
| EricLew | 0:ad9dfc0179dc | 399 | } |
| EricLew | 0:ad9dfc0179dc | 400 | } |
| EricLew | 0:ad9dfc0179dc | 401 | |
| EricLew | 0:ad9dfc0179dc | 402 | /** |
| EricLew | 0:ad9dfc0179dc | 403 | * @brief Gets the LCD pixel Width. |
| EricLew | 0:ad9dfc0179dc | 404 | * @param None |
| EricLew | 0:ad9dfc0179dc | 405 | * @retval The Lcd Pixel Width |
| EricLew | 0:ad9dfc0179dc | 406 | */ |
| EricLew | 0:ad9dfc0179dc | 407 | uint16_t st7735_GetLcdPixelWidth(void) |
| EricLew | 0:ad9dfc0179dc | 408 | { |
| EricLew | 0:ad9dfc0179dc | 409 | return ST7735_LCD_PIXEL_WIDTH; |
| EricLew | 0:ad9dfc0179dc | 410 | } |
| EricLew | 0:ad9dfc0179dc | 411 | |
| EricLew | 0:ad9dfc0179dc | 412 | /** |
| EricLew | 0:ad9dfc0179dc | 413 | * @brief Gets the LCD pixel Height. |
| EricLew | 0:ad9dfc0179dc | 414 | * @param None |
| EricLew | 0:ad9dfc0179dc | 415 | * @retval The Lcd Pixel Height |
| EricLew | 0:ad9dfc0179dc | 416 | */ |
| EricLew | 0:ad9dfc0179dc | 417 | uint16_t st7735_GetLcdPixelHeight(void) |
| EricLew | 0:ad9dfc0179dc | 418 | { |
| EricLew | 0:ad9dfc0179dc | 419 | return ST7735_LCD_PIXEL_HEIGHT; |
| EricLew | 0:ad9dfc0179dc | 420 | } |
| EricLew | 0:ad9dfc0179dc | 421 | |
| EricLew | 0:ad9dfc0179dc | 422 | /** |
| EricLew | 0:ad9dfc0179dc | 423 | * @brief Displays a bitmap picture loaded in the internal Flash. |
| EricLew | 0:ad9dfc0179dc | 424 | * @param BmpAddress: Bmp picture address in the internal Flash. |
| EricLew | 0:ad9dfc0179dc | 425 | * @retval None |
| EricLew | 0:ad9dfc0179dc | 426 | */ |
| EricLew | 0:ad9dfc0179dc | 427 | void st7735_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp) |
| EricLew | 0:ad9dfc0179dc | 428 | { |
| EricLew | 0:ad9dfc0179dc | 429 | uint32_t index = 0, size = 0; |
| EricLew | 0:ad9dfc0179dc | 430 | |
| EricLew | 0:ad9dfc0179dc | 431 | /* Read bitmap size */ |
| EricLew | 0:ad9dfc0179dc | 432 | size = *(volatile uint16_t *) (pbmp + 2); |
| EricLew | 0:ad9dfc0179dc | 433 | size |= (*(volatile uint16_t *) (pbmp + 4)) << 16; |
| EricLew | 0:ad9dfc0179dc | 434 | /* Get bitmap data address offset */ |
| EricLew | 0:ad9dfc0179dc | 435 | index = *(volatile uint16_t *) (pbmp + 10); |
| EricLew | 0:ad9dfc0179dc | 436 | index |= (*(volatile uint16_t *) (pbmp + 12)) << 16; |
| EricLew | 0:ad9dfc0179dc | 437 | size = (size - index)/2; |
| EricLew | 0:ad9dfc0179dc | 438 | pbmp += index; |
| EricLew | 0:ad9dfc0179dc | 439 | |
| EricLew | 0:ad9dfc0179dc | 440 | /* Set GRAM write direction and BGR = 0 */ |
| EricLew | 0:ad9dfc0179dc | 441 | /* Memory access control: MY = 0, MX = 1, MV = 0, ML = 0 */ |
| EricLew | 0:ad9dfc0179dc | 442 | st7735_WriteReg(LCD_REG_54, 0x40); |
| EricLew | 0:ad9dfc0179dc | 443 | |
| EricLew | 0:ad9dfc0179dc | 444 | /* Set Cursor */ |
| EricLew | 0:ad9dfc0179dc | 445 | st7735_SetCursor(Xpos, Ypos); |
| EricLew | 0:ad9dfc0179dc | 446 | |
| EricLew | 0:ad9dfc0179dc | 447 | LCD_IO_WriteMultipleData((uint8_t*)pbmp, size*2); |
| EricLew | 0:ad9dfc0179dc | 448 | |
| EricLew | 0:ad9dfc0179dc | 449 | /* Set GRAM write direction and BGR = 0 */ |
| EricLew | 0:ad9dfc0179dc | 450 | /* Memory access control: MY = 1, MX = 1, MV = 0, ML = 0 */ |
| EricLew | 0:ad9dfc0179dc | 451 | st7735_WriteReg(LCD_REG_54, 0xC0); |
| EricLew | 0:ad9dfc0179dc | 452 | } |
| EricLew | 0:ad9dfc0179dc | 453 | |
| EricLew | 0:ad9dfc0179dc | 454 | /** |
| EricLew | 0:ad9dfc0179dc | 455 | * @} |
| EricLew | 0:ad9dfc0179dc | 456 | */ |
| EricLew | 0:ad9dfc0179dc | 457 | |
| EricLew | 0:ad9dfc0179dc | 458 | /** |
| EricLew | 0:ad9dfc0179dc | 459 | * @} |
| EricLew | 0:ad9dfc0179dc | 460 | */ |
| EricLew | 0:ad9dfc0179dc | 461 | |
| EricLew | 0:ad9dfc0179dc | 462 | /** |
| EricLew | 0:ad9dfc0179dc | 463 | * @} |
| EricLew | 0:ad9dfc0179dc | 464 | */ |
| EricLew | 0:ad9dfc0179dc | 465 | |
| EricLew | 0:ad9dfc0179dc | 466 | /** |
| EricLew | 0:ad9dfc0179dc | 467 | * @} |
| EricLew | 0:ad9dfc0179dc | 468 | */ |
| EricLew | 0:ad9dfc0179dc | 469 | |
| EricLew | 0:ad9dfc0179dc | 470 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
| EricLew | 0:ad9dfc0179dc | 471 | |
| EricLew | 0:ad9dfc0179dc | 472 |