for Arduino TFT LCD Screen 160x128
Dependents: TFTLCDSCREEN Pong_ILI9163C
Fork of TFT_ILI9163C by
TFT_ILI9163C_F411RE_SOFT.cpp@12:f0799be044ff, 2016-03-04 (annotated)
- 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?
User | Revision | Line number | New 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 |