for Arduino TFT LCD Screen 160x128

Dependents:   TFTLCDSCREEN Pong_ILI9163C

Fork of TFT_ILI9163C by _ peu605

Committer:
billycorgan123
Date:
Fri Mar 04 08:55:32 2016 +0000
Revision:
12:f0799be044ff
Parent:
7:3dcb98ecf29f
first trial with Arduino TFT LCD Screen, ILI9163

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peu605 7:3dcb98ecf29f 1 #include "TFT_ILI9163C.h"
peu605 7:3dcb98ecf29f 2 #if defined(__F411RE_SOFT__)
peu605 7:3dcb98ecf29f 3
peu605 7:3dcb98ecf29f 4 /**
peu605 7:3dcb98ecf29f 5 * TFT_ILI9163C library for ST Nucleo F411RE SOFT
peu605 7:3dcb98ecf29f 6 *
peu605 7:3dcb98ecf29f 7 * @author Copyright (c) 2014, .S.U.M.O.T.O.Y., coded by Max MC Costa
peu605 7:3dcb98ecf29f 8 * https://github.com/sumotoy/TFT_ILI9163C
peu605 7:3dcb98ecf29f 9 *
peu605 7:3dcb98ecf29f 10 * @author modified by masuda, Masuda Naika
peu605 7:3dcb98ecf29f 11 */
peu605 7:3dcb98ecf29f 12
peu605 7:3dcb98ecf29f 13 //Serial pc(SERIAL_TX, SERIAL_RX);
peu605 7:3dcb98ecf29f 14
peu605 7:3dcb98ecf29f 15 //constructors
peu605 7:3dcb98ecf29f 16 TFT_ILI9163C::TFT_ILI9163C(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc, PinName reset)
peu605 7:3dcb98ecf29f 17 : TFT_ILI9163C_BASE(mosi, miso, sclk, cs, dc, reset) {
peu605 7:3dcb98ecf29f 18
peu605 7:3dcb98ecf29f 19 _resetPinName = reset;
peu605 7:3dcb98ecf29f 20 init(cs, dc);
peu605 7:3dcb98ecf29f 21 }
peu605 7:3dcb98ecf29f 22
peu605 7:3dcb98ecf29f 23 TFT_ILI9163C::TFT_ILI9163C(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc)
peu605 7:3dcb98ecf29f 24 : TFT_ILI9163C_BASE(mosi, miso, sclk, cs, dc) {
peu605 7:3dcb98ecf29f 25
peu605 7:3dcb98ecf29f 26 _resetPinName = NC;
peu605 7:3dcb98ecf29f 27 init(cs, dc);
peu605 7:3dcb98ecf29f 28 }
peu605 7:3dcb98ecf29f 29
peu605 7:3dcb98ecf29f 30 void TFT_ILI9163C::init(PinName cs, PinName dc){
peu605 7:3dcb98ecf29f 31
peu605 7:3dcb98ecf29f 32 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 33
peu605 7:3dcb98ecf29f 34 uint32_t cs_port_index = (uint32_t) cs >> 4;
peu605 7:3dcb98ecf29f 35 uint32_t dc_port_index = (uint32_t) dc >> 4;
peu605 7:3dcb98ecf29f 36
peu605 7:3dcb98ecf29f 37 //set cs/dc port addresses and masks
peu605 7:3dcb98ecf29f 38 cs_port_reg = (GPIO_TypeDef *) (GPIOA_BASE + (cs_port_index << 10));
peu605 7:3dcb98ecf29f 39 cs_reg_mask = 1 << ((uint32_t) cs & 0xf);
peu605 7:3dcb98ecf29f 40 dc_port_reg = (GPIO_TypeDef *) (GPIOA_BASE + (dc_port_index << 10));
peu605 7:3dcb98ecf29f 41 dc_reg_mask = 1 << ((uint32_t) dc & 0xf);
peu605 7:3dcb98ecf29f 42
peu605 7:3dcb98ecf29f 43 // set bit band addresses
peu605 7:3dcb98ecf29f 44 // GPIO_TypeDef *cs_port_reg = (GPIO_TypeDef *) (GPIOA_BASE + (cs_port_index << 10));
peu605 7:3dcb98ecf29f 45 // GPIO_TypeDef *dc_port_reg = (GPIO_TypeDef *) (GPIOA_BASE + (dc_port_index << 10));
peu605 7:3dcb98ecf29f 46 // uint8_t cs_port_bit = (uint32_t) cs & 0xf;
peu605 7:3dcb98ecf29f 47 // uint8_t dc_port_bit = (uint32_t) dc & 0xf;
peu605 7:3dcb98ecf29f 48 // bb_cs_port = BITBAND_PERIPH(&cs_port_reg->ODR, cs_port_bit);
peu605 7:3dcb98ecf29f 49 // bb_dc_port = BITBAND_PERIPH(&dc_port_reg->ODR, dc_port_bit);
peu605 7:3dcb98ecf29f 50
peu605 7:3dcb98ecf29f 51 bb_spi_txe = BITBAND_PERIPH(&spi_ptr->SR, MASK_TO_BITNUM(SPI_SR_TXE));
peu605 7:3dcb98ecf29f 52 bb_spi_bsy = BITBAND_PERIPH(&spi_ptr->SR, MASK_TO_BITNUM(SPI_SR_BSY));
peu605 7:3dcb98ecf29f 53 bb_spi_spe = BITBAND_PERIPH(&spi_ptr->CR1, MASK_TO_BITNUM(SPI_CR1_SPE));
peu605 7:3dcb98ecf29f 54 bb_spi_dff = BITBAND_PERIPH(&spi_ptr->CR1, MASK_TO_BITNUM(SPI_CR1_DFF));
peu605 7:3dcb98ecf29f 55 }
peu605 7:3dcb98ecf29f 56
peu605 7:3dcb98ecf29f 57 inline void TFT_ILI9163C::selectSlave() {
peu605 7:3dcb98ecf29f 58 // _cs = 0; // Use DigitalOut
peu605 7:3dcb98ecf29f 59 // *bb_cs_port = 0; // Use bit band
peu605 7:3dcb98ecf29f 60 cs_port_reg->BSRRH = cs_reg_mask; // Use BSRR register
peu605 7:3dcb98ecf29f 61 }
peu605 7:3dcb98ecf29f 62
peu605 7:3dcb98ecf29f 63 inline void TFT_ILI9163C::deselectSlave() {
peu605 7:3dcb98ecf29f 64 // _cs = 1;
peu605 7:3dcb98ecf29f 65 // *bb_cs_port = 1;
peu605 7:3dcb98ecf29f 66 cs_port_reg->BSRRL = cs_reg_mask;
peu605 7:3dcb98ecf29f 67 }
peu605 7:3dcb98ecf29f 68
peu605 7:3dcb98ecf29f 69 inline void TFT_ILI9163C::setCommandMode() {
peu605 7:3dcb98ecf29f 70 // _dc = 0;
peu605 7:3dcb98ecf29f 71 // *bb_dc_port = 0;
peu605 7:3dcb98ecf29f 72 dc_port_reg->BSRRH = dc_reg_mask;
peu605 7:3dcb98ecf29f 73 }
peu605 7:3dcb98ecf29f 74
peu605 7:3dcb98ecf29f 75 inline void TFT_ILI9163C::setDataMode() {
peu605 7:3dcb98ecf29f 76 // _dc = 1;
peu605 7:3dcb98ecf29f 77 // *bb_dc_port = 1;
peu605 7:3dcb98ecf29f 78 dc_port_reg->BSRRL = dc_reg_mask;
peu605 7:3dcb98ecf29f 79 }
peu605 7:3dcb98ecf29f 80
peu605 7:3dcb98ecf29f 81 inline void TFT_ILI9163C::waitSpiFree() {
peu605 7:3dcb98ecf29f 82
peu605 7:3dcb98ecf29f 83 // SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 84 // while ((spi_ptr->SR & SPI_SR_TXE) == 0);
peu605 7:3dcb98ecf29f 85 // while ((spi_ptr->SR & SPI_SR_BSY) != 0);
peu605 7:3dcb98ecf29f 86
peu605 7:3dcb98ecf29f 87 while (*bb_spi_txe == 0);
peu605 7:3dcb98ecf29f 88 while (*bb_spi_bsy != 0);
peu605 7:3dcb98ecf29f 89 }
peu605 7:3dcb98ecf29f 90
peu605 7:3dcb98ecf29f 91 inline void TFT_ILI9163C::waitBufferFree() {
peu605 7:3dcb98ecf29f 92
peu605 7:3dcb98ecf29f 93 // SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 94 // while ((spi_ptr->SR & SPI_SR_TXE) == 0);
peu605 7:3dcb98ecf29f 95
peu605 7:3dcb98ecf29f 96 while (*bb_spi_txe == 0);
peu605 7:3dcb98ecf29f 97 }
peu605 7:3dcb98ecf29f 98
peu605 7:3dcb98ecf29f 99 inline void TFT_ILI9163C::set8bitMode() {
peu605 7:3dcb98ecf29f 100
peu605 7:3dcb98ecf29f 101 // SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 102 // spi_ptr->CR1 &= ~(SPI_CR1_SPE | SPI_CR1_DFF);
peu605 7:3dcb98ecf29f 103 // spi_ptr->CR1 |= SPI_CR1_SPE;
peu605 7:3dcb98ecf29f 104
peu605 7:3dcb98ecf29f 105 *bb_spi_spe = 0;
peu605 7:3dcb98ecf29f 106 *bb_spi_dff = 0;
peu605 7:3dcb98ecf29f 107 *bb_spi_spe = 1;
peu605 7:3dcb98ecf29f 108 }
peu605 7:3dcb98ecf29f 109
peu605 7:3dcb98ecf29f 110 inline void TFT_ILI9163C::set16bitMode() {
peu605 7:3dcb98ecf29f 111
peu605 7:3dcb98ecf29f 112 // SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 113 // spi_ptr->CR1 &= ~SPI_CR1_SPE;
peu605 7:3dcb98ecf29f 114 // spi_ptr->CR1 |= (SPI_CR1_SPE | SPI_CR1_DFF);
peu605 7:3dcb98ecf29f 115
peu605 7:3dcb98ecf29f 116 *bb_spi_spe = 0;
peu605 7:3dcb98ecf29f 117 *bb_spi_dff = 1;
peu605 7:3dcb98ecf29f 118 *bb_spi_spe = 1;
peu605 7:3dcb98ecf29f 119 }
peu605 7:3dcb98ecf29f 120
peu605 7:3dcb98ecf29f 121 void TFT_ILI9163C::writecommand(uint8_t c){
peu605 7:3dcb98ecf29f 122
peu605 7:3dcb98ecf29f 123 set8bitMode();
peu605 7:3dcb98ecf29f 124 setCommandMode();
peu605 7:3dcb98ecf29f 125 selectSlave();
peu605 7:3dcb98ecf29f 126
peu605 7:3dcb98ecf29f 127 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 128 spi_ptr->DR = c;
peu605 7:3dcb98ecf29f 129
peu605 7:3dcb98ecf29f 130 waitSpiFree();
peu605 7:3dcb98ecf29f 131 deselectSlave();
peu605 7:3dcb98ecf29f 132 }
peu605 7:3dcb98ecf29f 133
peu605 7:3dcb98ecf29f 134 void TFT_ILI9163C::writedata(uint8_t c){
peu605 7:3dcb98ecf29f 135
peu605 7:3dcb98ecf29f 136 set8bitMode();
peu605 7:3dcb98ecf29f 137 setDataMode();
peu605 7:3dcb98ecf29f 138 selectSlave();
peu605 7:3dcb98ecf29f 139
peu605 7:3dcb98ecf29f 140 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 141 spi_ptr->DR = c;
peu605 7:3dcb98ecf29f 142
peu605 7:3dcb98ecf29f 143 waitSpiFree();
peu605 7:3dcb98ecf29f 144 deselectSlave();
peu605 7:3dcb98ecf29f 145 }
peu605 7:3dcb98ecf29f 146
peu605 7:3dcb98ecf29f 147 void TFT_ILI9163C::writedata16(uint16_t d){
peu605 7:3dcb98ecf29f 148
peu605 7:3dcb98ecf29f 149 set16bitMode();
peu605 7:3dcb98ecf29f 150 setDataMode();
peu605 7:3dcb98ecf29f 151 selectSlave();
peu605 7:3dcb98ecf29f 152
peu605 7:3dcb98ecf29f 153 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 154 spi_ptr->DR = d;
peu605 7:3dcb98ecf29f 155
peu605 7:3dcb98ecf29f 156 waitSpiFree();
peu605 7:3dcb98ecf29f 157 deselectSlave();
peu605 7:3dcb98ecf29f 158 }
peu605 7:3dcb98ecf29f 159
peu605 7:3dcb98ecf29f 160
peu605 7:3dcb98ecf29f 161 void TFT_ILI9163C::writedata32(uint16_t d1, uint16_t d2){
peu605 7:3dcb98ecf29f 162
peu605 7:3dcb98ecf29f 163 set16bitMode();
peu605 7:3dcb98ecf29f 164 setDataMode();
peu605 7:3dcb98ecf29f 165 selectSlave();
peu605 7:3dcb98ecf29f 166
peu605 7:3dcb98ecf29f 167 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 168 spi_ptr->DR = d1;
peu605 7:3dcb98ecf29f 169 waitBufferFree();
peu605 7:3dcb98ecf29f 170 spi_ptr->DR = d2;
peu605 7:3dcb98ecf29f 171
peu605 7:3dcb98ecf29f 172 waitSpiFree();
peu605 7:3dcb98ecf29f 173 deselectSlave();
peu605 7:3dcb98ecf29f 174 }
peu605 7:3dcb98ecf29f 175
peu605 7:3dcb98ecf29f 176 // use software loop, fast enough :-)
peu605 7:3dcb98ecf29f 177 void TFT_ILI9163C::writedata16burst(uint16_t d, int32_t len) {
peu605 7:3dcb98ecf29f 178
peu605 7:3dcb98ecf29f 179 len = len < 0 ? -len : len;
peu605 7:3dcb98ecf29f 180
peu605 7:3dcb98ecf29f 181 if (len > 0) {
peu605 7:3dcb98ecf29f 182 set16bitMode();
peu605 7:3dcb98ecf29f 183 setDataMode();
peu605 7:3dcb98ecf29f 184 selectSlave();
peu605 7:3dcb98ecf29f 185
peu605 7:3dcb98ecf29f 186 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 187 while (len--) {
peu605 7:3dcb98ecf29f 188 waitBufferFree();
peu605 7:3dcb98ecf29f 189 spi_ptr->DR = d;
peu605 7:3dcb98ecf29f 190 }
peu605 7:3dcb98ecf29f 191
peu605 7:3dcb98ecf29f 192 waitSpiFree();
peu605 7:3dcb98ecf29f 193 deselectSlave();
peu605 7:3dcb98ecf29f 194 }
peu605 7:3dcb98ecf29f 195 }
peu605 7:3dcb98ecf29f 196 #endif