打印
[学习资料]

基本的ST7735驱动程序示例(C语言)

[复制链接]
1285|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2024-7-24 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST7735是一款常用的彩色TFT液晶显示屏控制器,支持多种接口和显示模式。如果你需要ST7735的驱动程序,以下是一个基本的驱动示例,适用于使用SPI接口与ST7735通信的情况。

基本的ST7735驱动程序示例(C语言)
这个驱动程序假设你正在使用一个通用的MCU,并使用SPI接口与ST7735进行通信。

硬件连接(假设):
SCK: SPI时钟引脚
MOSI: SPI数据引脚
CS: 片选引脚
DC: 数据/命令选择引脚
RST: 复位引脚
驱动代码示例:
ST7735命令和初始化代码
c

#include "stm32f4xx_hal.h" // 替换为你使用的MCU库

#define ST7735_WIDTH  128
#define ST7735_HEIGHT 160

// ST7735 Commands
#define ST7735_NOP     0x00
#define ST7735_SWRESET 0x01
#define ST7735_RDDID   0x04
#define ST7735_RDDST   0x09

#define ST7735_SLPIN   0x10
#define ST7735_SLPOUT  0x11
#define ST7735_PTLON   0x12
#define ST7735_NORON   0x13

#define ST7735_INVOFF  0x20
#define ST7735_INVON   0x21
#define ST7735_DISPOFF 0x28
#define ST7735_DISPON  0x29
#define ST7735_CASET   0x2A
#define ST7735_RASET   0x2B
#define ST7735_RAMWR   0x2C
#define ST7735_RAMRD   0x2E

#define ST7735_PTLAR   0x30
#define ST7735_COLMOD  0x3A
#define ST7735_MADCTL  0x36

#define ST7735_FRMCTR1 0xB1
#define ST7735_FRMCTR2 0xB2
#define ST7735_FRMCTR3 0xB3
#define ST7735_INVCTR  0xB4
#define ST7735_DISSET5 0xB6

#define ST7735_PWCTR1  0xC0
#define ST7735_PWCTR2  0xC1
#define ST7735_PWCTR3  0xC2
#define ST7735_PWCTR4  0xC3
#define ST7735_PWCTR5  0xC4
#define ST7735_VMCTR1  0xC5

#define ST7735_RDID1   0xDA
#define ST7735_RDID2   0xDB
#define ST7735_RDID3   0xDC
#define ST7735_RDID4   0xDD

#define ST7735_PWCTR6  0xFC

#define ST7735_GMCTRP1 0xE0
#define ST7735_GMCTRN1 0xE1

SPI_HandleTypeDef hspi; // 替换为你实际的SPI句柄

void ST7735_Select() {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); // CS引脚低电平
}

void ST7735_Unselect() {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); // CS引脚高电平
}

void ST7735_Reset() {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); // RST引脚低电平
    HAL_Delay(5);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); // RST引脚高电平
}

void ST7735_WriteCommand(uint8_t cmd) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); // DC引脚低电平
    HAL_SPI_Transmit(&hspi, &cmd, sizeof(cmd), HAL_MAX_DELAY);
}

void ST7735_WriteData(uint8_t* buff, size_t buff_size) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); // DC引脚高电平
    HAL_SPI_Transmit(&hspi, buff, buff_size, HAL_MAX_DELAY);
}

void ST7735_Init() {
    ST7735_Select();
    ST7735_Reset();

    // Software reset
    ST7735_WriteCommand(ST7735_SWRESET);
    HAL_Delay(150);

    // Exit sleep mode
    ST7735_WriteCommand(ST7735_SLPOUT);
    HAL_Delay(500);

    // Frame rate control
    ST7735_WriteCommand(ST7735_FRMCTR1);
    uint8_t data1[] = {0x01, 0x2C, 0x2D};
    ST7735_WriteData(data1, sizeof(data1));

    // Display inversion control
    ST7735_WriteCommand(ST7735_INVCTR);
    uint8_t data2[] = {0x07};
    ST7735_WriteData(data2, sizeof(data2));

    // Power control
    ST7735_WriteCommand(ST7735_PWCTR1);
    uint8_t data3[] = {0xA2, 0x02, 0x84};
    ST7735_WriteData(data3, sizeof(data3));

    // Memory data access control
    ST7735_WriteCommand(ST7735_MADCTL);
    uint8_t data4[] = {0xC8};
    ST7735_WriteData(data4, sizeof(data4));

    // COLMOD: Pixel Format Set
    ST7735_WriteCommand(ST7735_COLMOD);
    uint8_t data5[] = {0x05}; // 16-bit color
    ST7735_WriteData(data5, sizeof(data5));

    // Display ON
    ST7735_WriteCommand(ST7735_DISPON);
    HAL_Delay(100);

    ST7735_Unselect();
}



使用特权

评论回复
沙发
l63t89|  楼主 | 2024-7-24 13:48 | 只看该作者
绘图函数示例
c
void ST7735_SetAddressWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) {
    ST7735_WriteCommand(ST7735_CASET); // Column addr set
    uint8_t data1[] = {0x00, x0, 0x00, x1};
    ST7735_WriteData(data1, sizeof(data1));

    ST7735_WriteCommand(ST7735_RASET); // Row addr set
    uint8_t data2[] = {0x00, y0, 0x00, y1};
    ST7735_WriteData(data2, sizeof(data2));

    ST7735_WriteCommand(ST7735_RAMWR); // Write to RAM
}

void ST7735_PushColor(uint16_t color) {
    uint8_t data[] = {color >> 8, color & 0xFF};
    ST7735_WriteData(data, sizeof(data));
}

void ST7735_DrawPixel(uint8_t x, uint8_t y, uint16_t color) {
    if((x >= ST7735_WIDTH) || (y >= ST7735_HEIGHT))
        return;

    ST7735_Select();
    ST7735_SetAddressWindow(x, y, x + 1, y + 1);
    ST7735_PushColor(color);
    ST7735_Unselect();
}

使用特权

评论回复
板凳
xuanhuanzi| | 2024-7-29 22:02 | 只看该作者
看起来不错,可惜不会配置PIC的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

776

帖子

1

粉丝