【ESP32】ST7789滚屏驱动

一,ST7789驱动

驱动主要设定一些基础配置,包括反转、显示、长宽等等。

int st7789_lcd_init(int width, int height)
{
	int ret = 0;

	ret = spi_master_init(CONFIG_MOSI_GPIO, CONFIG_SCLK_GPIO, CONFIG_CS_GPIO, CONFIG_DC_GPIO, CONFIG_RESET_GPIO, CONFIG_BL_GPIO);
	if(ret) {
		BLOG_ERR("Wrong SPI Master Init:%d", ret);
		return ret;
	}
	ret += spi_master_write_command(0x01);	//Software Reset
	lcd_delay_ms(150);
	ret += spi_master_write_command(0x11);	//Sleep Out
	lcd_delay_ms(255);
	ret += spi_master_write_command(0x3A);	//Interface Pixel Format
	spi_master_write_data_byte(0x55);
	lcd_delay_ms(10);
	ret += spi_master_write_command(0x36);	//Memory Data Access Control
	spi_master_write_data_byte(0x00);
	// spi_master_write_command(0x2A);	//Column Address Set
	// spi_master_write_data_byte(0x00);
	// spi_master_write_data_byte(0x00);
	// spi_master_write_data_word(240);
	// spi_master_write_command(0x2B);	//Row Address Set
	// spi_master_write_data_byte(0x00);
	// spi_master_write_data_byte(0x00);
	// spi_master_write_data_word(320);
	ret += spi_master_write_command(0x20);	//Display Inversion On
	lcd_delay_ms(10);
	ret += spi_master_write_command(0x13);	//Normal Display Mode On
	lcd_delay_ms(10);
	ret += spi_master_write_command(0x29);	//Display ON
	lcd_delay_ms(10);

	gpio_set_level(CONFIG_BL_GPIO, 1);

	BLOG_INFO("st7789 lcd init ret:%d", ret);
	return ret;
}


/**
 * @brief Vertical Scrolling Definition.
 * @param   tfa    top fixed area
 * @param   vsa    scroll area
 * @param   bta    bottom fixed area
 * @return  errcode
 * @retval  0      success
 * @retval  -1     fail 
 */
int lcd_set_scroll_area(uint16_t start, uint16_t scroll_end, uint16_t hor)
{
    uint8_t data[6];
    
    if (start + scroll_end + hor != 320) {
		printf("*******error scroll area set*******\r\n");
        return -1;
    }
    
    spi_master_write_command(0x33);
    
    data[0] = start >> 8;
    data[1] = start;
    data[2] = scroll_end >> 8;
    data[3] = scroll_end;
    data[4] = hor >> 8;
    data[5] = hor;

    gpio_set_level(CONFIG_DC_GPIO, LCD_DATA_MODE);
    
	return spi_master_write_byte(lcd_7789_handle, data, sizeof(data));
}

/**
 * @brief Set Vertical scroll start address of RAM.
 * @param   vsp    scroll start address of RAM
 * @return  none
 */
int lcd_set_scroll_start_address(uint16_t start_addr)
{
    uint8_t data[2] = {0};
	static uint8_t Byte[2];

    spi_master_write_command(0x37);
    
    data[0] = start_addr >> 8;
    data[1] = (uint8_t)start_addr;

	gpio_set_level(CONFIG_DC_GPIO, LCD_DATA_MODE);
	return spi_master_write_byte(lcd_7789_handle, data, 2);
}

这里包括了一些SPI初始化,参考esp32 spi master即可。

二,关于滚屏描述

主要是为了如何实现滚屏效果,可以参考st7789 spec描述章节:VSCRDEF(33H)以及VSCSAD(37H)

image-20230718160758405

这里需要注意:必须是TFA+VSA+BFA = 320才可以生效,否则不生效或者滚动时序乱掉。

image-20230718160922583

这里用默认的ML即可,默认为0,采用的是从下往上扫。

三,如何实现滚屏效果

配置好默认的TFA、VSA、BFA即可。这里我用Y轴080为自定义区域,80320为滚动区域。

设定的方式如下:

// Set Scroll Area	80、240、0
lcd_set_scroll_area(ESP_LCD_SCROLL_TFA, ESP_LCD_SCROLL_VSA, ESP_LCD_SCROLL_BFA);

滚动的函数如下:

void esp_lcd_show_scroll_string(char *string)
{
    static uint16_t position = ESP_LCD_SCROLL_TFA-ESP_LCD_FONT_HEIGHT;
    uint8_t ascii[ESP_LCD_FONT_LENGTH + 1];

    if(strlen(string) > sizeof(ascii)) {
        printf("Error Length");
        return;
    }
    // Copy String
    strcpy((char *)ascii, string);
    
    position += ESP_LCD_FONT_HEIGHT;	// 这里补一个高度便于计算,其实默认就是ESP_LCD_SCROLL_TFA = 80
    if(position >= CONFIG_HEIGHT) {
        position = ESP_LCD_SCROLL_TFA;
    }

    // Put the last string into head
    lcd_set_scroll_start_address(position+ESP_LCD_FONT_HEIGHT);
    
    lcd_show_ascii_string(0, position, ESP_LCD_FONT_HEIGHT, ascii, GREEN, BLACK);
}

四,看看效果

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ESP32 ST7789是一种使用SPI接口的LCD显示器。根据文件中的提示,你需要进行一些设置来连接和配置它。在自定义驱动文件中,你可以修改一些内容以适配ESP32 ST7789。具体的修改步骤可以参考文件的提示。 对于显示图片的功能,你可以使用TFT_eSPI库提供的一些函数来实现。其中,你可以使用drawXBitmap函数来绘制XBM格式的图片,该函数接受图片的位置、大小和颜色等参数。另外,pushImage函数可以用于显示图片,它可以接受图片的位置、大小和数据等参数。可以根据实际需求选择合适的函数来显示图片。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用ESP32驱动ST7789,效果很好的IPS显示屏](https://blog.csdn.net/u012388993/article/details/120605961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [玩转 ESP32 + Arduino(二十八) TFT_eSPI库驱动ST7789](https://blog.csdn.net/finedayforu/article/details/108975245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tim-Cheng

你的鼓励是我最大的动力,奥利给

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值