硬汉嵌入式论坛

 找回密码
 立即注册
查看: 278|回复: 5
收起左侧

[有问必答] 用GPIO模拟8080时序驱动st7796s屏幕, 花屏, 并且读 Read Display Pixel Format 错误

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2024-2-23 10:56:17 | 显示全部楼层 |阅读模式

#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[i]>>8;
        //*(uint8_t*) XMC_LCD_DATA = color[i];
        LCD_WR_DATA(color[i] >> 8);
        LCD_WR_DATA(color[i]);
    }
}
/**
  * @brief  This function is write one point to LCD.
  * @param  data : the data to write.
  * @retval None
  */


/**
  * @brief  This function is draw point to LCD.
  * @param  data : 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);
}

/**
  * @brief  This function is clear the LCD.
  * @param  data : 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);
    }
}


/**
  * @brief  configures the xmc and gpios to interface with the lcd.
  *         this function must be called before any write/read operation
  *         on the lcd.
  * @param  none
  * @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   驱动IC  ST7796S

    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);
}





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106645
QQ
发表于 2024-2-23 13:48:42 | 显示全部楼层
楼主这个代码读取显示屏ID正常吗,ID读取正常了,后面就好弄。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-2-23 14:03:17 | 显示全部楼层
eric2013 发表于 2024-2-23 13:48
楼主这个代码读取显示屏ID正常吗,ID读取正常了,后面就好弄。

读取的都是ffff
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106645
QQ
发表于 2024-2-24 00:25:02 | 显示全部楼层

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

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2024-2-26 12:30:44 | 显示全部楼层
注意以下两点:
1、你用的是8080接口,那就是传数据是用的16bit的,不应该用8bit的传数据方式。
2、SPI方式传数据,图片格式生成的是高位在前的,8080接口生成的图片格式不能用高位在前的方式生成,不然花屏。
除了以上两点,其他代码屏厂家的驱动基本都可以直接套用
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-2-26 15:38:15 | 显示全部楼层
benny 发表于 2024-2-26 12:30
注意以下两点:
1、你用的是8080接口,那就是传数据是用的16bit的,不应该用8bit的传数据方式。
2、SPI方 ...

感谢, 现在的问题是 st7796s 读不出id号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 17:05 , Processed in 0.282512 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表