Andrew Reed
/
CITY1082-TFT-basic
Basic TFT display program for CITY082
Diff: tft_interface/cy8ckit_028_tft.cpp
- Revision:
- 1:402b32a1025f
diff -r 6beb6f498640 -r 402b32a1025f tft_interface/cy8ckit_028_tft.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tft_interface/cy8ckit_028_tft.cpp Tue Nov 19 10:04:48 2019 +0000 @@ -0,0 +1,398 @@ +/***************************************************************************//** +* \file DisplayInterface.h +* \version 1.0 +* +* \brief +* Objective: +* This is display software i8080 interface source file +* +******************************************************************************** +* \copyright +* Copyright 2018-2019 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + + +#include "cy8ckit_028_tft.h" +#include <mbed_wait_api.h> +#include "mbed.h" +#include "PortInOut.h" + + +DigitalInOut LCD_REG0(P9_0); +DigitalInOut LCD_REG1(P9_1); +DigitalInOut LCD_REG2(P9_2); +DigitalInOut LCD_REG3(P9_4); +DigitalInOut LCD_REG4(P9_5); +DigitalInOut LCD_REG5(P0_2); +DigitalInOut LCD_REG6(P13_0); +DigitalInOut LCD_REG7(P13_1); +PortInOut P0(Port0, 0x04); +PortInOut P9(Port9, 0x37); +PortInOut P13(Port13, 0x03); + +DigitalOut LCD_NWR(P12_0); +DigitalOut LCD_DC(P12_1); +DigitalOut LCD_RESET(P12_2); +DigitalOut LCD_NRD(P12_3); + +/******************************************************************************* +* Function Name: DataWrite +****************************************************************************/ +/** +* +* \brief +* Writes one byte of data to the software i8080 interface. +* +* \details +* This function: +* - Writes data to the data bus +* - Sends low pulse to the LCD_NWR line to write data +* +* Changed from individual bit banging to port masked writes to +* P9[5,4,2,1,0], P13[1,0], P0[2] to optimise slightly +* +* \todo +* All this should be replaced with a udb register to save all the shifting +* and individual bit writing. +* +*******************************************************************************/ +void DataWrite(U8 data) +{ +// LCD_REG0 = (data & 0x01); +// LCD_REG1 = ((data>>1) & 0x01); +// LCD_REG2 = ((data>>2) & 0x01); +// LCD_REG3 = ((data>>3) & 0x01); +// LCD_REG4 = ((data>>4) & 0x01); + +/* read the appropriate port and only change the bits we need to then write the + * affected bits back to the port retaining any unaffected bit values + */ + int pbyte = P9.read(); + int bit012 = (data & 0x07); + int bit34 = (data & 0x18) << 1; + pbyte = (pbyte & 0xc8) | bit34 | bit012; + P9.write(pbyte); +// LCD_REG5 = ((data>>5) & 0x01); + pbyte = P0.read(); + int bit5 = (data & 0x20) >> 3 ; + pbyte = (pbyte & 0xfb) | bit5 ; + P0.write(pbyte); + +// LCD_REG6 = ((data>>6) & 0x01); +// LCD_REG7 = ((data>>7) & 0x01); + pbyte = P13.read(); + int bit67 = (data & 0xc0) >> 6 ; + pbyte = (pbyte & 0xfc) | bit67 ; + P13.write(pbyte); + LCD_NWR = 0u; + LCD_NWR = 1u; + +} + + +/******************************************************************************* +* Function Name: DataRead +****************************************************************************//** +* +* \brief +* Reads one byte of data from the software i8080 interface. +* +* \details +* This function: +* - Changes data bus GPIO pins drive mode to digital Hi-Z with enabled input +* buffer +* - Sends low pulse to LCD_NRD line to read data +* - Reads data from the data bus +* - Sends low pulse to the LCD_NWR line to write data +* - Changes data bus GPIO pins drive mode back to to Strong Drive mode +* +* \todo +* All this should be replaced with a udb register to save all the shifting +* and individual bit reading. +* +*******************************************************************************/ +U8 DataRead(void) +{ + U8 data = 0u; + + /* enable input */ + LCD_REG0.input(); + LCD_REG1.input(); + LCD_REG2.input(); + LCD_REG3.input(); + LCD_REG4.input(); + LCD_REG5.input(); + LCD_REG6.input(); + LCD_REG7.input(); + + LCD_NRD = 0u; // Pulse read line low then read the data port + + data = (U8)LCD_REG0.read(); + data |= (U8)LCD_REG1.read()<<1; + data |= (U8)LCD_REG2.read()<<2; + data |= (U8)LCD_REG3.read()<<3; + data |= (U8)LCD_REG4.read()<<4; + data |= (U8)LCD_REG5.read()<<5; + data |= (U8)LCD_REG6.read()<<6; + data |= (U8)LCD_REG7.read()<<7; + + LCD_NRD = 1u; // Raise the read line and then go back to output port + + LCD_REG0.output(); + LCD_REG1.output(); + LCD_REG2.output(); + LCD_REG3.output(); + LCD_REG4.output(); + LCD_REG5.output(); + LCD_REG6.output(); + LCD_REG7.output(); + + return data; +} + + +/******************************************************************************* +* Function Name: DisplayIntf_Init +****************************************************************************//** +* +* \brief +* Initializes software i8080 interface. +* +* \details +* This function: +* - Initializes interface GPIO pins +* +*******************************************************************************/ +void DisplayIntf_Init(void) +{ + /* All pins are initialized by the Device Configurator. */ + LCD_RESET = 1u; + LCD_NRD = 1u; + LCD_NWR = 1u; + LCD_DC = 0u; + LCD_REG0.output(); + LCD_REG1.output(); + LCD_REG2.output(); + LCD_REG3.output(); + LCD_REG4.output(); + LCD_REG5.output(); + LCD_REG6.output(); + LCD_REG7.output(); + wait_ms(20); + LCD_RESET = 0u; + wait_ms(100); + + LCD_RESET = 1u; + wait_ms(100); + + DisplayIntf_Write8_A0(0x28); + DisplayIntf_Write8_A0(0x11); /* Exit Sleep mode */ + wait_ms(100); + DisplayIntf_Write8_A0(0x36); + DisplayIntf_Write8_A1(0xA0); /* MADCTL: memory data access control */ + DisplayIntf_Write8_A0(0x3A); + DisplayIntf_Write8_A1(0x65); /* COLMOD: Interface Pixel format */ + DisplayIntf_Write8_A0(0xB2); + DisplayIntf_Write8_A1(0x0C); + DisplayIntf_Write8_A1(0x0C); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x33); + DisplayIntf_Write8_A1(0x33); /* PORCTRK: Porch setting */ + DisplayIntf_Write8_A0(0xB7); + DisplayIntf_Write8_A1(0x35); /* GCTRL: Gate Control */ + DisplayIntf_Write8_A0(0xBB); + DisplayIntf_Write8_A1(0x2B); /* VCOMS: VCOM setting */ + DisplayIntf_Write8_A0(0xC0); + DisplayIntf_Write8_A1(0x2C); /* LCMCTRL: LCM Control */ + DisplayIntf_Write8_A0(0xC2); + DisplayIntf_Write8_A1(0x01); + DisplayIntf_Write8_A1(0xFF); /* VDVVRHEN: VDV and VRH Command Enable */ + DisplayIntf_Write8_A0(0xC3); + DisplayIntf_Write8_A1(0x11); /* VRHS: VRH Set */ + DisplayIntf_Write8_A0(0xC4); + DisplayIntf_Write8_A1(0x20); /* VDVS: VDV Set */ + DisplayIntf_Write8_A0(0xC6); + DisplayIntf_Write8_A1(0x0F); /* FRCTRL2: Frame Rate control in normal mode */ + DisplayIntf_Write8_A0(0xD0); + DisplayIntf_Write8_A1(0xA4); + DisplayIntf_Write8_A1(0xA1); /* PWCTRL1: Power Control 1 */ + DisplayIntf_Write8_A0(0xE0); + DisplayIntf_Write8_A1(0xD0); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x05); + DisplayIntf_Write8_A1(0x0E); + DisplayIntf_Write8_A1(0x15); + DisplayIntf_Write8_A1(0x0D); + DisplayIntf_Write8_A1(0x37); + DisplayIntf_Write8_A1(0x43); + DisplayIntf_Write8_A1(0x47); + DisplayIntf_Write8_A1(0x09); + DisplayIntf_Write8_A1(0x15); + DisplayIntf_Write8_A1(0x12); + DisplayIntf_Write8_A1(0x16); + DisplayIntf_Write8_A1(0x19); /* PVGAMCTRL: Positive Voltage Gamma control */ + DisplayIntf_Write8_A0(0xE1); + DisplayIntf_Write8_A1(0xD0); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x05); + DisplayIntf_Write8_A1(0x0D); + DisplayIntf_Write8_A1(0x0C); + DisplayIntf_Write8_A1(0x06); + DisplayIntf_Write8_A1(0x2D); + DisplayIntf_Write8_A1(0x44); + DisplayIntf_Write8_A1(0x40); + DisplayIntf_Write8_A1(0x0E); + DisplayIntf_Write8_A1(0x1C); + DisplayIntf_Write8_A1(0x18); + DisplayIntf_Write8_A1(0x16); + DisplayIntf_Write8_A1(0x19); /* NVGAMCTRL: Negative Voltage Gamma control */ + DisplayIntf_Write8_A0(0x2B); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0xEF); /* Y address set */ + DisplayIntf_Write8_A0(0x2A); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x00); + DisplayIntf_Write8_A1(0x01); + DisplayIntf_Write8_A1(0x3F); /* X address set */ + wait_ms(10); + DisplayIntf_Write8_A0(0x29); + + +} + + +/******************************************************************************* +* Function Name: DisplayIntf_Write8_A0 +****************************************************************************//** +* +* \brief +* Writes one byte of data to the software i8080 interface with the LCD_DC pin +* set to 0 +* +* \details +* This function: +* - Sets LCD_DC pin to 0 +* - Writes one data byte +* +*******************************************************************************/ +void DisplayIntf_Write8_A0(U8 data) +{ + LCD_DC = 0u; + DataWrite(data); +} + + +/******************************************************************************* +* Function Name: DisplayIntf_Write8_A1 +****************************************************************************//** +* +* \brief +* Writes one byte of data to the software i8080 interface with the LCD_DC pin +* set to 1 +* +* \details +* This function: +* - Sets LCD_DC pin to 1 +* - Writes one data byte +* +*******************************************************************************/ +void DisplayIntf_Write8_A1(U8 data) +{ + LCD_DC = 1u; + DataWrite(data); +} + + +/******************************************************************************* +* Function Name: DisplayIntf_WriteM8_A1 +****************************************************************************//** +* +* \brief +* Writes multiple bytes of data to the software i8080 interface with the LCD_DC +* pin set to 1 +* +* \details +* This function: +* - Sets LCD_DC pin to 1 +* - Writes data bytes +* +*******************************************************************************/ +void DisplayIntf_WriteM8_A1(U8 data[], int num) +{ + int i = 0; + + LCD_DC = 1u; + + for(i = 0; i < num; i++) + { + DataWrite(data[i]); + } +} + + +/******************************************************************************* +* Function Name: DisplayIntf_Read8_A1 +****************************************************************************//** +* +* \brief +* Reads one byte of data from the software i8080 interface with the LCD_DC pin +* set to 1 +* +* \details +* This function: +* - Sets LCD_DC pin to 1 +* - Reads one data byte +* +*******************************************************************************/ +U8 DisplayIntf_Read8_A1(void) +{ + LCD_DC = 1u; + return DataRead(); +} + + +/******************************************************************************* +* Function Name: DisplayIntf_ReadM8_A1 +****************************************************************************//** +* +* \brief +* Reads multiple bytes of data from the software i8080 interface with the LCD_DC +* pin set to 1 +* +* \details +* This function: +* - Sets LCD_DC pin to 1 +* - Reads data bytes +* +*******************************************************************************/ +void DisplayIntf_ReadM8_A1(U8 data[], int num) +{ + int i = 0; + + LCD_DC = 1u; + + for(i = 0; i < num; i++) + { + data[i] = DataRead(); + } +} + + +/* [] END OF FILE */ + +