【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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tim-Cheng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值