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(__F302R8_SOFT__)
peu605 7:3dcb98ecf29f 3
peu605 7:3dcb98ecf29f 4 /**
peu605 7:3dcb98ecf29f 5 * TFT_ILI9163C library for ST Nucleo F302R8 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 }
peu605 7:3dcb98ecf29f 55
peu605 7:3dcb98ecf29f 56 inline void TFT_ILI9163C::selectSlave() {
peu605 7:3dcb98ecf29f 57 cs_port_reg->BSRRH = cs_reg_mask; // Use BSRR register
peu605 7:3dcb98ecf29f 58 }
peu605 7:3dcb98ecf29f 59
peu605 7:3dcb98ecf29f 60 inline void TFT_ILI9163C::deselectSlave() {
peu605 7:3dcb98ecf29f 61 cs_port_reg->BSRRL = cs_reg_mask;
peu605 7:3dcb98ecf29f 62 }
peu605 7:3dcb98ecf29f 63
peu605 7:3dcb98ecf29f 64 inline void TFT_ILI9163C::setCommandMode() {
peu605 7:3dcb98ecf29f 65 dc_port_reg->BSRRH = dc_reg_mask;
peu605 7:3dcb98ecf29f 66 }
peu605 7:3dcb98ecf29f 67
peu605 7:3dcb98ecf29f 68 inline void TFT_ILI9163C::setDataMode() {
peu605 7:3dcb98ecf29f 69 dc_port_reg->BSRRL = dc_reg_mask;
peu605 7:3dcb98ecf29f 70 }
peu605 7:3dcb98ecf29f 71
peu605 7:3dcb98ecf29f 72 inline void TFT_ILI9163C::waitSpiFree() {
peu605 7:3dcb98ecf29f 73 while (*bb_spi_txe == 0);
peu605 7:3dcb98ecf29f 74 while (*bb_spi_bsy != 0);
peu605 7:3dcb98ecf29f 75 }
peu605 7:3dcb98ecf29f 76
peu605 7:3dcb98ecf29f 77 inline void TFT_ILI9163C::waitBufferFree() {
peu605 7:3dcb98ecf29f 78 while (*bb_spi_txe == 0);
peu605 7:3dcb98ecf29f 79 }
peu605 7:3dcb98ecf29f 80
peu605 7:3dcb98ecf29f 81
peu605 7:3dcb98ecf29f 82 inline void TFT_ILI9163C::set8bitMode() {
peu605 7:3dcb98ecf29f 83
peu605 7:3dcb98ecf29f 84 *bb_spi_spe = 0;
peu605 7:3dcb98ecf29f 85 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 86
peu605 7:3dcb98ecf29f 87 uint16_t tmp = spi_ptr->CR2;
peu605 7:3dcb98ecf29f 88 tmp &= ~SPI_CR2_DS;
peu605 7:3dcb98ecf29f 89 tmp |= SPI_DATASIZE_8BIT;
peu605 7:3dcb98ecf29f 90 spi_ptr->CR2 = tmp;
peu605 7:3dcb98ecf29f 91
peu605 7:3dcb98ecf29f 92 *bb_spi_spe = 1;
peu605 7:3dcb98ecf29f 93 }
peu605 7:3dcb98ecf29f 94
peu605 7:3dcb98ecf29f 95 inline void TFT_ILI9163C::set16bitMode() {
peu605 7:3dcb98ecf29f 96
peu605 7:3dcb98ecf29f 97 *bb_spi_spe = 0;
peu605 7:3dcb98ecf29f 98 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 99
peu605 7:3dcb98ecf29f 100 uint16_t tmp = spi_ptr->CR2;
peu605 7:3dcb98ecf29f 101 tmp &= ~SPI_CR2_DS;
peu605 7:3dcb98ecf29f 102 tmp |= SPI_DATASIZE_16BIT;
peu605 7:3dcb98ecf29f 103 spi_ptr->CR2 = tmp;
peu605 7:3dcb98ecf29f 104
peu605 7:3dcb98ecf29f 105 *bb_spi_spe = 1;
peu605 7:3dcb98ecf29f 106 }
peu605 7:3dcb98ecf29f 107
peu605 7:3dcb98ecf29f 108 void TFT_ILI9163C::writecommand(uint8_t c){
peu605 7:3dcb98ecf29f 109
peu605 7:3dcb98ecf29f 110 set8bitMode();
peu605 7:3dcb98ecf29f 111 setCommandMode();
peu605 7:3dcb98ecf29f 112 selectSlave();
peu605 7:3dcb98ecf29f 113
peu605 7:3dcb98ecf29f 114 // Strange behavior :-(
peu605 7:3dcb98ecf29f 115 // Data packing RM0365 P.816
peu605 7:3dcb98ecf29f 116 // When the data frame size fits into one byte (less than or equal to 8 bits), data packing is
peu605 7:3dcb98ecf29f 117 // used automatically when any read or write 16-bit access is performed on the SPIx_DR register.
peu605 7:3dcb98ecf29f 118
peu605 7:3dcb98ecf29f 119 // Force 8-bit access to the data register
peu605 7:3dcb98ecf29f 120 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 121 uint8_t *p_spi_dr = (uint8_t*) &spi_ptr->DR;
peu605 7:3dcb98ecf29f 122 *p_spi_dr = (uint8_t) c;
peu605 7:3dcb98ecf29f 123
peu605 7:3dcb98ecf29f 124 waitSpiFree();
peu605 7:3dcb98ecf29f 125 deselectSlave();
peu605 7:3dcb98ecf29f 126 }
peu605 7:3dcb98ecf29f 127
peu605 7:3dcb98ecf29f 128
peu605 7:3dcb98ecf29f 129 void TFT_ILI9163C::writedata(uint8_t c){
peu605 7:3dcb98ecf29f 130
peu605 7:3dcb98ecf29f 131 set8bitMode();
peu605 7:3dcb98ecf29f 132 setDataMode();
peu605 7:3dcb98ecf29f 133 selectSlave();
peu605 7:3dcb98ecf29f 134
peu605 7:3dcb98ecf29f 135 // Force 8-bit access to the data register
peu605 7:3dcb98ecf29f 136 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 137 uint8_t *p_spi_dr = (uint8_t*) &spi_ptr->DR;
peu605 7:3dcb98ecf29f 138 *p_spi_dr = (uint8_t) c;
peu605 7:3dcb98ecf29f 139
peu605 7:3dcb98ecf29f 140 waitSpiFree();
peu605 7:3dcb98ecf29f 141 deselectSlave();
peu605 7:3dcb98ecf29f 142 }
peu605 7:3dcb98ecf29f 143
peu605 7:3dcb98ecf29f 144
peu605 7:3dcb98ecf29f 145 void TFT_ILI9163C::writedata16(uint16_t d){
peu605 7:3dcb98ecf29f 146
peu605 7:3dcb98ecf29f 147 set16bitMode();
peu605 7:3dcb98ecf29f 148 setDataMode();
peu605 7:3dcb98ecf29f 149 selectSlave();
peu605 7:3dcb98ecf29f 150
peu605 7:3dcb98ecf29f 151 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 152 spi_ptr->DR = d;
peu605 7:3dcb98ecf29f 153
peu605 7:3dcb98ecf29f 154 waitSpiFree();
peu605 7:3dcb98ecf29f 155 deselectSlave();
peu605 7:3dcb98ecf29f 156 }
peu605 7:3dcb98ecf29f 157
peu605 7:3dcb98ecf29f 158
peu605 7:3dcb98ecf29f 159 void TFT_ILI9163C::writedata32(uint16_t d1, uint16_t d2){
peu605 7:3dcb98ecf29f 160
peu605 7:3dcb98ecf29f 161 set16bitMode();
peu605 7:3dcb98ecf29f 162 setDataMode();
peu605 7:3dcb98ecf29f 163 selectSlave();
peu605 7:3dcb98ecf29f 164
peu605 7:3dcb98ecf29f 165 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 166 spi_ptr->DR = d1;
peu605 7:3dcb98ecf29f 167 waitBufferFree();
peu605 7:3dcb98ecf29f 168 spi_ptr->DR = d2;
peu605 7:3dcb98ecf29f 169
peu605 7:3dcb98ecf29f 170 waitSpiFree();
peu605 7:3dcb98ecf29f 171 deselectSlave();
peu605 7:3dcb98ecf29f 172 }
peu605 7:3dcb98ecf29f 173
peu605 7:3dcb98ecf29f 174 // use software loop, fast enough :-)
peu605 7:3dcb98ecf29f 175 void TFT_ILI9163C::writedata16burst(uint16_t d, int32_t len) {
peu605 7:3dcb98ecf29f 176
peu605 7:3dcb98ecf29f 177 len = len < 0 ? -len : len;
peu605 7:3dcb98ecf29f 178
peu605 7:3dcb98ecf29f 179 if (len > 0) {
peu605 7:3dcb98ecf29f 180 set16bitMode();
peu605 7:3dcb98ecf29f 181 setDataMode();
peu605 7:3dcb98ecf29f 182 selectSlave();
peu605 7:3dcb98ecf29f 183
peu605 7:3dcb98ecf29f 184 SPI_TypeDef *spi_ptr = (SPI_TypeDef*) _spi.spi;
peu605 7:3dcb98ecf29f 185 while (len--) {
peu605 7:3dcb98ecf29f 186 waitBufferFree();
peu605 7:3dcb98ecf29f 187 spi_ptr->DR = d;
peu605 7:3dcb98ecf29f 188 }
peu605 7:3dcb98ecf29f 189
peu605 7:3dcb98ecf29f 190 waitSpiFree();
peu605 7:3dcb98ecf29f 191 deselectSlave();
peu605 7:3dcb98ecf29f 192 }
peu605 7:3dcb98ecf29f 193 }
peu605 7:3dcb98ecf29f 194
peu605 7:3dcb98ecf29f 195 #endif