123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- /*!
- \file gd32f450z_lcd_eval.c
- \brief firmware functions to manage LCD
- */
- /*
- Copyright (C) 2016 GigaDevice
- 2016-10-19, V1.0.0, firmware for GD32F450Z
- */
- #include "gd32f450z_lcd_eval.h"
- static void delay(uint32_t time);
- /*!
- \brief enable the LCD
- \param[in] none
- \param[out] none
- \retval none
- */
- void lcd_enable(void)
- {
- gpio_bit_set(LCD_CS_GPIO_PORT, LCD_CS_PIN);
- }
- /*!
- \brief disable the LCD
- \param[in] none
- \param[out] none
- \retval none
- */
- void lcd_disable(void)
- {
- gpio_bit_reset(LCD_CS_GPIO_PORT, LCD_CS_PIN);
- }
- /*!
- \brief configure the LCD control line
- \param[in] none
- \param[out] none
- \retval none
- */
- void lcd_ctrl_line_config(void)
- {
- /* enable GPIOs clock*/
- rcu_periph_clock_enable(LCD_CS_GPIO_CLK);
- rcu_periph_clock_enable(LCD_RS_GPIO_CLK);
- /* configure LCD_CS_GPIO_PORT(PD11) and LCD_RS_GPIO_PORT(PE3) */
- gpio_mode_set(LCD_CS_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_CS_PIN);
- gpio_output_options_set(LCD_CS_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,LCD_CS_PIN);
- gpio_mode_set(LCD_RS_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_RS_PIN);
- gpio_output_options_set(LCD_RS_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,LCD_RS_PIN);
- /* set the chip select pin */
- lcd_ctrl_line_set(LCD_CS_GPIO_PORT, LCD_CS_PIN);
- }
- /*!
- \brief set the LCD control line
- \param[in] gpiox: control line GPIO
- \arg LCD_CS_GPIO_PORT: LCD chip select GPIO
- \arg LCD_RS_GPIO_PORT: LCD register/RAM selection GPIO
- \param[in] gpiopin: control line pin
- \arg LCD_CS_PIN: LCD chip select pin
- \arg LCD_RS_PIN: LCD register/RAM selection pin
- \param[out] none
- \retval none
- */
- void lcd_ctrl_line_set(uint32_t gpiox, uint16_t gpiopin)
- {
- gpio_bit_set(gpiox, gpiopin);
- }
- /*!
- \brief reset the LCD control line
- \param[in] gpiox: control line GPIO
- \arg LCD_CS_GPIO_PORT: LCD chip select GPIO
- \arg LCD_RS_GPIO_PORT: LCD register/RAM selection GPIO
- \param[in] gpiopin: control line pin
- \arg LCD_CS_PIN: LCD chip select pin
- \arg LCD_RS_PIN: LCD register/RAM selection pin
- \param[out] none
- \retval none
- */
- void lcd_ctrl_line_reset(uint32_t gpiox, uint16_t gpiopin)
- {
- gpio_bit_reset(gpiox, gpiopin);
- }
- /*!
- \brief configure the LCD SPI and it's GPIOs
- \param[in] none
- \param[out] none
- \retval none
- */
- void lcd_spi_config(void)
- {
- spi_parameter_struct spi_init_struct;
- rcu_periph_clock_enable(RCU_GPIOG);
- rcu_periph_clock_enable(RCU_SPI5);
- /* configure SPI5_SCK(PG13) and SPI5_MOSI(PG14) */
- gpio_af_set(GPIOG,GPIO_AF_5,GPIO_PIN_13);
- gpio_af_set(GPIOG,GPIO_AF_5,GPIO_PIN_14);
- gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_14);
- gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_14);
- spi_i2s_deinit(SPI5);
- if(0 == (SPI_CTL0(LCD_SPI) & SPI_CTL0_SPIEN)){
- spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
- spi_init_struct.device_mode = SPI_MASTER;
- spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
- spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
- spi_init_struct.nss = SPI_NSS_SOFT;
- spi_init_struct.prescale = SPI_PSC_16;
- spi_init_struct.endian = SPI_ENDIAN_MSB;
- spi_init(LCD_SPI, &spi_init_struct);
- spi_enable(LCD_SPI);
- }
- }
- /*!
- \brief write command to select LCD register
- \param[in] lcd_register: the address of the selected register
- \param[out] none
- \retval none
- */
- void lcd_command_write(uint8_t lcd_register)
- {
- /* reset LCD_RS to send command */
- lcd_ctrl_line_reset(LCD_RS_GPIO_PORT, LCD_RS_PIN);
- /* reset LCD control line and send command */
- lcd_disable();
- while(RESET == spi_i2s_flag_get(LCD_SPI, SPI_FLAG_TBE)) ;
- spi_i2s_data_transmit(LCD_SPI, lcd_register);
- /* wait until a data is sent */
- while(RESET != spi_i2s_flag_get(LCD_SPI, SPI_FLAG_TRANS));
- lcd_enable();
- }
- /*!
- \brief write data to select LCD register
- \param[in] value: the value that will be written to the selected register
- \param[out] none
- \retval none
- */
- void lcd_data_write(uint8_t value)
- {
- /* set LCD_RS to send data */
- lcd_ctrl_line_set(LCD_RS_GPIO_PORT, LCD_RS_PIN);
- /* reset LCD control line and send data */
- lcd_disable();
- while(RESET == spi_i2s_flag_get(LCD_SPI, SPI_FLAG_TBE)) ;
- spi_i2s_data_transmit(LCD_SPI, value);
- /* wait until a data is sent */
- while(RESET != spi_i2s_flag_get(LCD_SPI, SPI_FLAG_TRANS)) ;
- lcd_enable();
- }
- /*!
- \brief configure the LCD based on the power on sequence
- \param[in] none
- \param[out] none
- \retval none
- */
- void lcd_power_on(void)
- {
- lcd_command_write(0x11);
- delay(120);
- lcd_command_write(0x36);
- lcd_data_write(0x48);
- lcd_command_write(0x3A);
- lcd_data_write(0x55);
- lcd_command_write(0xB4);
- lcd_data_write(0x11);
- lcd_command_write(0xB3);
- lcd_data_write(0x00);
- lcd_data_write(0x00);
- lcd_data_write(0x00);
- lcd_data_write(0x20);
- lcd_command_write(0xC0);
- lcd_data_write(0x10);
- lcd_data_write(0x3B);
- lcd_data_write(0x00);
- lcd_data_write(0x12);
- lcd_data_write(0x01);
- lcd_command_write(0xC5);
- lcd_data_write(0x07);
- lcd_command_write(0xC8);
- lcd_data_write(0x01 );
- lcd_data_write(0x36);
- lcd_data_write(0x00);
- lcd_data_write(0x02);
- lcd_data_write(0x00);
- lcd_data_write(0x1C);
- lcd_data_write(0x77);
- lcd_data_write(0x14);
- lcd_data_write(0x67);
- lcd_data_write(0x20);
- lcd_data_write(0x0E);
- lcd_data_write(0x00);
- lcd_command_write(0xD0);
- lcd_data_write(0x44);
- lcd_data_write(0x41 );
- lcd_data_write(0x08);
- lcd_data_write(0xC2);
- lcd_command_write(0xD1);
- lcd_data_write(0x50);
- lcd_data_write(0x11);
- lcd_command_write(0xD2);
- lcd_data_write(0x05);
- lcd_data_write(0x12);
- lcd_command_write(0xC6);
- lcd_data_write(0x83);
- lcd_command_write(0x29);
- delay(5);
- }
- /**
- * @brief New Version 3.5" TFT RGB Hardware needs add this initilize funtion ---By xufei 2016.10.21
- Modified by GAO HAIYANG, test pass, 17, Nov, 2016
- * @param None
- * @retval None
- */
- void lcd_power_on3(void)
- {
- lcd_command_write(0xC0);//power control1 command/w/
- lcd_data_write(0x0A); // P-Gamma level//4.1875v
- lcd_data_write(0x0A); // N-Gamma level
- lcd_command_write(0xC1); // BT & VC Setting//power contrl2 command/w/
- lcd_data_write(0x41);
- lcd_data_write(0x07); // VCI1 = 2.5V
- lcd_command_write(0xC2); // DC1.DC0 Setting//power control3 for normal mode
- lcd_data_write(0x33);
- lcd_command_write(0xC5);//VCOM control
- lcd_data_write(0x00); //NV memory is not programmed
- lcd_data_write(0x42); // VCM Setting
- lcd_data_write(0x80); // VCM Register Enable
- lcd_command_write(0xB0); //interface mode control //Polarity Setting
- lcd_data_write(0x02);
- lcd_command_write(0xB1);//frame rate control for normal mode
- lcd_data_write(0xB0); // Frame Rate Setting//70 frame per second//no division for internal clocks
- lcd_data_write(0x11);//17 clocks per line period for idle mode at cpu interface
- lcd_command_write(0xB4);//dispaly inversion control
- lcd_data_write(0x00); // disable Z-inversion , column inversion
- lcd_command_write(0xB6); //display function control// RM.DM Setting
- lcd_data_write(0x70);////0xF0
- lcd_data_write(0x02);//direction of gate scan: G1->G480 one by one, source scan: S1->S960, scan cycle if interval scan in non-display area
- lcd_data_write(0x3B); // number of lines to drive LCD: 8*(0x3C) = 480
- lcd_command_write(0xB7); // Entry Mode
- lcd_data_write(0x07); // disable low voltage detection, normal display,
- lcd_command_write(0xF0); // Enter ENG , must be set before gamma setting
- lcd_data_write(0x36);
- lcd_data_write(0xA5);
- lcd_data_write(0xD3);
- lcd_command_write(0xE5); // Open gamma function , must be set before gamma setting
- lcd_data_write(0x80);
- lcd_command_write(0xE5); // Page 1
- lcd_data_write(0x01);
- lcd_command_write(0XB3); // WEMODE=0(Page 1) , pixels over window setting will be ignored.//frame rate control in partial mode/full colors
- lcd_data_write(0x00);
- lcd_command_write(0xE5); // Page 0
- lcd_data_write(0x00);
- lcd_command_write(0xF0); // Exit ENG , must be set before gamma setting
- lcd_data_write(0x36);
- lcd_data_write(0xA5);
- lcd_data_write(0x53);
- lcd_command_write(0xE0); // Gamma setting
- //y fine adjustment register for positive polarity
- lcd_data_write(0x00);
- lcd_data_write(0x35);
- lcd_data_write(0x33);
- //y gradient adjustment register for positive polarity
- lcd_data_write(0x00);
- //y amplitude adjustment register for positive polarity
- lcd_data_write(0x00);
- lcd_data_write(0x00);
- //y fine adjustment register for negative polarity
- lcd_data_write(0x00);
- lcd_data_write(0x35);
- lcd_data_write(0x33);
- //y gradient adjustment register for negative polarity
- lcd_data_write(0x00);
- //y amplitude adjustment register for negative polarity
- lcd_data_write(0x00);
- lcd_data_write(0x00);
- lcd_command_write(0x36); // memory data access control //
- lcd_data_write(0x48);//
- lcd_command_write(0x3A); // interface pixel format setting
- lcd_data_write(0x55);//16-bits
- lcd_command_write(0x11); // Exit sleep mode
- lcd_command_write(0x29); // Display on
- delay(10);
- }
- /*!
- \brief insert a delay time
- \param[in] time: delay time length
- \param[out] none
- \retval none
- */
- static void delay(uint32_t time)
- {
- uint32_t timecount = time;
- while(0 != timecount--);
- }
|