zhangruoxu 发表于 2024-2-23 10:56:17

用GPIO模拟8080时序驱动st7796s屏幕, 花屏, 并且读 Read Display Pixel Format 错误


#include "bsp_include.h"



uint16_t LCD_RD_DATA(void)
{
    uint16_t t;


    gpio_init_type gpio_init_struct = {0};
    gpio_default_para_init(&gpio_init_struct);

    /*-- gpio configuration ------------------------------------------------------*/
    /* lcd data lines configuration */
    gpio_init_struct.gpio_pins = LCD_DATA0_PIN | LCD_DATA1_PIN | LCD_DATA2_PIN | LCD_DATA3_PIN |
                                 LCD_DATA4_PIN | LCD_DATA5_PIN | LCD_DATA6_PIN | LCD_DATA7_PIN;

    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init(GPIOA, &gpio_init_struct);




    /*// IO 转换为输入模式
    GPIOA->cfglr = 0x88888888; //PA0-7上拉输入.
    //GPIOA->cfghr=0x88888888; //PA8-15 上拉输入
    GPIOA->odt = 0x0000; //全部输出0*/

    LCD_CS_CLR;
    LCD_RS_SET;

    LCD_WR_SET;
    LCD_RD_CLR;
        //delay_us(2);
    t = DATAIN;

    delay_us(2);
    LCD_RD_SET;
    LCD_CS_SET;

    /*// IO 转换为输出模式
    GPIOA->cfglr = 0x11111111; //PA0-7通用推挽输出
    //GPIOA->cfghr=0x11111111; //PA8-15 通用推挽输出
    GPIOA->odt = 0xffff; //全部输出高*/

    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init(GPIOA, &gpio_init_struct);

    return t;
}

void LCD_WR_DATA(uint8_t data)
{
    LCD_CS_CLR;
    LCD_RS_SET;

    LCD_RD_SET;
    DATAOUT(data);
    LCD_WR_CLR;

    delay_us(1);
    LCD_WR_SET;
    LCD_CS_SET;
}

void LCD_WR_COMMAND(uint8_t command)
{
        LCD_CS_CLR;
    LCD_RS_CLR;

    LCD_RD_SET;
    DATAOUT(command);
    LCD_WR_CLR;

    delay_us(1);
    LCD_WR_SET;
    //LCD_CS_SET;
}

void LCD_SetBlock(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend)
{
    /* Set row coordinates */
    LCD_WR_COMMAND(0x2a);
    LCD_WR_DATA(xstart >> 8);
    LCD_WR_DATA(xstart);
    LCD_WR_DATA(xend >> 8);
    LCD_WR_DATA(xend);

    /* Set column coordinates */
    LCD_WR_COMMAND(0x2b);
    LCD_WR_DATA(ystart >> 8);
    LCD_WR_DATA(ystart);
    LCD_WR_DATA(yend >> 8);
    LCD_WR_DATA(yend);

    /* Enable write menory */
    LCD_WR_COMMAND(0x2c);

}

void LCD_WriteOnePoint(uint16_t color)
{
    LCD_WR_DATA(color >> 8);
    LCD_WR_DATA(color);
}

void LCD_WriteOneBlock(uint16_t *color, int size)
{
    for (int i = 0; i < size; i++)
    {
      //*(uint8_t*) XMC_LCD_DATA = color>>8;
      //*(uint8_t*) XMC_LCD_DATA = color;
      LCD_WR_DATA(color >> 8);
      LCD_WR_DATA(color);
    }
}
/**
* @briefThis function is write one point to LCD.
* @paramdata : the data to write.
* @retval None
*/


/**
* @briefThis function is draw point to LCD.
* @paramdata : the data to write.
* @retval None
*/
void LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
    LCD_SetBlock(x, y, x, y);
    LCD_WriteOnePoint(color);
}

/**
* @briefThis function is clear the LCD.
* @paramdata : the data to write.
* @retval None
*/
void LCD_Clear(uint16_t color)
{
    uint32_t i, total_Pixel;

    LCD_SetBlock(0, 0, LV_HOR_RES_MAX, LV_VER_RES_MAX);

    total_Pixel = LV_HOR_RES_MAX * LV_VER_RES_MAX;

    for (i = 0; i < total_Pixel; i++)
    {
      // *(uint8_t *) XMC_LCD_DATA = color >> 8;
      // *(uint8_t *) XMC_LCD_DATA = color;
      LCD_WR_DATA(color >> 8);
      LCD_WR_DATA(color);
    }
}


