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

四,看看效果

### 实现ST7789屏幕的垂直滚动效果 为了实现在ST7789显示屏上的垂直滚动效果,可以利用其内置的硬件垂直滚动功能。通过特定命令配置滚动参数并不断更新这些参数来创建动态滚动效果。 #### 配置垂直滚动区域 首先需要发送`0x33H`指令定义垂直滚动区域。此指令允许指定屏幕上参与滚动的部分以及固定部分的位置和大小[^3]。 ```cpp void setScrollArea(uint16_t topFixedHeight, uint16_t scrollHeight, uint16_t bottomFixedHeight){ writeCommand(0x33); // Vertical Scroll Definition writeData(topFixedHeight >> 8); writeData(topFixedHeight & 0xFF); writeData(scrollHeight >> 8); writeData(scrollHeight & 0xFF); writeData(bottomFixedHeight >> 8); writeData(bottomFixedHeight & 0xFF); } ``` #### 启动垂直滚动 接着使用`0x77`指令设定滚动起点地址从而启动滚动过程。每次改变这个值都会使画面向上或向下移动一格距离。 ```cpp void startVerticalScroll(uint16_t vsp){ writeCommand(0x77); // Vertical Scrolling Start Address writeData(vsp >> 8); writeData(vsp & 0xFF); delay(20); // Wait for command to take effect writeCommand(0x11); // Sleep Out delay(120); // Delay according to datasheet requirements writeCommand(0x29); // Display On } ``` #### 动态刷新滚动位置 为了让文字看起来像是连续流动而不是跳跃式的位移,在主循环里周期性的增加偏移量重新调用`startVerticalScroll()`方法即可达成平滑过渡的效果[^2]。 ```cpp uint16_tvsp = 0; while(true){ clearScreen(); drawText("This is a scrolling text example.", 0,vsp , WHITE); vsp++; if (vsp >= screenHeight) { vsp = 0; // Reset when reaching the end of screen height } startVerticalScroll(vsp); delay(50); // Adjust speed as needed } ``` 以上代码片段展示了如何初始化、激活及持续更新ST7789显示器上的垂直滚动特性。需要注意的是实际应用中可能还需要考虑边界条件处理等问题以确保最佳视觉体验[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tim-Cheng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值