SMARTEST lib for MPS2
GLCD_SPI_MPS2.cpp@0:f1a413971403, 2018-08-23 (annotated)
- Committer:
- FelipeVR
- Date:
- Thu Aug 23 13:39:38 2018 +0000
- Revision:
- 0:f1a413971403
SMARTEST LCD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
FelipeVR | 0:f1a413971403 | 1 | /*----------------------------------------------------------------------------- |
FelipeVR | 0:f1a413971403 | 2 | * Name: GLCD_SPI_MPS2.c |
FelipeVR | 0:f1a413971403 | 3 | * Purpose: MPS2 low level Graphic LCD (320x240 pixels) with SPI interface |
FelipeVR | 0:f1a413971403 | 4 | *----------------------------------------------------------------------------- |
FelipeVR | 0:f1a413971403 | 5 | * This file is part of the uVision/ARM development tools. |
FelipeVR | 0:f1a413971403 | 6 | * This software may only be used under the terms of a valid, current, |
FelipeVR | 0:f1a413971403 | 7 | * end user licence from KEIL for a compatible version of KEIL software |
FelipeVR | 0:f1a413971403 | 8 | * development tools. Nothing else gives you the right to use this software. |
FelipeVR | 0:f1a413971403 | 9 | * |
FelipeVR | 0:f1a413971403 | 10 | * This software is supplied "AS IS" without warranties of any kind. |
FelipeVR | 0:f1a413971403 | 11 | * |
FelipeVR | 0:f1a413971403 | 12 | * Copyright (c) 2013 KEIL - An ARM Company. All rights reserved. |
FelipeVR | 0:f1a413971403 | 13 | *----------------------------------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 14 | |
FelipeVR | 0:f1a413971403 | 15 | |
FelipeVR | 0:f1a413971403 | 16 | #include "SMM_MPS2.h" |
FelipeVR | 0:f1a413971403 | 17 | #include "GLCD_SPI_MPS2.h" |
FelipeVR | 0:f1a413971403 | 18 | |
FelipeVR | 0:f1a413971403 | 19 | #include "Font_6x8_h.h" |
FelipeVR | 0:f1a413971403 | 20 | #include "Font_16x24_h.h" |
FelipeVR | 0:f1a413971403 | 21 | |
FelipeVR | 0:f1a413971403 | 22 | |
FelipeVR | 0:f1a413971403 | 23 | /************************** Orientation configuration ************************/ |
FelipeVR | 0:f1a413971403 | 24 | |
FelipeVR | 0:f1a413971403 | 25 | #ifndef LANDSCAPE |
FelipeVR | 0:f1a413971403 | 26 | #define LANDSCAPE 1 /* 1 for landscape, 0 for portrait */ |
FelipeVR | 0:f1a413971403 | 27 | #endif |
FelipeVR | 0:f1a413971403 | 28 | #ifndef ROTATE180 |
FelipeVR | 0:f1a413971403 | 29 | #define ROTATE180 1 /* 1 to rotate the screen for 180 deg */ |
FelipeVR | 0:f1a413971403 | 30 | #endif |
FelipeVR | 0:f1a413971403 | 31 | |
FelipeVR | 0:f1a413971403 | 32 | /*------------------------- Speed dependant settings -------------------------*/ |
FelipeVR | 0:f1a413971403 | 33 | |
FelipeVR | 0:f1a413971403 | 34 | /* If processor works on high frequency delay has to be increased, it can be |
FelipeVR | 0:f1a413971403 | 35 | increased by factor 2^N by this constant */ |
FelipeVR | 0:f1a413971403 | 36 | #define DELAY_2N 8 |
FelipeVR | 0:f1a413971403 | 37 | |
FelipeVR | 0:f1a413971403 | 38 | /*---------------------- Graphic LCD size definitions ------------------------*/ |
FelipeVR | 0:f1a413971403 | 39 | |
FelipeVR | 0:f1a413971403 | 40 | #if (LANDSCAPE == 1) |
FelipeVR | 0:f1a413971403 | 41 | #define WIDTH 320 /* Screen Width (in pixels) */ |
FelipeVR | 0:f1a413971403 | 42 | #define HEIGHT 240 /* Screen Hight (in pixels) */ |
FelipeVR | 0:f1a413971403 | 43 | #else |
FelipeVR | 0:f1a413971403 | 44 | #define WIDTH 240 /* Screen Width (in pixels) */ |
FelipeVR | 0:f1a413971403 | 45 | #define HEIGHT 320 /* Screen Hight (in pixels) */ |
FelipeVR | 0:f1a413971403 | 46 | #endif |
FelipeVR | 0:f1a413971403 | 47 | #define BPP 16 /* Bits per pixel */ |
FelipeVR | 0:f1a413971403 | 48 | #define BYPP ((BPP+7)/8) /* Bytes per pixel */ |
FelipeVR | 0:f1a413971403 | 49 | |
FelipeVR | 0:f1a413971403 | 50 | /*--------------- Graphic LCD interface hardware definitions -----------------*/ |
FelipeVR | 0:f1a413971403 | 51 | |
FelipeVR | 0:f1a413971403 | 52 | /* Pin CS setting to 0 or 1 */ |
FelipeVR | 0:f1a413971403 | 53 | #define LCD_CS(x) ((x) ? (MPS2_FPGAIO->MISC |= CLCD_CS_Msk) : (MPS2_FPGAIO->MISC &= ~CLCD_CS_Msk)) |
FelipeVR | 0:f1a413971403 | 54 | |
FelipeVR | 0:f1a413971403 | 55 | #define SPI_START (0x70) /* Start byte for SPI transfer */ |
FelipeVR | 0:f1a413971403 | 56 | #define SPI_RD (0x01) /* WR bit 1 within start */ |
FelipeVR | 0:f1a413971403 | 57 | #define SPI_WR (0x00) /* WR bit 0 within start */ |
FelipeVR | 0:f1a413971403 | 58 | #define SPI_DATA (0x02) /* RS bit 1 within start byte */ |
FelipeVR | 0:f1a413971403 | 59 | #define SPI_INDEX (0x00) /* RS bit 0 within start byte */ |
FelipeVR | 0:f1a413971403 | 60 | |
FelipeVR | 0:f1a413971403 | 61 | #define BG_COLOR 0 /* Background color */ |
FelipeVR | 0:f1a413971403 | 62 | #define TXT_COLOR 1 /* Text color */ |
FelipeVR | 0:f1a413971403 | 63 | |
FelipeVR | 0:f1a413971403 | 64 | |
FelipeVR | 0:f1a413971403 | 65 | /************************ Global variables ************************************/ |
FelipeVR | 0:f1a413971403 | 66 | |
FelipeVR | 0:f1a413971403 | 67 | /****************************************************************************** |
FelipeVR | 0:f1a413971403 | 68 | * Text and background color * |
FelipeVR | 0:f1a413971403 | 69 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 70 | static volatile unsigned short Color[2] = {White, Black}; |
FelipeVR | 0:f1a413971403 | 71 | |
FelipeVR | 0:f1a413971403 | 72 | /************************ Local auxiliary functions ***************************/ |
FelipeVR | 0:f1a413971403 | 73 | |
FelipeVR | 0:f1a413971403 | 74 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 75 | * Delay in while loop cycles * |
FelipeVR | 0:f1a413971403 | 76 | * Parameter: cnt: number of while cycles to delay * |
FelipeVR | 0:f1a413971403 | 77 | * Return: * |
FelipeVR | 0:f1a413971403 | 78 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 79 | |
FelipeVR | 0:f1a413971403 | 80 | static void delay (int cnt) { |
FelipeVR | 0:f1a413971403 | 81 | cnt <<= DELAY_2N; |
FelipeVR | 0:f1a413971403 | 82 | while (cnt--); |
FelipeVR | 0:f1a413971403 | 83 | } |
FelipeVR | 0:f1a413971403 | 84 | |
FelipeVR | 0:f1a413971403 | 85 | |
FelipeVR | 0:f1a413971403 | 86 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 87 | * Transfer 1 byte over the serial communication * |
FelipeVR | 0:f1a413971403 | 88 | * Parameter: byte: byte to be sent * |
FelipeVR | 0:f1a413971403 | 89 | * Return: byte read while sending * |
FelipeVR | 0:f1a413971403 | 90 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 91 | |
FelipeVR | 0:f1a413971403 | 92 | static __inline unsigned char spi_tran (unsigned char byte) { |
FelipeVR | 0:f1a413971403 | 93 | |
FelipeVR | 0:f1a413971403 | 94 | MPS2_SSP0->DR = byte; |
FelipeVR | 0:f1a413971403 | 95 | while (MPS2_SSP0->SR & SSP_SR_BSY_Msk); /* Wait for send to finish */ |
FelipeVR | 0:f1a413971403 | 96 | return (MPS2_SSP0->DR); |
FelipeVR | 0:f1a413971403 | 97 | } |
FelipeVR | 0:f1a413971403 | 98 | |
FelipeVR | 0:f1a413971403 | 99 | |
FelipeVR | 0:f1a413971403 | 100 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 101 | * Write a command the LCD controller * |
FelipeVR | 0:f1a413971403 | 102 | * Parameter: cmd: command to be written * |
FelipeVR | 0:f1a413971403 | 103 | * Return: * |
FelipeVR | 0:f1a413971403 | 104 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 105 | |
FelipeVR | 0:f1a413971403 | 106 | static __inline void wr_cmd (unsigned char cmd) { |
FelipeVR | 0:f1a413971403 | 107 | LCD_CS(0); |
FelipeVR | 0:f1a413971403 | 108 | spi_tran(SPI_START | SPI_WR | SPI_INDEX); /* Write : RS = 0, RW = 0 */ |
FelipeVR | 0:f1a413971403 | 109 | spi_tran(0); |
FelipeVR | 0:f1a413971403 | 110 | spi_tran(cmd); |
FelipeVR | 0:f1a413971403 | 111 | LCD_CS(1); |
FelipeVR | 0:f1a413971403 | 112 | } |
FelipeVR | 0:f1a413971403 | 113 | |
FelipeVR | 0:f1a413971403 | 114 | |
FelipeVR | 0:f1a413971403 | 115 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 116 | * Write data to the LCD controller * |
FelipeVR | 0:f1a413971403 | 117 | * Parameter: dat: data to be written * |
FelipeVR | 0:f1a413971403 | 118 | * Return: * |
FelipeVR | 0:f1a413971403 | 119 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 120 | |
FelipeVR | 0:f1a413971403 | 121 | static __inline void wr_dat (unsigned short dat) { |
FelipeVR | 0:f1a413971403 | 122 | LCD_CS(0); |
FelipeVR | 0:f1a413971403 | 123 | spi_tran(SPI_START | SPI_WR | SPI_DATA); /* Write : RS = 1, RW = 0 */ |
FelipeVR | 0:f1a413971403 | 124 | spi_tran((dat >> 8)); /* Write D8..D15 */ |
FelipeVR | 0:f1a413971403 | 125 | spi_tran((dat & 0xFF)); /* Write D0..D7 */ |
FelipeVR | 0:f1a413971403 | 126 | LCD_CS(1); |
FelipeVR | 0:f1a413971403 | 127 | } |
FelipeVR | 0:f1a413971403 | 128 | |
FelipeVR | 0:f1a413971403 | 129 | |
FelipeVR | 0:f1a413971403 | 130 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 131 | * Start of data writing to the LCD controller * |
FelipeVR | 0:f1a413971403 | 132 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 133 | * Return: * |
FelipeVR | 0:f1a413971403 | 134 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 135 | |
FelipeVR | 0:f1a413971403 | 136 | static __inline void wr_dat_start (void) { |
FelipeVR | 0:f1a413971403 | 137 | LCD_CS(0); |
FelipeVR | 0:f1a413971403 | 138 | spi_tran(SPI_START | SPI_WR | SPI_DATA); /* Write : RS = 1, RW = 0 */ |
FelipeVR | 0:f1a413971403 | 139 | } |
FelipeVR | 0:f1a413971403 | 140 | |
FelipeVR | 0:f1a413971403 | 141 | |
FelipeVR | 0:f1a413971403 | 142 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 143 | * Stop of data writing to the LCD controller * |
FelipeVR | 0:f1a413971403 | 144 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 145 | * Return: * |
FelipeVR | 0:f1a413971403 | 146 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 147 | |
FelipeVR | 0:f1a413971403 | 148 | static __inline void wr_dat_stop (void) { |
FelipeVR | 0:f1a413971403 | 149 | |
FelipeVR | 0:f1a413971403 | 150 | LCD_CS(1); |
FelipeVR | 0:f1a413971403 | 151 | } |
FelipeVR | 0:f1a413971403 | 152 | |
FelipeVR | 0:f1a413971403 | 153 | |
FelipeVR | 0:f1a413971403 | 154 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 155 | * Data writing to the LCD controller * |
FelipeVR | 0:f1a413971403 | 156 | * Parameter: dat: data to be written * |
FelipeVR | 0:f1a413971403 | 157 | * Return: * |
FelipeVR | 0:f1a413971403 | 158 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 159 | |
FelipeVR | 0:f1a413971403 | 160 | static __inline void wr_dat_only (unsigned short dat) { |
FelipeVR | 0:f1a413971403 | 161 | |
FelipeVR | 0:f1a413971403 | 162 | spi_tran((dat >> 8)); /* Write D8..D15 */ |
FelipeVR | 0:f1a413971403 | 163 | spi_tran((dat & 0xFF)); /* Write D0..D7 */ |
FelipeVR | 0:f1a413971403 | 164 | } |
FelipeVR | 0:f1a413971403 | 165 | |
FelipeVR | 0:f1a413971403 | 166 | |
FelipeVR | 0:f1a413971403 | 167 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 168 | * Write a value to the to LCD register * |
FelipeVR | 0:f1a413971403 | 169 | * Parameter: reg: register to be written * |
FelipeVR | 0:f1a413971403 | 170 | * val: value to write to the register * |
FelipeVR | 0:f1a413971403 | 171 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 172 | |
FelipeVR | 0:f1a413971403 | 173 | static __inline void wr_reg (unsigned char reg, unsigned short val) { |
FelipeVR | 0:f1a413971403 | 174 | |
FelipeVR | 0:f1a413971403 | 175 | wr_cmd(reg); |
FelipeVR | 0:f1a413971403 | 176 | wr_dat(val); |
FelipeVR | 0:f1a413971403 | 177 | } |
FelipeVR | 0:f1a413971403 | 178 | |
FelipeVR | 0:f1a413971403 | 179 | |
FelipeVR | 0:f1a413971403 | 180 | /************************ Exported functions **********************************/ |
FelipeVR | 0:f1a413971403 | 181 | |
FelipeVR | 0:f1a413971403 | 182 | |
FelipeVR | 0:f1a413971403 | 183 | |
FelipeVR | 0:f1a413971403 | 184 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 185 | * Initialize the Himax LCD with HX8347-D LCD Controller * |
FelipeVR | 0:f1a413971403 | 186 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 187 | * Return: * |
FelipeVR | 0:f1a413971403 | 188 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 189 | |
FelipeVR | 0:f1a413971403 | 190 | void GLCD_Initialize (void) { |
FelipeVR | 0:f1a413971403 | 191 | |
FelipeVR | 0:f1a413971403 | 192 | /* Configure SSP used for LCD */ |
FelipeVR | 0:f1a413971403 | 193 | MPS2_SSP0->CR1 = 0; /* Synchronous serial port disable */ |
FelipeVR | 0:f1a413971403 | 194 | MPS2_SSP0->DMACR = 0; /* Disable FIFO DMA */ |
FelipeVR | 0:f1a413971403 | 195 | MPS2_SSP0->IMSC = 0; /* Mask all FIFO/IRQ interrupts */ |
FelipeVR | 0:f1a413971403 | 196 | MPS2_SSP0->ICR = ((1ul << 0) | /* Clear SSPRORINTR interrupt */ |
FelipeVR | 0:f1a413971403 | 197 | (1ul << 1) ); /* Clear SSPRTINTR interrupt */ |
FelipeVR | 0:f1a413971403 | 198 | MPS2_SSP0->CR0 = ((7ul << 0) | /* 8 bit data size */ |
FelipeVR | 0:f1a413971403 | 199 | (0ul << 4) | /* Motorola frame format */ |
FelipeVR | 0:f1a413971403 | 200 | (0ul << 6) | /* CPOL = 0 */ |
FelipeVR | 0:f1a413971403 | 201 | (0ul << 7) | /* CPHA = 0 */ |
FelipeVR | 0:f1a413971403 | 202 | (1ul << 8) ); /* Set serial clock rate */ |
FelipeVR | 0:f1a413971403 | 203 | MPS2_SSP0->CPSR = (2ul << 0); /* set SSP clk to 6MHz (6.6MHz max) */ |
FelipeVR | 0:f1a413971403 | 204 | MPS2_SSP0->CR1 = ((1ul << 1) | /* Synchronous serial port enable */ |
FelipeVR | 0:f1a413971403 | 205 | (0ul << 2) ); /* Device configured as master */ |
FelipeVR | 0:f1a413971403 | 206 | |
FelipeVR | 0:f1a413971403 | 207 | /* CLCD screen setup (Default CLCD screen interface state) */ |
FelipeVR | 0:f1a413971403 | 208 | MPS2_FPGAIO->MISC |= (CLCD_CS_Msk | /* deassert nCS0 */ |
FelipeVR | 0:f1a413971403 | 209 | CLCD_RESET_Msk); /* deassert Reset */ |
FelipeVR | 0:f1a413971403 | 210 | MPS2_FPGAIO->MISC &= ~(CLCD_RS_Msk | /* deassert RS */ |
FelipeVR | 0:f1a413971403 | 211 | CLCD_RD_Msk | /* deassert RD */ |
FelipeVR | 0:f1a413971403 | 212 | CLCD_BL_Msk ); /* switch off backlight */ |
FelipeVR | 0:f1a413971403 | 213 | |
FelipeVR | 0:f1a413971403 | 214 | // Reset CLCD screen |
FelipeVR | 0:f1a413971403 | 215 | MPS2_FPGAIO->MISC &= ~CLCD_RESET_Msk; /* assert Reset */ |
FelipeVR | 0:f1a413971403 | 216 | delay(1); |
FelipeVR | 0:f1a413971403 | 217 | MPS2_FPGAIO->MISC |= CLCD_RESET_Msk; /* deassert Reset */ |
FelipeVR | 0:f1a413971403 | 218 | delay(10); |
FelipeVR | 0:f1a413971403 | 219 | |
FelipeVR | 0:f1a413971403 | 220 | // if (driverCode == 0x47) { /* LCD with HX8347-D LCD Controller */ |
FelipeVR | 0:f1a413971403 | 221 | // Himax = 1; /* Set Himax LCD controller flag */ |
FelipeVR | 0:f1a413971403 | 222 | /* Driving ability settings ----------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 223 | wr_reg(0xEA, 0x00); /* Power control internal used (1) */ |
FelipeVR | 0:f1a413971403 | 224 | wr_reg(0xEB, 0x20); /* Power control internal used (2) */ |
FelipeVR | 0:f1a413971403 | 225 | wr_reg(0xEC, 0x0C); /* Source control internal used (1) */ |
FelipeVR | 0:f1a413971403 | 226 | wr_reg(0xED, 0xC7); /* Source control internal used (2) */ |
FelipeVR | 0:f1a413971403 | 227 | wr_reg(0xE8, 0x38); /* Source output period Normal mode */ |
FelipeVR | 0:f1a413971403 | 228 | wr_reg(0xE9, 0x10); /* Source output period Idle mode */ |
FelipeVR | 0:f1a413971403 | 229 | wr_reg(0xF1, 0x01); /* RGB 18-bit interface ;0x0110 */ |
FelipeVR | 0:f1a413971403 | 230 | wr_reg(0xF2, 0x10); |
FelipeVR | 0:f1a413971403 | 231 | |
FelipeVR | 0:f1a413971403 | 232 | /* Adjust the Gamma Curve ------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 233 | wr_reg(0x40, 0x01); |
FelipeVR | 0:f1a413971403 | 234 | wr_reg(0x41, 0x00); |
FelipeVR | 0:f1a413971403 | 235 | wr_reg(0x42, 0x00); |
FelipeVR | 0:f1a413971403 | 236 | wr_reg(0x43, 0x10); |
FelipeVR | 0:f1a413971403 | 237 | wr_reg(0x44, 0x0E); |
FelipeVR | 0:f1a413971403 | 238 | wr_reg(0x45, 0x24); |
FelipeVR | 0:f1a413971403 | 239 | wr_reg(0x46, 0x04); |
FelipeVR | 0:f1a413971403 | 240 | wr_reg(0x47, 0x50); |
FelipeVR | 0:f1a413971403 | 241 | wr_reg(0x48, 0x02); |
FelipeVR | 0:f1a413971403 | 242 | wr_reg(0x49, 0x13); |
FelipeVR | 0:f1a413971403 | 243 | wr_reg(0x4A, 0x19); |
FelipeVR | 0:f1a413971403 | 244 | wr_reg(0x4B, 0x19); |
FelipeVR | 0:f1a413971403 | 245 | wr_reg(0x4C, 0x16); |
FelipeVR | 0:f1a413971403 | 246 | |
FelipeVR | 0:f1a413971403 | 247 | wr_reg(0x50, 0x1B); |
FelipeVR | 0:f1a413971403 | 248 | wr_reg(0x51, 0x31); |
FelipeVR | 0:f1a413971403 | 249 | wr_reg(0x52, 0x2F); |
FelipeVR | 0:f1a413971403 | 250 | wr_reg(0x53, 0x3F); |
FelipeVR | 0:f1a413971403 | 251 | wr_reg(0x54, 0x3F); |
FelipeVR | 0:f1a413971403 | 252 | wr_reg(0x55, 0x3E); |
FelipeVR | 0:f1a413971403 | 253 | wr_reg(0x56, 0x2F); |
FelipeVR | 0:f1a413971403 | 254 | wr_reg(0x57, 0x7B); |
FelipeVR | 0:f1a413971403 | 255 | wr_reg(0x58, 0x09); |
FelipeVR | 0:f1a413971403 | 256 | wr_reg(0x59, 0x06); |
FelipeVR | 0:f1a413971403 | 257 | wr_reg(0x5A, 0x06); |
FelipeVR | 0:f1a413971403 | 258 | wr_reg(0x5B, 0x0C); |
FelipeVR | 0:f1a413971403 | 259 | wr_reg(0x5C, 0x1D); |
FelipeVR | 0:f1a413971403 | 260 | wr_reg(0x5D, 0xCC); |
FelipeVR | 0:f1a413971403 | 261 | |
FelipeVR | 0:f1a413971403 | 262 | /* Power voltage setting -------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 263 | wr_reg(0x1B, 0x1B); |
FelipeVR | 0:f1a413971403 | 264 | wr_reg(0x1A, 0x01); |
FelipeVR | 0:f1a413971403 | 265 | wr_reg(0x24, 0x2F); |
FelipeVR | 0:f1a413971403 | 266 | wr_reg(0x25, 0x57); |
FelipeVR | 0:f1a413971403 | 267 | wr_reg(0x23, 0x88); |
FelipeVR | 0:f1a413971403 | 268 | |
FelipeVR | 0:f1a413971403 | 269 | /* Power on setting ------------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 270 | wr_reg(0x18, 0x36); /* Internal oscillator frequency adj */ |
FelipeVR | 0:f1a413971403 | 271 | wr_reg(0x19, 0x01); /* Enable internal oscillator */ |
FelipeVR | 0:f1a413971403 | 272 | wr_reg(0x01, 0x00); /* Normal mode, no scrool */ |
FelipeVR | 0:f1a413971403 | 273 | wr_reg(0x1F, 0x88); /* Power control 6 - DDVDH Off */ |
FelipeVR | 0:f1a413971403 | 274 | delay(20); |
FelipeVR | 0:f1a413971403 | 275 | wr_reg(0x1F, 0x82); /* Power control 6 - Step-up: 3 x VCI */ |
FelipeVR | 0:f1a413971403 | 276 | delay(5); |
FelipeVR | 0:f1a413971403 | 277 | wr_reg(0x1F, 0x92); /* Power control 6 - Step-up: On */ |
FelipeVR | 0:f1a413971403 | 278 | delay(5); |
FelipeVR | 0:f1a413971403 | 279 | wr_reg(0x1F, 0xD2); /* Power control 6 - VCOML active */ |
FelipeVR | 0:f1a413971403 | 280 | delay(5); |
FelipeVR | 0:f1a413971403 | 281 | |
FelipeVR | 0:f1a413971403 | 282 | /* Color selection -------------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 283 | wr_reg(0x17, 0x55); /* RGB, System interface: 16 Bit/Pixel*/ |
FelipeVR | 0:f1a413971403 | 284 | wr_reg(0x00, 0x00); /* Scrolling off, no standby */ |
FelipeVR | 0:f1a413971403 | 285 | |
FelipeVR | 0:f1a413971403 | 286 | /* Interface config ------------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 287 | wr_reg(0x2F, 0x11); /* LCD Drive: 1-line inversion */ |
FelipeVR | 0:f1a413971403 | 288 | wr_reg(0x31, 0x00); |
FelipeVR | 0:f1a413971403 | 289 | wr_reg(0x32, 0x00); /* DPL=0, HSPL=0, VSPL=0, EPL=0 */ |
FelipeVR | 0:f1a413971403 | 290 | |
FelipeVR | 0:f1a413971403 | 291 | /* Display on setting ----------------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 292 | wr_reg(0x28, 0x38); /* PT(0,0) active, VGL/VGL */ |
FelipeVR | 0:f1a413971403 | 293 | delay(20); |
FelipeVR | 0:f1a413971403 | 294 | wr_reg(0x28, 0x3C); /* Display active, VGL/VGL */ |
FelipeVR | 0:f1a413971403 | 295 | |
FelipeVR | 0:f1a413971403 | 296 | #if (LANDSCAPE == 1) |
FelipeVR | 0:f1a413971403 | 297 | #if (ROTATE180 == 0) |
FelipeVR | 0:f1a413971403 | 298 | wr_reg (0x16, 0xA8); |
FelipeVR | 0:f1a413971403 | 299 | #else |
FelipeVR | 0:f1a413971403 | 300 | wr_reg (0x16, 0x68); |
FelipeVR | 0:f1a413971403 | 301 | #endif |
FelipeVR | 0:f1a413971403 | 302 | #else |
FelipeVR | 0:f1a413971403 | 303 | #if (ROTATE180 == 0) |
FelipeVR | 0:f1a413971403 | 304 | wr_reg (0x16, 0x08); |
FelipeVR | 0:f1a413971403 | 305 | #else |
FelipeVR | 0:f1a413971403 | 306 | wr_reg (0x16, 0xC8); |
FelipeVR | 0:f1a413971403 | 307 | #endif |
FelipeVR | 0:f1a413971403 | 308 | #endif |
FelipeVR | 0:f1a413971403 | 309 | |
FelipeVR | 0:f1a413971403 | 310 | /* Display scrolling settings --------------------------------------------*/ |
FelipeVR | 0:f1a413971403 | 311 | wr_reg(0x0E, 0x00); /* TFA MSB */ |
FelipeVR | 0:f1a413971403 | 312 | wr_reg(0x0F, 0x00); /* TFA LSB */ |
FelipeVR | 0:f1a413971403 | 313 | wr_reg(0x10, 320 >> 8); /* VSA MSB */ |
FelipeVR | 0:f1a413971403 | 314 | wr_reg(0x11, 320 & 0xFF); /* VSA LSB */ |
FelipeVR | 0:f1a413971403 | 315 | wr_reg(0x12, 0x00); /* BFA MSB */ |
FelipeVR | 0:f1a413971403 | 316 | wr_reg(0x13, 0x00); /* BFA LSB */ |
FelipeVR | 0:f1a413971403 | 317 | // } |
FelipeVR | 0:f1a413971403 | 318 | |
FelipeVR | 0:f1a413971403 | 319 | MPS2_FPGAIO->MISC |= (CLCD_BL_Msk); /* turn on backlight */ |
FelipeVR | 0:f1a413971403 | 320 | } |
FelipeVR | 0:f1a413971403 | 321 | |
FelipeVR | 0:f1a413971403 | 322 | |
FelipeVR | 0:f1a413971403 | 323 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 324 | * Set draw window region * |
FelipeVR | 0:f1a413971403 | 325 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 326 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 327 | * w: window width in pixel * |
FelipeVR | 0:f1a413971403 | 328 | * h: window height in pixels * |
FelipeVR | 0:f1a413971403 | 329 | * Return: * |
FelipeVR | 0:f1a413971403 | 330 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 331 | |
FelipeVR | 0:f1a413971403 | 332 | void GLCD_SetWindow (unsigned int x, unsigned int y, unsigned int w, unsigned int h) { |
FelipeVR | 0:f1a413971403 | 333 | unsigned int xe, ye; |
FelipeVR | 0:f1a413971403 | 334 | |
FelipeVR | 0:f1a413971403 | 335 | xe = x+w-1; |
FelipeVR | 0:f1a413971403 | 336 | ye = y+h-1; |
FelipeVR | 0:f1a413971403 | 337 | |
FelipeVR | 0:f1a413971403 | 338 | wr_reg(0x02, x >> 8); /* Column address start MSB */ |
FelipeVR | 0:f1a413971403 | 339 | wr_reg(0x03, x & 0xFF); /* Column address start LSB */ |
FelipeVR | 0:f1a413971403 | 340 | wr_reg(0x04, xe >> 8); /* Column address end MSB */ |
FelipeVR | 0:f1a413971403 | 341 | wr_reg(0x05, xe & 0xFF); /* Column address end LSB */ |
FelipeVR | 0:f1a413971403 | 342 | |
FelipeVR | 0:f1a413971403 | 343 | wr_reg(0x06, y >> 8); /* Row address start MSB */ |
FelipeVR | 0:f1a413971403 | 344 | wr_reg(0x07, y & 0xFF); /* Row address start LSB */ |
FelipeVR | 0:f1a413971403 | 345 | wr_reg(0x08, ye >> 8); /* Row address end MSB */ |
FelipeVR | 0:f1a413971403 | 346 | wr_reg(0x09, ye & 0xFF); /* Row address end LSB */ |
FelipeVR | 0:f1a413971403 | 347 | } |
FelipeVR | 0:f1a413971403 | 348 | |
FelipeVR | 0:f1a413971403 | 349 | |
FelipeVR | 0:f1a413971403 | 350 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 351 | * Set draw window region * |
FelipeVR | 0:f1a413971403 | 352 | * Parameter: xs: start horizontal position * |
FelipeVR | 0:f1a413971403 | 353 | * xe: end horizontal position * |
FelipeVR | 0:f1a413971403 | 354 | * ys: start vertical position * |
FelipeVR | 0:f1a413971403 | 355 | * ye: end vertical position * |
FelipeVR | 0:f1a413971403 | 356 | * Return: * |
FelipeVR | 0:f1a413971403 | 357 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 358 | |
FelipeVR | 0:f1a413971403 | 359 | void GLCD_SetWindowSize (unsigned int xs, unsigned int xe, unsigned int ys, unsigned int ye) { |
FelipeVR | 0:f1a413971403 | 360 | |
FelipeVR | 0:f1a413971403 | 361 | wr_reg(0x02, xs >> 8); /* Column address start MSB */ |
FelipeVR | 0:f1a413971403 | 362 | wr_reg(0x03, xs & 0xFF); /* Column address start LSB */ |
FelipeVR | 0:f1a413971403 | 363 | wr_reg(0x04, xe >> 8); /* Column address end MSB */ |
FelipeVR | 0:f1a413971403 | 364 | wr_reg(0x05, xe & 0xFF); /* Column address end LSB */ |
FelipeVR | 0:f1a413971403 | 365 | |
FelipeVR | 0:f1a413971403 | 366 | wr_reg(0x06, ys >> 8); /* Row address start MSB */ |
FelipeVR | 0:f1a413971403 | 367 | wr_reg(0x07, ys & 0xFF); /* Row address start LSB */ |
FelipeVR | 0:f1a413971403 | 368 | wr_reg(0x08, ye >> 8); /* Row address end MSB */ |
FelipeVR | 0:f1a413971403 | 369 | wr_reg(0x09, ye & 0xFF); /* Row address end LSB */ |
FelipeVR | 0:f1a413971403 | 370 | } |
FelipeVR | 0:f1a413971403 | 371 | |
FelipeVR | 0:f1a413971403 | 372 | |
FelipeVR | 0:f1a413971403 | 373 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 374 | * Set draw window region to whole screen * |
FelipeVR | 0:f1a413971403 | 375 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 376 | * Return: * |
FelipeVR | 0:f1a413971403 | 377 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 378 | |
FelipeVR | 0:f1a413971403 | 379 | void GLCD_WindowMax (void) { |
FelipeVR | 0:f1a413971403 | 380 | GLCD_SetWindow (0, 0, WIDTH, HEIGHT); |
FelipeVR | 0:f1a413971403 | 381 | } |
FelipeVR | 0:f1a413971403 | 382 | |
FelipeVR | 0:f1a413971403 | 383 | |
FelipeVR | 0:f1a413971403 | 384 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 385 | * Draw a pixel in foreground color * |
FelipeVR | 0:f1a413971403 | 386 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 387 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 388 | * Return: * |
FelipeVR | 0:f1a413971403 | 389 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 390 | |
FelipeVR | 0:f1a413971403 | 391 | void GLCD_PutPixel (unsigned int x, unsigned int y) { |
FelipeVR | 0:f1a413971403 | 392 | |
FelipeVR | 0:f1a413971403 | 393 | wr_reg(0x02, x >> 8); /* Column address start MSB */ |
FelipeVR | 0:f1a413971403 | 394 | wr_reg(0x03, x & 0xFF); /* Column address start LSB */ |
FelipeVR | 0:f1a413971403 | 395 | wr_reg(0x04, x >> 8); /* Column address end MSB */ |
FelipeVR | 0:f1a413971403 | 396 | wr_reg(0x05, x & 0xFF); /* Column address end LSB */ |
FelipeVR | 0:f1a413971403 | 397 | |
FelipeVR | 0:f1a413971403 | 398 | wr_reg(0x06, y >> 8); /* Row address start MSB */ |
FelipeVR | 0:f1a413971403 | 399 | wr_reg(0x07, y & 0xFF); /* Row address start LSB */ |
FelipeVR | 0:f1a413971403 | 400 | wr_reg(0x08, y >> 8); /* Row address end MSB */ |
FelipeVR | 0:f1a413971403 | 401 | wr_reg(0x09, y & 0xFF); /* Row address end LSB */ |
FelipeVR | 0:f1a413971403 | 402 | |
FelipeVR | 0:f1a413971403 | 403 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 404 | wr_dat(Color[TXT_COLOR]); |
FelipeVR | 0:f1a413971403 | 405 | } |
FelipeVR | 0:f1a413971403 | 406 | |
FelipeVR | 0:f1a413971403 | 407 | |
FelipeVR | 0:f1a413971403 | 408 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 409 | * Draw a pixel in supplied color * |
FelipeVR | 0:f1a413971403 | 410 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 411 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 412 | * color: color of pixel * |
FelipeVR | 0:f1a413971403 | 413 | * Return: * |
FelipeVR | 0:f1a413971403 | 414 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 415 | |
FelipeVR | 0:f1a413971403 | 416 | void GLCD_PutPixelColor (unsigned int x, unsigned int y, unsigned short color) { |
FelipeVR | 0:f1a413971403 | 417 | |
FelipeVR | 0:f1a413971403 | 418 | wr_reg(0x02, x >> 8); /* Column address start MSB */ |
FelipeVR | 0:f1a413971403 | 419 | wr_reg(0x03, x & 0xFF); /* Column address start LSB */ |
FelipeVR | 0:f1a413971403 | 420 | wr_reg(0x04, x >> 8); /* Column address end MSB */ |
FelipeVR | 0:f1a413971403 | 421 | wr_reg(0x05, x & 0xFF); /* Column address end LSB */ |
FelipeVR | 0:f1a413971403 | 422 | |
FelipeVR | 0:f1a413971403 | 423 | wr_reg(0x06, y >> 8); /* Row address start MSB */ |
FelipeVR | 0:f1a413971403 | 424 | wr_reg(0x07, y & 0xFF); /* Row address start LSB */ |
FelipeVR | 0:f1a413971403 | 425 | wr_reg(0x08, y >> 8); /* Row address end MSB */ |
FelipeVR | 0:f1a413971403 | 426 | wr_reg(0x09, y & 0xFF); /* Row address end LSB */ |
FelipeVR | 0:f1a413971403 | 427 | |
FelipeVR | 0:f1a413971403 | 428 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 429 | wr_dat(color); |
FelipeVR | 0:f1a413971403 | 430 | } |
FelipeVR | 0:f1a413971403 | 431 | |
FelipeVR | 0:f1a413971403 | 432 | |
FelipeVR | 0:f1a413971403 | 433 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 434 | * Set foreground color * |
FelipeVR | 0:f1a413971403 | 435 | * Parameter: color: foreground color * |
FelipeVR | 0:f1a413971403 | 436 | * Return: * |
FelipeVR | 0:f1a413971403 | 437 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 438 | |
FelipeVR | 0:f1a413971403 | 439 | void GLCD_SetTextColor (unsigned short color) { |
FelipeVR | 0:f1a413971403 | 440 | Color[TXT_COLOR] = color; |
FelipeVR | 0:f1a413971403 | 441 | } |
FelipeVR | 0:f1a413971403 | 442 | |
FelipeVR | 0:f1a413971403 | 443 | |
FelipeVR | 0:f1a413971403 | 444 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 445 | * Set background color * |
FelipeVR | 0:f1a413971403 | 446 | * Parameter: color: background color * |
FelipeVR | 0:f1a413971403 | 447 | * Return: * |
FelipeVR | 0:f1a413971403 | 448 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 449 | |
FelipeVR | 0:f1a413971403 | 450 | void GLCD_SetBackColor (unsigned short color) { |
FelipeVR | 0:f1a413971403 | 451 | Color[BG_COLOR] = color; |
FelipeVR | 0:f1a413971403 | 452 | } |
FelipeVR | 0:f1a413971403 | 453 | |
FelipeVR | 0:f1a413971403 | 454 | |
FelipeVR | 0:f1a413971403 | 455 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 456 | * Clear display * |
FelipeVR | 0:f1a413971403 | 457 | * Parameter: color: display clearing color * |
FelipeVR | 0:f1a413971403 | 458 | * Return: * |
FelipeVR | 0:f1a413971403 | 459 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 460 | |
FelipeVR | 0:f1a413971403 | 461 | void GLCD_Clear (unsigned short color) { |
FelipeVR | 0:f1a413971403 | 462 | unsigned int i; |
FelipeVR | 0:f1a413971403 | 463 | |
FelipeVR | 0:f1a413971403 | 464 | GLCD_WindowMax(); |
FelipeVR | 0:f1a413971403 | 465 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 466 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 467 | |
FelipeVR | 0:f1a413971403 | 468 | for(i = 0; i < (WIDTH*HEIGHT); i++) |
FelipeVR | 0:f1a413971403 | 469 | wr_dat_only(color); |
FelipeVR | 0:f1a413971403 | 470 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 471 | } |
FelipeVR | 0:f1a413971403 | 472 | |
FelipeVR | 0:f1a413971403 | 473 | |
FelipeVR | 0:f1a413971403 | 474 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 475 | * Draw character on given position * |
FelipeVR | 0:f1a413971403 | 476 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 477 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 478 | * cw: character width in pixel * |
FelipeVR | 0:f1a413971403 | 479 | * ch: character height in pixels * |
FelipeVR | 0:f1a413971403 | 480 | * c: pointer to character bitmap * |
FelipeVR | 0:f1a413971403 | 481 | * Return: * |
FelipeVR | 0:f1a413971403 | 482 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 483 | |
FelipeVR | 0:f1a413971403 | 484 | void GLCD_DrawChar (unsigned int x, unsigned int y, unsigned int cw, unsigned int ch, unsigned char *c) { |
FelipeVR | 0:f1a413971403 | 485 | unsigned int i, j, k, pixs; |
FelipeVR | 0:f1a413971403 | 486 | |
FelipeVR | 0:f1a413971403 | 487 | GLCD_SetWindow(x, y, cw, ch); |
FelipeVR | 0:f1a413971403 | 488 | |
FelipeVR | 0:f1a413971403 | 489 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 490 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 491 | |
FelipeVR | 0:f1a413971403 | 492 | k = (cw + 7)/8; |
FelipeVR | 0:f1a413971403 | 493 | |
FelipeVR | 0:f1a413971403 | 494 | if (k == 1) { |
FelipeVR | 0:f1a413971403 | 495 | for (j = 0; j < ch; j++) { |
FelipeVR | 0:f1a413971403 | 496 | pixs = *(unsigned char *)c; |
FelipeVR | 0:f1a413971403 | 497 | c += 1; |
FelipeVR | 0:f1a413971403 | 498 | |
FelipeVR | 0:f1a413971403 | 499 | for (i = 0; i < cw; i++) { |
FelipeVR | 0:f1a413971403 | 500 | wr_dat_only (Color[(pixs >> i) & 1]); |
FelipeVR | 0:f1a413971403 | 501 | } |
FelipeVR | 0:f1a413971403 | 502 | } |
FelipeVR | 0:f1a413971403 | 503 | } |
FelipeVR | 0:f1a413971403 | 504 | else if (k == 2) { |
FelipeVR | 0:f1a413971403 | 505 | for (j = 0; j < ch; j++) { |
FelipeVR | 0:f1a413971403 | 506 | pixs = *(unsigned short *)c; |
FelipeVR | 0:f1a413971403 | 507 | c += 2; |
FelipeVR | 0:f1a413971403 | 508 | |
FelipeVR | 0:f1a413971403 | 509 | for (i = 0; i < cw; i++) { |
FelipeVR | 0:f1a413971403 | 510 | wr_dat_only (Color[(pixs >> i) & 1]); |
FelipeVR | 0:f1a413971403 | 511 | } |
FelipeVR | 0:f1a413971403 | 512 | } |
FelipeVR | 0:f1a413971403 | 513 | } |
FelipeVR | 0:f1a413971403 | 514 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 515 | } |
FelipeVR | 0:f1a413971403 | 516 | |
FelipeVR | 0:f1a413971403 | 517 | |
FelipeVR | 0:f1a413971403 | 518 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 519 | * Disply character on given line * |
FelipeVR | 0:f1a413971403 | 520 | * Parameter: ln: line number * |
FelipeVR | 0:f1a413971403 | 521 | * col: column number * |
FelipeVR | 0:f1a413971403 | 522 | * fi: font index (0 = 6x8, 1 = 16x24) * |
FelipeVR | 0:f1a413971403 | 523 | * c: ascii character * |
FelipeVR | 0:f1a413971403 | 524 | * Return: * |
FelipeVR | 0:f1a413971403 | 525 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 526 | |
FelipeVR | 0:f1a413971403 | 527 | void GLCD_DisplayChar (unsigned int ln, unsigned int col, unsigned char fi, unsigned char c) { |
FelipeVR | 0:f1a413971403 | 528 | c -= 32; |
FelipeVR | 0:f1a413971403 | 529 | switch (fi) { |
FelipeVR | 0:f1a413971403 | 530 | case 0: /* Font 6 x 8 */ |
FelipeVR | 0:f1a413971403 | 531 | GLCD_DrawChar(col * 6, ln * 8, 6, 8, (unsigned char *)&Font_6x8_h [c * 8]); |
FelipeVR | 0:f1a413971403 | 532 | break; |
FelipeVR | 0:f1a413971403 | 533 | case 1: /* Font 16 x 24 */ |
FelipeVR | 0:f1a413971403 | 534 | GLCD_DrawChar(col * 16, ln * 24, 16, 24, (unsigned char *)&Font_16x24_h[c * 24]); |
FelipeVR | 0:f1a413971403 | 535 | break; |
FelipeVR | 0:f1a413971403 | 536 | } |
FelipeVR | 0:f1a413971403 | 537 | } |
FelipeVR | 0:f1a413971403 | 538 | |
FelipeVR | 0:f1a413971403 | 539 | |
FelipeVR | 0:f1a413971403 | 540 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 541 | * Disply string on given line * |
FelipeVR | 0:f1a413971403 | 542 | * Parameter: ln: line number * |
FelipeVR | 0:f1a413971403 | 543 | * col: column number * |
FelipeVR | 0:f1a413971403 | 544 | * fi: font index (0 = 6x8, 1 = 16x24) * |
FelipeVR | 0:f1a413971403 | 545 | * s: pointer to string * |
FelipeVR | 0:f1a413971403 | 546 | * Return: * |
FelipeVR | 0:f1a413971403 | 547 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 548 | |
FelipeVR | 0:f1a413971403 | 549 | void GLCD_DisplayString (unsigned int ln, unsigned int col, unsigned char fi, char *s) { |
FelipeVR | 0:f1a413971403 | 550 | while (*s) { |
FelipeVR | 0:f1a413971403 | 551 | GLCD_DisplayChar(ln, col++, fi, *s++); |
FelipeVR | 0:f1a413971403 | 552 | } |
FelipeVR | 0:f1a413971403 | 553 | } |
FelipeVR | 0:f1a413971403 | 554 | |
FelipeVR | 0:f1a413971403 | 555 | |
FelipeVR | 0:f1a413971403 | 556 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 557 | * Clear given line * |
FelipeVR | 0:f1a413971403 | 558 | * Parameter: ln: line number * |
FelipeVR | 0:f1a413971403 | 559 | * fi: font index (0 = 6x8, 1 = 16x24) * |
FelipeVR | 0:f1a413971403 | 560 | * Return: * |
FelipeVR | 0:f1a413971403 | 561 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 562 | |
FelipeVR | 0:f1a413971403 | 563 | void GLCD_ClearLn (unsigned int ln, unsigned char fi) { |
FelipeVR | 0:f1a413971403 | 564 | unsigned char i; |
FelipeVR | 0:f1a413971403 | 565 | char buf[60]; |
FelipeVR | 0:f1a413971403 | 566 | |
FelipeVR | 0:f1a413971403 | 567 | GLCD_WindowMax(); |
FelipeVR | 0:f1a413971403 | 568 | switch (fi) { |
FelipeVR | 0:f1a413971403 | 569 | case 0: /* Font 6 x 8 */ |
FelipeVR | 0:f1a413971403 | 570 | for (i = 0; i < (WIDTH+5)/6; i++) |
FelipeVR | 0:f1a413971403 | 571 | buf[i] = ' '; |
FelipeVR | 0:f1a413971403 | 572 | buf[i+1] = 0; |
FelipeVR | 0:f1a413971403 | 573 | break; |
FelipeVR | 0:f1a413971403 | 574 | case 1: /* Font 16 x 24 */ |
FelipeVR | 0:f1a413971403 | 575 | for (i = 0; i < (WIDTH+15)/16; i++) |
FelipeVR | 0:f1a413971403 | 576 | buf[i] = ' '; |
FelipeVR | 0:f1a413971403 | 577 | buf[i+1] = 0; |
FelipeVR | 0:f1a413971403 | 578 | break; |
FelipeVR | 0:f1a413971403 | 579 | } |
FelipeVR | 0:f1a413971403 | 580 | GLCD_DisplayString (ln, 0, fi, buf); |
FelipeVR | 0:f1a413971403 | 581 | } |
FelipeVR | 0:f1a413971403 | 582 | |
FelipeVR | 0:f1a413971403 | 583 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 584 | * Draw bargraph * |
FelipeVR | 0:f1a413971403 | 585 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 586 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 587 | * w: maximum width of bargraph (in pixels) * |
FelipeVR | 0:f1a413971403 | 588 | * h: bargraph height * |
FelipeVR | 0:f1a413971403 | 589 | * val: value of active bargraph (in 1/1024) * |
FelipeVR | 0:f1a413971403 | 590 | * Return: * |
FelipeVR | 0:f1a413971403 | 591 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 592 | |
FelipeVR | 0:f1a413971403 | 593 | void GLCD_Bargraph (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int val) { |
FelipeVR | 0:f1a413971403 | 594 | int i,j; |
FelipeVR | 0:f1a413971403 | 595 | |
FelipeVR | 0:f1a413971403 | 596 | val = (val * w) >> 10; /* Scale value */ |
FelipeVR | 0:f1a413971403 | 597 | GLCD_SetWindow(x, y, w, h); |
FelipeVR | 0:f1a413971403 | 598 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 599 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 600 | for (i = 0; i < h; i++) { |
FelipeVR | 0:f1a413971403 | 601 | for (j = 0; j <= w-1; j++) { |
FelipeVR | 0:f1a413971403 | 602 | if(j >= val) { |
FelipeVR | 0:f1a413971403 | 603 | wr_dat_only(Color[BG_COLOR]); |
FelipeVR | 0:f1a413971403 | 604 | } else { |
FelipeVR | 0:f1a413971403 | 605 | wr_dat_only(Color[TXT_COLOR]); |
FelipeVR | 0:f1a413971403 | 606 | } |
FelipeVR | 0:f1a413971403 | 607 | } |
FelipeVR | 0:f1a413971403 | 608 | } |
FelipeVR | 0:f1a413971403 | 609 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 610 | } |
FelipeVR | 0:f1a413971403 | 611 | |
FelipeVR | 0:f1a413971403 | 612 | |
FelipeVR | 0:f1a413971403 | 613 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 614 | * Display graphical bitmap image at position x horizontally and y vertically * |
FelipeVR | 0:f1a413971403 | 615 | * (This function is optimized for 16 bits per pixel format, it has to be * |
FelipeVR | 0:f1a413971403 | 616 | * adapted for any other bits per pixel format) * |
FelipeVR | 0:f1a413971403 | 617 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 618 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 619 | * w: width of bitmap * |
FelipeVR | 0:f1a413971403 | 620 | * h: height of bitmap * |
FelipeVR | 0:f1a413971403 | 621 | * bitmap: address at which the bitmap data resides * |
FelipeVR | 0:f1a413971403 | 622 | * Return: * |
FelipeVR | 0:f1a413971403 | 623 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 624 | |
FelipeVR | 0:f1a413971403 | 625 | void GLCD_Bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned short *bitmap) { |
FelipeVR | 0:f1a413971403 | 626 | int i; |
FelipeVR | 0:f1a413971403 | 627 | // int j; |
FelipeVR | 0:f1a413971403 | 628 | unsigned short *bitmap_ptr = bitmap; |
FelipeVR | 0:f1a413971403 | 629 | |
FelipeVR | 0:f1a413971403 | 630 | GLCD_SetWindow (x, y, w, h); |
FelipeVR | 0:f1a413971403 | 631 | |
FelipeVR | 0:f1a413971403 | 632 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 633 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 634 | // for (i = (h-1)*w; i > -1; i -= w) { |
FelipeVR | 0:f1a413971403 | 635 | // for (j = 0; j < w; j++) { |
FelipeVR | 0:f1a413971403 | 636 | // wr_dat_only (bitmap_ptr[i+j]); |
FelipeVR | 0:f1a413971403 | 637 | // } |
FelipeVR | 0:f1a413971403 | 638 | // } |
FelipeVR | 0:f1a413971403 | 639 | |
FelipeVR | 0:f1a413971403 | 640 | for (i = 0; i < (w*h); i++) { |
FelipeVR | 0:f1a413971403 | 641 | wr_dat_only (bitmap_ptr[i]); |
FelipeVR | 0:f1a413971403 | 642 | } |
FelipeVR | 0:f1a413971403 | 643 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 644 | } |
FelipeVR | 0:f1a413971403 | 645 | |
FelipeVR | 0:f1a413971403 | 646 | |
FelipeVR | 0:f1a413971403 | 647 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 648 | * Display graphical bitmap image at position x horizontally and y vertically * |
FelipeVR | 0:f1a413971403 | 649 | * (This function is optimized for 16 bits per pixel format, it has to be * |
FelipeVR | 0:f1a413971403 | 650 | * adapted for any other bits per pixel format) * |
FelipeVR | 0:f1a413971403 | 651 | * Parameter: xs: horizontal start position * |
FelipeVR | 0:f1a413971403 | 652 | * xe: horizontal end position * |
FelipeVR | 0:f1a413971403 | 653 | * ys: vertical start position * |
FelipeVR | 0:f1a413971403 | 654 | * ye: vertical end position * |
FelipeVR | 0:f1a413971403 | 655 | * bitmap: address at which the bitmap data resides * |
FelipeVR | 0:f1a413971403 | 656 | * Return: * |
FelipeVR | 0:f1a413971403 | 657 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 658 | |
FelipeVR | 0:f1a413971403 | 659 | void GLCD_BitmapSize (unsigned int xs, unsigned int xe, unsigned int ys, unsigned int ye, unsigned short *bitmap) { |
FelipeVR | 0:f1a413971403 | 660 | int i; |
FelipeVR | 0:f1a413971403 | 661 | unsigned short *bitmap_ptr = bitmap; |
FelipeVR | 0:f1a413971403 | 662 | |
FelipeVR | 0:f1a413971403 | 663 | GLCD_SetWindowSize (xs, xe, ys, ye); |
FelipeVR | 0:f1a413971403 | 664 | |
FelipeVR | 0:f1a413971403 | 665 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 666 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 667 | |
FelipeVR | 0:f1a413971403 | 668 | for (i = 0; i < ((xe-xs+1)*(ye-ys)); i++) { |
FelipeVR | 0:f1a413971403 | 669 | wr_dat_only (bitmap_ptr[i]); |
FelipeVR | 0:f1a413971403 | 670 | } |
FelipeVR | 0:f1a413971403 | 671 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 672 | } |
FelipeVR | 0:f1a413971403 | 673 | |
FelipeVR | 0:f1a413971403 | 674 | |
FelipeVR | 0:f1a413971403 | 675 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 676 | * Scroll content of the whole display for dy pixels vertically * |
FelipeVR | 0:f1a413971403 | 677 | * Parameter: dy: number of pixels for vertical scroll * |
FelipeVR | 0:f1a413971403 | 678 | * Return: * |
FelipeVR | 0:f1a413971403 | 679 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 680 | |
FelipeVR | 0:f1a413971403 | 681 | void GLCD_ScrollVertical (unsigned int dy) { |
FelipeVR | 0:f1a413971403 | 682 | #if (LANDSCAPE == 0) |
FelipeVR | 0:f1a413971403 | 683 | static unsigned int y = 0; |
FelipeVR | 0:f1a413971403 | 684 | |
FelipeVR | 0:f1a413971403 | 685 | y = y + dy; |
FelipeVR | 0:f1a413971403 | 686 | while (y >= HEIGHT) |
FelipeVR | 0:f1a413971403 | 687 | y -= HEIGHT; |
FelipeVR | 0:f1a413971403 | 688 | |
FelipeVR | 0:f1a413971403 | 689 | // if (Himax) { |
FelipeVR | 0:f1a413971403 | 690 | wr_reg(0x01, 0x08); |
FelipeVR | 0:f1a413971403 | 691 | wr_reg(0x14, y>>8); /* VSP MSB */ |
FelipeVR | 0:f1a413971403 | 692 | wr_reg(0x15, y&0xFF); /* VSP LSB */ |
FelipeVR | 0:f1a413971403 | 693 | // } |
FelipeVR | 0:f1a413971403 | 694 | // else { |
FelipeVR | 0:f1a413971403 | 695 | // wr_reg(0x6A, y); |
FelipeVR | 0:f1a413971403 | 696 | // wr_reg(0x61, 3); |
FelipeVR | 0:f1a413971403 | 697 | // } |
FelipeVR | 0:f1a413971403 | 698 | #endif |
FelipeVR | 0:f1a413971403 | 699 | } |
FelipeVR | 0:f1a413971403 | 700 | |
FelipeVR | 0:f1a413971403 | 701 | |
FelipeVR | 0:f1a413971403 | 702 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 703 | * Write a command to the LCD controller * |
FelipeVR | 0:f1a413971403 | 704 | * Parameter: cmd: command to write to the LCD * |
FelipeVR | 0:f1a413971403 | 705 | * Return: * |
FelipeVR | 0:f1a413971403 | 706 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 707 | void GLCD_WrCmd (unsigned char cmd) { |
FelipeVR | 0:f1a413971403 | 708 | wr_cmd (cmd); |
FelipeVR | 0:f1a413971403 | 709 | } |
FelipeVR | 0:f1a413971403 | 710 | |
FelipeVR | 0:f1a413971403 | 711 | |
FelipeVR | 0:f1a413971403 | 712 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 713 | * Write a value into LCD controller register * |
FelipeVR | 0:f1a413971403 | 714 | * Parameter: reg: lcd register address * |
FelipeVR | 0:f1a413971403 | 715 | * val: value to write into reg * |
FelipeVR | 0:f1a413971403 | 716 | * Return: * |
FelipeVR | 0:f1a413971403 | 717 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 718 | void GLCD_WrReg (unsigned char reg, unsigned short val) { |
FelipeVR | 0:f1a413971403 | 719 | wr_reg (reg, val); |
FelipeVR | 0:f1a413971403 | 720 | } |
FelipeVR | 0:f1a413971403 | 721 | |
FelipeVR | 0:f1a413971403 | 722 | |
FelipeVR | 0:f1a413971403 | 723 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 724 | * Start GLCD sequence * |
FelipeVR | 0:f1a413971403 | 725 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 726 | * Return: * |
FelipeVR | 0:f1a413971403 | 727 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 728 | void GLCD_Start (void) { |
FelipeVR | 0:f1a413971403 | 729 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 730 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 731 | } |
FelipeVR | 0:f1a413971403 | 732 | |
FelipeVR | 0:f1a413971403 | 733 | |
FelipeVR | 0:f1a413971403 | 734 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 735 | * Write GLCD data * |
FelipeVR | 0:f1a413971403 | 736 | * Parameter: 16 bits video data * |
FelipeVR | 0:f1a413971403 | 737 | * Return: * |
FelipeVR | 0:f1a413971403 | 738 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 739 | void GLCD_Write (unsigned short data) { |
FelipeVR | 0:f1a413971403 | 740 | wr_dat_only (data); |
FelipeVR | 0:f1a413971403 | 741 | } |
FelipeVR | 0:f1a413971403 | 742 | |
FelipeVR | 0:f1a413971403 | 743 | |
FelipeVR | 0:f1a413971403 | 744 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 745 | * End GLCD sequence * |
FelipeVR | 0:f1a413971403 | 746 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 747 | * Return: * |
FelipeVR | 0:f1a413971403 | 748 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 749 | void GLCD_End (void) { |
FelipeVR | 0:f1a413971403 | 750 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 751 | } |
FelipeVR | 0:f1a413971403 | 752 | |
FelipeVR | 0:f1a413971403 | 753 | |
FelipeVR | 0:f1a413971403 | 754 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 755 | * Write a boarder to the LCD screen in foreground color * |
FelipeVR | 0:f1a413971403 | 756 | * Parameter: * |
FelipeVR | 0:f1a413971403 | 757 | * Return: * |
FelipeVR | 0:f1a413971403 | 758 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 759 | void GLCD_Boarder (void) { |
FelipeVR | 0:f1a413971403 | 760 | int i; |
FelipeVR | 0:f1a413971403 | 761 | for (i = 0; i < WIDTH; i++) |
FelipeVR | 0:f1a413971403 | 762 | { |
FelipeVR | 0:f1a413971403 | 763 | GLCD_PutPixel (i, 0); |
FelipeVR | 0:f1a413971403 | 764 | GLCD_PutPixel (i, HEIGHT - 1); |
FelipeVR | 0:f1a413971403 | 765 | |
FelipeVR | 0:f1a413971403 | 766 | if (i < HEIGHT) |
FelipeVR | 0:f1a413971403 | 767 | { |
FelipeVR | 0:f1a413971403 | 768 | GLCD_PutPixel (0, i); |
FelipeVR | 0:f1a413971403 | 769 | GLCD_PutPixel (WIDTH - 1, i); |
FelipeVR | 0:f1a413971403 | 770 | } |
FelipeVR | 0:f1a413971403 | 771 | } |
FelipeVR | 0:f1a413971403 | 772 | } |
FelipeVR | 0:f1a413971403 | 773 | |
FelipeVR | 0:f1a413971403 | 774 | |
FelipeVR | 0:f1a413971403 | 775 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 776 | * Draw box filled with color * |
FelipeVR | 0:f1a413971403 | 777 | * Parameter: x: horizontal position * |
FelipeVR | 0:f1a413971403 | 778 | * y: vertical position * |
FelipeVR | 0:f1a413971403 | 779 | * w: window width in pixels * |
FelipeVR | 0:f1a413971403 | 780 | * h: window height in pixels * |
FelipeVR | 0:f1a413971403 | 781 | * color: box color * |
FelipeVR | 0:f1a413971403 | 782 | * Return: * |
FelipeVR | 0:f1a413971403 | 783 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 784 | void GLCD_Box (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned short color) { |
FelipeVR | 0:f1a413971403 | 785 | unsigned int i; |
FelipeVR | 0:f1a413971403 | 786 | |
FelipeVR | 0:f1a413971403 | 787 | GLCD_SetWindow (x, y, w, h); |
FelipeVR | 0:f1a413971403 | 788 | |
FelipeVR | 0:f1a413971403 | 789 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 790 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 791 | for(i = 0; i < (w*h); i++){ |
FelipeVR | 0:f1a413971403 | 792 | wr_dat_only (color); |
FelipeVR | 0:f1a413971403 | 793 | } |
FelipeVR | 0:f1a413971403 | 794 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 795 | } |
FelipeVR | 0:f1a413971403 | 796 | |
FelipeVR | 0:f1a413971403 | 797 | |
FelipeVR | 0:f1a413971403 | 798 | /******************************************************************************* |
FelipeVR | 0:f1a413971403 | 799 | * Draw box filled with color * |
FelipeVR | 0:f1a413971403 | 800 | * Parameter: xs: horizontal start position * |
FelipeVR | 0:f1a413971403 | 801 | * xe: horizontal end position * |
FelipeVR | 0:f1a413971403 | 802 | * ys: vertical start position * |
FelipeVR | 0:f1a413971403 | 803 | * ye: vertical end position * |
FelipeVR | 0:f1a413971403 | 804 | * color: box color * |
FelipeVR | 0:f1a413971403 | 805 | * Return: * |
FelipeVR | 0:f1a413971403 | 806 | *******************************************************************************/ |
FelipeVR | 0:f1a413971403 | 807 | void GLCD_BoxSize (unsigned int xs, unsigned int xe, unsigned int ys, unsigned int ye, unsigned short color) { |
FelipeVR | 0:f1a413971403 | 808 | int i; |
FelipeVR | 0:f1a413971403 | 809 | |
FelipeVR | 0:f1a413971403 | 810 | GLCD_SetWindowSize (xs, xe, ys, ye); |
FelipeVR | 0:f1a413971403 | 811 | |
FelipeVR | 0:f1a413971403 | 812 | wr_cmd(0x22); |
FelipeVR | 0:f1a413971403 | 813 | wr_dat_start(); |
FelipeVR | 0:f1a413971403 | 814 | |
FelipeVR | 0:f1a413971403 | 815 | for (i = 0; i < ((xe-xs+1)*(ye-ys)); i++) { |
FelipeVR | 0:f1a413971403 | 816 | wr_dat_only (color); |
FelipeVR | 0:f1a413971403 | 817 | } |
FelipeVR | 0:f1a413971403 | 818 | wr_dat_stop(); |
FelipeVR | 0:f1a413971403 | 819 | } |
FelipeVR | 0:f1a413971403 | 820 | /******************************************************************************/ |