/**
* @briefconfigures the xmc and gpios to interface with the lcd.
*         this function must be called before any write/read operation
*         on the lcd.
* @paramnone
* @retval none
*/
void xmc_init(void)
{
    gpio_init_type gpio_init_struct = {0};

    /* enable the gpio clock */
    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
    crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
    //crm_periph_clock_enable(CRM__PERIPH_CLOCK, TRUE);

    crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
    gpio_pin_remap_config(SWJTAG_GMUX_010, TRUE);

    gpio_default_para_init(&gpio_init_struct);

        gpio_bits_reset(GPIOA, LCD_PWM_PIN);

    /*-- gpio configuration ------------------------------------------------------*/
    /* lcd data lines configuration */
    gpio_init_struct.gpio_pins = LCD_DATA0_PIN | LCD_DATA1_PIN | LCD_DATA2_PIN | LCD_DATA3_PIN |
                                 LCD_DATA4_PIN | LCD_DATA5_PIN | LCD_DATA6_PIN | LCD_DATA7_PIN | LCD_PWM_PIN;

    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init(GPIOA, &gpio_init_struct);

    gpio_bits_set(GPIOA, LCD_DATA0_PIN | LCD_DATA1_PIN | LCD_DATA2_PIN | LCD_DATA3_PIN |
                  LCD_DATA4_PIN | LCD_DATA5_PIN | LCD_DATA6_PIN | LCD_DATA7_PIN);

    /* lcd rs/cs/wr/rd reset lines configuration */
    gpio_init_struct.gpio_pins = LCD_WR_PIN | LCD_RS_PIN | LCD_CS_PIN | LCD_RD_PIN | LCD_RESET_PIN;
//    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
//    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
//    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
//    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init(GPIOB, &gpio_init_struct);
    gpio_bits_set(GPIOB, LCD_WR_PIN | LCD_RS_PIN | LCD_CS_PIN | LCD_RD_PIN | LCD_RESET_PIN);
}


static void ILI9341_REG_Config ( void )
{
        /*Power control B (CFh)*/
        LCD_WR_COMMAND ( 0xCF);
        LCD_WR_DATA ( 0x00);
        LCD_WR_DATA ( 0x81);
        LCD_WR_DATA ( 0x30);

        /*Power on sequence control (EDh) */

        LCD_WR_COMMAND ( 0xED );
        LCD_WR_DATA ( 0x64 );
        LCD_WR_DATA ( 0x03 );
        LCD_WR_DATA ( 0x12 );
        LCD_WR_DATA ( 0x81 );

        /*Driver timing control A (E8h) */

        LCD_WR_COMMAND ( 0xE8 );
        LCD_WR_DATA ( 0x85 );
        LCD_WR_DATA ( 0x10 );
        LCD_WR_DATA ( 0x78 );

        /*Power control A (CBh) */

        LCD_WR_COMMAND ( 0xCB );
        LCD_WR_DATA ( 0x39 );
        LCD_WR_DATA ( 0x2C );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x34 );
        LCD_WR_DATA ( 0x02 );

        /* Pump ratio control (F7h) */

        LCD_WR_COMMAND ( 0xF7 );
        LCD_WR_DATA ( 0x20 );

        /* Driver timing control B */

        LCD_WR_COMMAND ( 0xEA );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x00 );

        /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */

        LCD_WR_COMMAND ( 0xB1 );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x1B );

        /*Display Function Control (B6h) */

        LCD_WR_COMMAND ( 0xB6 );
        LCD_WR_DATA ( 0x0A );
        LCD_WR_DATA ( 0xA2 );

        /* Power Control 1 (C0h) */

        LCD_WR_COMMAND ( 0xC0 );
        LCD_WR_DATA ( 0x35 );

        /* Power Control 2 (C1h) */

        LCD_WR_COMMAND ( 0xC1 );
        LCD_WR_DATA ( 0x11 );

        /* VCOM Control 1 (C5h) */
        LCD_WR_COMMAND ( 0xC5 );
        LCD_WR_DATA ( 0x45 );
        LCD_WR_DATA ( 0x45 );

        /*VCOM Control 2 (C7h)*/
        LCD_WR_COMMAND ( 0xC7 );
        LCD_WR_DATA ( 0xA2 );

        /* Enable 3G (F2h) */
        LCD_WR_COMMAND ( 0xF2 );
        LCD_WR_DATA ( 0x00 );

        /* Gamma Set (26h) */
        LCD_WR_COMMAND ( 0x26 );
        LCD_WR_DATA ( 0x01 );


        /* Positive Gamma Correction */
        LCD_WR_COMMAND ( 0xE0 ); //Set Gamma
        LCD_WR_DATA ( 0x0F );
        LCD_WR_DATA ( 0x26 );
        LCD_WR_DATA ( 0x24 );
        LCD_WR_DATA ( 0x0B );
        LCD_WR_DATA ( 0x0E );
        LCD_WR_DATA ( 0x09 );
        LCD_WR_DATA ( 0x54 );
        LCD_WR_DATA ( 0xA8 );
        LCD_WR_DATA ( 0x46 );
        LCD_WR_DATA ( 0x0C );
        LCD_WR_DATA ( 0x17 );
        LCD_WR_DATA ( 0x09 );
        LCD_WR_DATA ( 0x0F );
        LCD_WR_DATA ( 0x07 );
        LCD_WR_DATA ( 0x00 );

        /* Negative Gamma Correction (E1h) */
        LCD_WR_COMMAND ( 0XE1 ); //Set Gamma
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x19 );
        LCD_WR_DATA ( 0x1B );
        LCD_WR_DATA ( 0x04 );
        LCD_WR_DATA ( 0x10 );
        LCD_WR_DATA ( 0x07 );
        LCD_WR_DATA ( 0x2A );
        LCD_WR_DATA ( 0x47 );
        LCD_WR_DATA ( 0x39 );
        LCD_WR_DATA ( 0x03 );
        LCD_WR_DATA ( 0x06 );
        LCD_WR_DATA ( 0x06 );
        LCD_WR_DATA ( 0x30 );
        LCD_WR_DATA ( 0x38 );
        LCD_WR_DATA ( 0x0F );

        /* memory access control set */

        LCD_WR_COMMAND ( 0x36 );
        LCD_WR_DATA ( 0xC8 );    /*竖屏左上角到 (起点)到右下角 (终点)扫描方式*/


        /* column address control set */
        LCD_WR_COMMAND ( 0x2A );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0xEF );

        /* page address control set */
        LCD_WR_COMMAND ( 0x2B );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x00 );
        LCD_WR_DATA ( 0x01 );
        LCD_WR_DATA ( 0x3F );

        /*Pixel Format Set (3Ah)*/
        LCD_WR_COMMAND ( 0x3a );
        LCD_WR_DATA ( 0x55 );

        /* Sleep Out (11h)*/
        LCD_WR_COMMAND ( 0x11 );
        delay_ms(10);

        /* Display ON (29h) */
        LCD_WR_COMMAND ( 0x29 );
}



