test

Dependencies:   SDFileSystem mbed-dev

Fork of Nucleo_Ex06_EMU by woodstock .

Committer:
charliex
Date:
Sat May 27 02:17:37 2017 +0000
Revision:
4:53ef91c87d74
Parent:
3:8d6e6aec9b01
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charliex 3:8d6e6aec9b01 1 /*===================================================================*/
charliex 3:8d6e6aec9b01 2 /* */
charliex 3:8d6e6aec9b01 3 /* tft.cpp : TFT(ILI9341) function */
charliex 3:8d6e6aec9b01 4 /* */
charliex 3:8d6e6aec9b01 5 /* 2016/1/20 Racoon */
charliex 3:8d6e6aec9b01 6 /* */
charliex 3:8d6e6aec9b01 7 /*===================================================================*/
charliex 3:8d6e6aec9b01 8
charliex 3:8d6e6aec9b01 9 #include "mbed.h"
charliex 3:8d6e6aec9b01 10 #include "tft.h"
charliex 3:8d6e6aec9b01 11
charliex 3:8d6e6aec9b01 12 #ifdef OLD_BOARD
charliex 3:8d6e6aec9b01 13 DigitalOut cs ( PB_5, PullUp ); // TFT chipselect pin
charliex 3:8d6e6aec9b01 14 #else
charliex 3:8d6e6aec9b01 15 DigitalOut cs ( PC_7, PullUp ); // TFT chipselect pin
charliex 3:8d6e6aec9b01 16 #endif
charliex 3:8d6e6aec9b01 17
charliex 3:8d6e6aec9b01 18 DigitalOut dc ( PA_8, PullUp ); // TFT data command select pin
charliex 3:8d6e6aec9b01 19
charliex 3:8d6e6aec9b01 20 //mopho
charliex 3:8d6e6aec9b01 21 #if defined( MOPHO_BOARD)
charliex 3:8d6e6aec9b01 22 DigitalOut rst ( PA_2, PullUp ); // TFT reset pin
charliex 3:8d6e6aec9b01 23 #endif
charliex 3:8d6e6aec9b01 24
charliex 3:8d6e6aec9b01 25 // standalone
charliex 3:8d6e6aec9b01 26 #if defined( STANDALONE_BOARD)
charliex 3:8d6e6aec9b01 27 DigitalOut rst ( PC_8, PullUp ); // TFT reset pin
charliex 3:8d6e6aec9b01 28 #endif
charliex 3:8d6e6aec9b01 29
charliex 3:8d6e6aec9b01 30 //DigitalOut back ( PC_9 );
charliex 3:8d6e6aec9b01 31
charliex 3:8d6e6aec9b01 32 PwmOut back ( PC_9 );
charliex 3:8d6e6aec9b01 33 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 34 /* Write command */
charliex 3:8d6e6aec9b01 35 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 36 void write_cmd ( uint8_t cmd )
charliex 3:8d6e6aec9b01 37 {
charliex 3:8d6e6aec9b01 38 dc = 0;
charliex 3:8d6e6aec9b01 39 spi_write ( cmd );
charliex 3:8d6e6aec9b01 40 }
charliex 3:8d6e6aec9b01 41
charliex 3:8d6e6aec9b01 42 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 43 /* Write data */
charliex 3:8d6e6aec9b01 44 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 45 void write_data ( uint8_t data )
charliex 3:8d6e6aec9b01 46 {
charliex 3:8d6e6aec9b01 47 dc = 1;
charliex 3:8d6e6aec9b01 48 spi_write ( data );
charliex 3:8d6e6aec9b01 49 }
charliex 3:8d6e6aec9b01 50
charliex 3:8d6e6aec9b01 51 uint8_t read_diag ( void )
charliex 3:8d6e6aec9b01 52 {
charliex 3:8d6e6aec9b01 53 uint8_t status;
charliex 3:8d6e6aec9b01 54
charliex 3:8d6e6aec9b01 55 write_cmd ( 0xf );
charliex 3:8d6e6aec9b01 56 // dummy read
charliex 3:8d6e6aec9b01 57 spi_read();
charliex 3:8d6e6aec9b01 58 status = spi_read();
charliex 3:8d6e6aec9b01 59
charliex 3:8d6e6aec9b01 60 if ( status == 0 ) {
charliex 3:8d6e6aec9b01 61 return 0;
charliex 3:8d6e6aec9b01 62 }
charliex 3:8d6e6aec9b01 63
charliex 3:8d6e6aec9b01 64 return 1;
charliex 3:8d6e6aec9b01 65
charliex 3:8d6e6aec9b01 66 }
charliex 3:8d6e6aec9b01 67
charliex 3:8d6e6aec9b01 68 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 69 /* TFT reset */
charliex 3:8d6e6aec9b01 70 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 71 void tft_reset()
charliex 3:8d6e6aec9b01 72 {
charliex 3:8d6e6aec9b01 73 // reset
charliex 3:8d6e6aec9b01 74 rst = 0;
charliex 3:8d6e6aec9b01 75 wait_ms ( 200 );
charliex 3:8d6e6aec9b01 76 rst = 1;
charliex 3:8d6e6aec9b01 77 // delay for RST
charliex 3:8d6e6aec9b01 78 wait_ms ( 200 );
charliex 3:8d6e6aec9b01 79
charliex 3:8d6e6aec9b01 80
charliex 3:8d6e6aec9b01 81 // reset ili9341
charliex 3:8d6e6aec9b01 82 write_cmd ( 0x1 );
charliex 3:8d6e6aec9b01 83 wait_ms ( 500 );
charliex 3:8d6e6aec9b01 84
charliex 3:8d6e6aec9b01 85 cs = 1;
charliex 3:8d6e6aec9b01 86 dc = 1;
charliex 3:8d6e6aec9b01 87
charliex 3:8d6e6aec9b01 88 wait_ms ( 200 );
charliex 3:8d6e6aec9b01 89 rst = 0;
charliex 3:8d6e6aec9b01 90 wait_us ( 10 );
charliex 3:8d6e6aec9b01 91 rst = 1;
charliex 3:8d6e6aec9b01 92 wait_ms ( 120 );
charliex 3:8d6e6aec9b01 93 cs = 0;
charliex 3:8d6e6aec9b01 94 wait_ms ( 10 );
charliex 3:8d6e6aec9b01 95
charliex 3:8d6e6aec9b01 96 write_cmd ( 0x3A ); // Pixel Format
charliex 3:8d6e6aec9b01 97 write_data ( 0x55 ); // 16bit Color
charliex 3:8d6e6aec9b01 98
charliex 3:8d6e6aec9b01 99 write_cmd ( 0xB1 ); // Frame Control
charliex 3:8d6e6aec9b01 100 write_data ( 0 );
charliex 3:8d6e6aec9b01 101 write_data ( 0x1f );
charliex 3:8d6e6aec9b01 102 // 11101000b e8
charliex 3:8d6e6aec9b01 103 // 00101000b 28
charliex 3:8d6e6aec9b01 104 unsigned char mac = 0xe8;//(0xe8 + (1 << 7));
charliex 3:8d6e6aec9b01 105 write_cmd ( 0x36 ); // Memory Access Control
charliex 3:8d6e6aec9b01 106 #if !defined( STANDALONE_BOARD)
charliex 3:8d6e6aec9b01 107 write_data ( 0xe8 ); // MY MX MV BGR
charliex 3:8d6e6aec9b01 108 #else
charliex 3:8d6e6aec9b01 109 write_data ( 0x28 ); // MY MX MV BGR
charliex 3:8d6e6aec9b01 110 #endif
charliex 3:8d6e6aec9b01 111
charliex 3:8d6e6aec9b01 112 write_cmd ( 0x11 ); // Sleep Out
charliex 3:8d6e6aec9b01 113 wait_ms ( 5 );
charliex 3:8d6e6aec9b01 114
charliex 3:8d6e6aec9b01 115 write_cmd ( 0x29 ); // Display On
charliex 3:8d6e6aec9b01 116
charliex 3:8d6e6aec9b01 117 }
charliex 3:8d6e6aec9b01 118
charliex 3:8d6e6aec9b01 119 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 120 /* Set windows size, start memory write */
charliex 3:8d6e6aec9b01 121 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 122 void tft_set_window ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1 )
charliex 3:8d6e6aec9b01 123 {
charliex 3:8d6e6aec9b01 124 write_cmd ( 0x2A ); // Column Address Set
charliex 3:8d6e6aec9b01 125 write_data ( x0 >> 8 );
charliex 3:8d6e6aec9b01 126 write_data ( x0 );
charliex 3:8d6e6aec9b01 127 write_data ( x1 >> 8 );
charliex 3:8d6e6aec9b01 128 write_data ( x1 );
charliex 3:8d6e6aec9b01 129
charliex 3:8d6e6aec9b01 130 write_cmd ( 0x2B ); // Page Address Set
charliex 3:8d6e6aec9b01 131 write_data ( y0 >> 8 );
charliex 3:8d6e6aec9b01 132 write_data ( y0 );
charliex 3:8d6e6aec9b01 133 write_data ( y1 >> 8 );
charliex 3:8d6e6aec9b01 134 write_data ( y1 );
charliex 3:8d6e6aec9b01 135
charliex 3:8d6e6aec9b01 136 write_cmd ( 0x2C ); // Memory Write
charliex 3:8d6e6aec9b01 137
charliex 3:8d6e6aec9b01 138 wait_us ( 20 );
charliex 3:8d6e6aec9b01 139
charliex 3:8d6e6aec9b01 140 dc = 1;
charliex 3:8d6e6aec9b01 141 }
charliex 3:8d6e6aec9b01 142
charliex 3:8d6e6aec9b01 143 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 144 /* Clear screen */
charliex 3:8d6e6aec9b01 145 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 146 void tft_clear ( uint16_t color )
charliex 3:8d6e6aec9b01 147 {
charliex 3:8d6e6aec9b01 148 tft_set_window ( 0, 0, TFT_WIDTH, TFT_HEIGHT );
charliex 3:8d6e6aec9b01 149
charliex 3:8d6e6aec9b01 150 for ( int i = 0; i < TFT_WIDTH * TFT_HEIGHT; ++i ) {
charliex 3:8d6e6aec9b01 151 spi_writew ( color );
charliex 3:8d6e6aec9b01 152 }
charliex 3:8d6e6aec9b01 153 }
charliex 3:8d6e6aec9b01 154
charliex 3:8d6e6aec9b01 155 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 156 /* Put char */
charliex 3:8d6e6aec9b01 157 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 158 void tft_put_char ( int x, int y, char chr, uint16_t color, uint16_t bgcolor )
charliex 3:8d6e6aec9b01 159 {
charliex 3:8d6e6aec9b01 160 if ( chr < 0x20 || chr > 0x7f ) {
charliex 3:8d6e6aec9b01 161 chr = 0x3f;
charliex 3:8d6e6aec9b01 162
charliex 3:8d6e6aec9b01 163 } else {
charliex 3:8d6e6aec9b01 164 chr = ( chr < 0x60 ) ? chr - 0x20 : chr - 0x40;
charliex 3:8d6e6aec9b01 165 }
charliex 3:8d6e6aec9b01 166
charliex 3:8d6e6aec9b01 167 tft_set_window ( x, y, x + 7, y + 6 );
charliex 3:8d6e6aec9b01 168
charliex 3:8d6e6aec9b01 169 for ( int dy = 0; dy < 7; ++dy ) {
charliex 3:8d6e6aec9b01 170 unsigned char img = chrimg[chr][dy];
charliex 3:8d6e6aec9b01 171
charliex 3:8d6e6aec9b01 172 for ( int dx = 0; dx < 8; ++dx ) {
charliex 3:8d6e6aec9b01 173 if ( img & 0x80 ) {
charliex 3:8d6e6aec9b01 174 spi_writew ( color );
charliex 3:8d6e6aec9b01 175
charliex 3:8d6e6aec9b01 176 } else {
charliex 3:8d6e6aec9b01 177 spi_writew ( bgcolor );
charliex 3:8d6e6aec9b01 178 }
charliex 3:8d6e6aec9b01 179
charliex 3:8d6e6aec9b01 180 img <<= 1;
charliex 3:8d6e6aec9b01 181 }
charliex 3:8d6e6aec9b01 182 }
charliex 3:8d6e6aec9b01 183
charliex 3:8d6e6aec9b01 184 }
charliex 3:8d6e6aec9b01 185
charliex 3:8d6e6aec9b01 186 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 187 /* Text out */
charliex 3:8d6e6aec9b01 188 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 189 void tft_text ( int x, int y, char *text, uint16_t color, uint16_t bgcolor )
charliex 3:8d6e6aec9b01 190 {
charliex 3:8d6e6aec9b01 191 while ( *text != 0 ) {
charliex 3:8d6e6aec9b01 192 tft_put_char ( x, y, *text, color, bgcolor );
charliex 3:8d6e6aec9b01 193 x += 8;
charliex 3:8d6e6aec9b01 194 text++;
charliex 3:8d6e6aec9b01 195 }
charliex 3:8d6e6aec9b01 196 }
charliex 3:8d6e6aec9b01 197
charliex 3:8d6e6aec9b01 198 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 199 /* Horizontal Line */
charliex 3:8d6e6aec9b01 200 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 201 void tft_hline ( int x1, int y, int x2, uint16_t color )
charliex 3:8d6e6aec9b01 202 {
charliex 3:8d6e6aec9b01 203 tft_set_window ( x1, y, x2, y );
charliex 3:8d6e6aec9b01 204
charliex 3:8d6e6aec9b01 205 for ( ; x1 < x2; ++x1 ) {
charliex 3:8d6e6aec9b01 206 spi_writew ( color );
charliex 3:8d6e6aec9b01 207 }
charliex 3:8d6e6aec9b01 208 }
charliex 3:8d6e6aec9b01 209
charliex 3:8d6e6aec9b01 210 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 211 /* Vertical Line */
charliex 3:8d6e6aec9b01 212 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 213 void tft_vline ( int x, int y1, int y2, uint16_t color )
charliex 3:8d6e6aec9b01 214 {
charliex 3:8d6e6aec9b01 215 tft_set_window ( x, y1, x, y2 );
charliex 3:8d6e6aec9b01 216
charliex 3:8d6e6aec9b01 217 for ( ; y1 < y2; ++y1 ) {
charliex 3:8d6e6aec9b01 218 spi_writew ( color );
charliex 3:8d6e6aec9b01 219 }
charliex 3:8d6e6aec9b01 220 }
charliex 3:8d6e6aec9b01 221
charliex 3:8d6e6aec9b01 222 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 223 /* Box */
charliex 3:8d6e6aec9b01 224 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 225 void tft_box ( int x1, int y1, int x2, int y2, uint16_t color )
charliex 3:8d6e6aec9b01 226 {
charliex 3:8d6e6aec9b01 227 tft_hline ( x1, y1, x2, color );
charliex 3:8d6e6aec9b01 228 tft_vline ( x1, y1, y2, color );
charliex 3:8d6e6aec9b01 229 tft_vline ( x2, y1, y2, color );
charliex 3:8d6e6aec9b01 230 tft_hline ( x1, y2, x2, color );
charliex 3:8d6e6aec9b01 231 }
charliex 3:8d6e6aec9b01 232
charliex 3:8d6e6aec9b01 233 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 234 /* Box Fill */
charliex 3:8d6e6aec9b01 235 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 236 void tft_boxfill ( int x1, int y1, int x2, int y2, uint16_t color )
charliex 3:8d6e6aec9b01 237 {
charliex 3:8d6e6aec9b01 238 tft_set_window ( x1, y1, x2, y2 );
charliex 3:8d6e6aec9b01 239
charliex 3:8d6e6aec9b01 240 for ( int i = 0; i < ( x2 - x1 + 1 ) * ( y2 - y1 + 1 ); ++i ) {
charliex 3:8d6e6aec9b01 241 spi_writew ( color );
charliex 3:8d6e6aec9b01 242 }
charliex 3:8d6e6aec9b01 243 }
charliex 3:8d6e6aec9b01 244
charliex 3:8d6e6aec9b01 245 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 246 /* Draw 4bit BMP */
charliex 3:8d6e6aec9b01 247 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 248 bool draw_bmp_4bpp ( const unsigned char *imgdata, int x, int y )
charliex 3:8d6e6aec9b01 249 {
charliex 3:8d6e6aec9b01 250 BITMAPFILEHEADER *bf = ( BITMAPFILEHEADER * ) imgdata;
charliex 3:8d6e6aec9b01 251 BITMAPINFOHEADER *bi = ( BITMAPINFOHEADER * ) ( imgdata + sizeof ( BITMAPFILEHEADER ) );
charliex 3:8d6e6aec9b01 252
charliex 3:8d6e6aec9b01 253
charliex 3:8d6e6aec9b01 254 if ( bi->biBitCount != 4 ) {
charliex 3:8d6e6aec9b01 255 return false;
charliex 3:8d6e6aec9b01 256 }
charliex 3:8d6e6aec9b01 257
charliex 3:8d6e6aec9b01 258 unsigned char *pRGBPal = ( unsigned char* ) imgdata + sizeof ( BITMAPFILEHEADER ) + bi->biSize;
charliex 3:8d6e6aec9b01 259 unsigned short palette[16];
charliex 3:8d6e6aec9b01 260
charliex 3:8d6e6aec9b01 261 for ( int i = 0; pRGBPal < imgdata + bf->bfOffBits && i < 16; ++i ) {
charliex 3:8d6e6aec9b01 262 unsigned short r, g, b;
charliex 3:8d6e6aec9b01 263 b = *pRGBPal++ >> 3;
charliex 3:8d6e6aec9b01 264 g = *pRGBPal++ >> 2;
charliex 3:8d6e6aec9b01 265 r = *pRGBPal++ >> 3;
charliex 3:8d6e6aec9b01 266 pRGBPal++;
charliex 3:8d6e6aec9b01 267 palette[i] = ( ( g & 7 ) << 13 ) | ( b << 8 ) | ( r << 3 ) | ( g >> 3 );
charliex 3:8d6e6aec9b01 268 }
charliex 3:8d6e6aec9b01 269
charliex 3:8d6e6aec9b01 270 unsigned short HLine[320];
charliex 3:8d6e6aec9b01 271 int linesize = ( bi->biWidth / 2 + 3 ) & 0xfffc;
charliex 3:8d6e6aec9b01 272
charliex 3:8d6e6aec9b01 273 tft_set_window ( x, y, x + bi->biWidth - 1, y + bi->biHeight - 1 );
charliex 3:8d6e6aec9b01 274
charliex 3:8d6e6aec9b01 275 unsigned char *bmp;
charliex 3:8d6e6aec9b01 276
charliex 3:8d6e6aec9b01 277 for ( int y = bi->biHeight - 1; y >= 0; --y ) {
charliex 3:8d6e6aec9b01 278 bmp = ( unsigned char * ) imgdata + bf->bfOffBits + y * linesize;
charliex 3:8d6e6aec9b01 279
charliex 3:8d6e6aec9b01 280 for ( int x = 0; x < bi->biWidth; ++x ) {
charliex 3:8d6e6aec9b01 281 char pal;
charliex 3:8d6e6aec9b01 282
charliex 3:8d6e6aec9b01 283
charliex 3:8d6e6aec9b01 284 if ( x & 1 ) {
charliex 3:8d6e6aec9b01 285 pal = *bmp & 0xf;
charliex 3:8d6e6aec9b01 286 bmp++;
charliex 3:8d6e6aec9b01 287
charliex 3:8d6e6aec9b01 288 } else {
charliex 3:8d6e6aec9b01 289 pal = *bmp >> 4;
charliex 3:8d6e6aec9b01 290 }
charliex 3:8d6e6aec9b01 291
charliex 3:8d6e6aec9b01 292 HLine[x] = palette[pal];
charliex 3:8d6e6aec9b01 293 }
charliex 3:8d6e6aec9b01 294
charliex 3:8d6e6aec9b01 295 HAL_SPI_Transmit ( &SpiHandle, ( uint8_t * ) HLine, bi->biWidth * 2, 100 );
charliex 3:8d6e6aec9b01 296 }
charliex 3:8d6e6aec9b01 297
charliex 3:8d6e6aec9b01 298 return true;
charliex 3:8d6e6aec9b01 299 }
charliex 3:8d6e6aec9b01 300
charliex 3:8d6e6aec9b01 301
charliex 3:8d6e6aec9b01 302 void backlight ( float status )
charliex 3:8d6e6aec9b01 303 {
charliex 3:8d6e6aec9b01 304 back = status;
charliex 3:8d6e6aec9b01 305 }
charliex 3:8d6e6aec9b01 306
charliex 3:8d6e6aec9b01 307 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 308 /* Initialize TFT */
charliex 3:8d6e6aec9b01 309 /*-------------------------------------------------------------------*/
charliex 3:8d6e6aec9b01 310 void tft_init ( void )
charliex 3:8d6e6aec9b01 311 {
charliex 3:8d6e6aec9b01 312
charliex 3:8d6e6aec9b01 313 backlight ( .2 );
charliex 3:8d6e6aec9b01 314
charliex 3:8d6e6aec9b01 315 spi_init();
charliex 3:8d6e6aec9b01 316
charliex 3:8d6e6aec9b01 317 tft_reset();
charliex 3:8d6e6aec9b01 318
charliex 3:8d6e6aec9b01 319 //read_diag();
charliex 3:8d6e6aec9b01 320 }
charliex 3:8d6e6aec9b01 321
charliex 3:8d6e6aec9b01 322
charliex 3:8d6e6aec9b01 323
charliex 3:8d6e6aec9b01 324