void LCD_init(void)
{
    uint16_t i;

    xmc_init();

    gpio_bits_reset(GPIOB, LCD_RESET_PIN);
    delay_ms(10);

    gpio_bits_set(GPIOB, LCD_RESET_PIN);

    delay_ms(10);
    /* Reset LCD */
    LCD_RESET_HIGH;
    delay_ms(10);
    LCD_RESET_LOW;
    delay_ms(10);
    LCD_RESET_HIGH;
    delay_ms(10);

    /*Software Reset*/
    /*LCD_WR_COMMAND(0x01);
    delay_ms(20);

    //显示器型号STL3.5-180-318-K   驱动ICST7796S

    LCD_WR_COMMAND(0x36);
    LCD_WR_DATA(BIT5 | BIT3);

    LCD_WR_COMMAND(0x3a);
    LCD_WR_DATA(0x55);

        LCD_WR_COMMAND(0x11); //Exit Sleep
    delay_ms(10);

    LCD_WR_COMMAND(0x29); //display on
        delay_ms(1);*/


    ILI9341_REG_Config();

    //lcd->lcd_clear((uint16_t)(63488));   //先写白色
    //LCD_Clear(WHITE); //先写白色
        LCD_Clear(0xffff);
        //LCD_Clear((uint16_t)0);

    LCD_WR_COMMAND(0x0c);
    LCD_RD_DATA();
    Printf("....%x\n", (char)LCD_RD_DATA());

    gpio_bits_set(GPIOA, LCD_PWM_PIN);

//    Printf("xmc\r\n");
//    delay_ms(1);

//    LCD_WR_COMMAND(0x0c);
//    LCD_RD_DATA();
//    u16 tmp = LCD_RD_DATA();
//    Printf("command 0x0c, input data: 0x%x\r\n", tmp);

//    LCD_WR_COMMAND(0XD3);
//    LCD_RD_DATA(); //dummy read
//    u16 id = LCD_RD_DATA(); //读到0X00
//    id = LCD_RD_DATA(); //读取0X93
//    id <<= 8;
//    id |= LCD_RD_DATA(); //读取0X41

//    Printf("command 0xD3, input data: 0x%x\r\n", id);
}





eric2013 发表于 2024-2-23 13:48:42

楼主这个代码读取显示屏ID正常吗,ID读取正常了,后面就好弄。

zhangruoxu 发表于 2024-2-23 14:03:17

eric2013 发表于 2024-2-23 13:48
楼主这个代码读取显示屏ID正常吗,ID读取正常了,后面就好弄。

读取的都是ffff

eric2013 发表于 2024-2-24 00:25:02

zhangruoxu 发表于 2024-2-23 14:03
读取的都是ffff

那不正常,优先解决读取ID问题。

benny 发表于 2024-2-26 12:30:44

注意以下两点:
1、你用的是8080接口,那就是传数据是用的16bit的,不应该用8bit的传数据方式。
2、SPI方式传数据,图片格式生成的是高位在前的,8080接口生成的图片格式不能用高位在前的方式生成,不然花屏。
除了以上两点,其他代码屏厂家的驱动基本都可以直接套用

zhangruoxu 发表于 2024-2-26 15:38:15

benny 发表于 2024-2-26 12:30
注意以下两点:
1、你用的是8080接口,那就是传数据是用的16bit的,不应该用8bit的传数据方式。
2、SPI方 ...

感谢, 现在的问题是 st7796s 读不出id号
页: [1]
查看完整版本: 用GPIO模拟8080时序驱动st7796s屏幕, 花屏, 并且读 Read Display Pixel Format 错误