天天看點

STM32F407VET6+ST7735TFT LCD彩屏驅動程式硬體準備根據手冊寫代碼

硬體準備

STM32F407VET6開發闆一塊

編譯器使用的是STM32cubeide。

螢幕使用的是如圖所示的螢幕,驅動晶片是st7735.

驅動協定采用的是spi通訊協定。

STM32F407VET6+ST7735TFT LCD彩屏驅動程式硬體準備根據手冊寫代碼

和stm32晶片的連接配接方式如下,使用的是spi2.

CS片選腳  PA4
A0腳(資料指令控制腳) PA5
LED腳(背光腳)  PA3
reset(螢幕複位腳) PA2
sck(spi時鐘腳) PB10
SDA(SPIs資料腳) PC3
vcc和gnd連接配接到5V電源上就可以了。

           

由于使用的是cubeide,代碼都是直接生成的,在此就不提及cubeide該怎麼生成工程了。我使用的是spi2,開啟了dma傳輸功能。你們可以和我一樣,也可以按照自己的需要自己修改。

根據手冊寫代碼

網上也有許多關于st7735的代碼,但都是隻貼一下代碼,關于原理部分提及較少,本着授人以魚不如授人以漁的原則,我決定對照着資料手冊教大家看懂每一行代碼,讓大家知其然知其是以然。

底層驅動

有螢幕使用經驗的朋友都知道,操作螢幕分為寫資料,寫指令。是以對于ST7735來說,也是同樣的原理。對于螢幕的一些的gpio操作,我把封裝成了宏定義,是以先貼在前面。隻需要注意前面的片選腳,資料指令選擇腳就可以了。

//LCD片選腳
#define CS_HIGH   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)
#define CS_LOW   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)

//指令資料選擇腳   對應螢幕上面的a0腳  輸出低電平,代表指令,高電平,代表資料
#define COMMAND  HAL_GPIO_WritePin(CMD_DATA_GPIO_Port, CMD_DATA_Pin, GPIO_PIN_RESET)
#define DATA     HAL_GPIO_WritePin(CMD_DATA_GPIO_Port, CMD_DATA_Pin, GPIO_PIN_SET)

//複位腳
#define reset_high  HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET)
#define reset_low  HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET)
//背光腳
#define  led_high HAL_GPIO_WritePin(BACK_LED_GPIO_Port,BACK_LED_Pin,GPIO_PIN_SET)
#define  led_low HAL_GPIO_WritePin(BACK_LED_GPIO_Port,BACK_LED_Pin,GPIO_PIN_RESET)
//lcd背光顔色
#define RED    0xf800
#define GREEN  0x07e0
#define BLUE   0x001f
#define YELLOW 0xffe0
#define WHITE  0xffff
#define BLACK  0x0000
#define PURPLE 0xf81f
#define MAGENTA   0xF81F        //  品紅
           
STM32F407VET6+ST7735TFT LCD彩屏驅動程式硬體準備根據手冊寫代碼

通過資料手冊我們可以看到,如果D/CX腳為低電平,就是寫指令,為高電平就是寫資料。D/CX就是實物圖上的A0腳,也是上面宏定義中的COMMAND。是以就 可以來寫我們的驅動程式了。資料已經貼在下面了,通過資料手冊,現在是不是一目了然。

//LCD螢幕寫指令
void TFT_WRITE_DATA(uint8_t data)
{
	CS_LOW;
	DATA;
	HAL_SPI_Transmit_DMA(&hspi2,&data,1);
	CS_HIGH;

}
//  LCD螢幕寫指令
void TFT_WRITE_COMMAND(uint8_t command)
{
	CS_LOW;
	COMMAND;
	HAL_SPI_Transmit_DMA(&hspi2,&command,1);
	CS_HIGH;
}
           

有了這兩個函數以後,就能進行螢幕的操作了,首先我們需要進行螢幕的初始化。

螢幕初始化

STM32F407VET6+ST7735TFT LCD彩屏驅動程式硬體準備根據手冊寫代碼

以B4H這個指令為例子,這是一個控制反顯的指令,B4是指令的代碼,參數控制如圖所示。

**是以,如果需要控制一個具體的功能,需要先發送該指令碼,在發送對應的資料。**以這個指令為例子。

TFT_WRITE_COMMAND(0xB4); //Column inversion
	TFT_WRITE_DATA(0x07);

           

是以在初始化的時候,隻要按照這樣的操作就可以了,初始化的代碼貼在下面。

void tft_init()
{

	reset_low;
	HAL_Delay(100);
	reset_high;
	HAL_Delay(100);

	//根據資料手冊,對應的寄存器寫入對應的值,是以在發送完指令之後,就要發送對應的資料
	TFT_WRITE_COMMAND(0x11);//Sleep exit
	HAL_Delay(120);
		//ST7735R Frame Rate
	TFT_WRITE_COMMAND(0xB1);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);

	TFT_WRITE_COMMAND(0xB2);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);


	TFT_WRITE_COMMAND(0xB3);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);

	TFT_WRITE_COMMAND(0xB4); //Column inversion
	TFT_WRITE_DATA(0x07);


	//ST7735R Power Sequence
	TFT_WRITE_COMMAND(0xC0);
	TFT_WRITE_DATA(0xA2);
	TFT_WRITE_DATA(0x02);
	TFT_WRITE_DATA(0x84);
	TFT_WRITE_COMMAND(0xC1);
	TFT_WRITE_DATA(0xC5);


	TFT_WRITE_COMMAND(0xC2);
	TFT_WRITE_DATA(0x0A);
	TFT_WRITE_DATA(0x00);


	TFT_WRITE_COMMAND(0xC3);
	TFT_WRITE_DATA(0x8A);
	TFT_WRITE_DATA(0x2A);
	TFT_WRITE_COMMAND(0xC4);
	TFT_WRITE_DATA(0x8A);
	TFT_WRITE_DATA(0xEE);

	TFT_WRITE_COMMAND(0xC5); //VCOM
	TFT_WRITE_DATA(0x0E);


	TFT_WRITE_COMMAND(0x36); //MX, MY, RGB mode
	TFT_WRITE_DATA(0xC8);



	//ST7735R Gamma Sequence
	TFT_WRITE_COMMAND(0xe0);
	TFT_WRITE_DATA(0x0F);
	TFT_WRITE_DATA(0x1A);
	TFT_WRITE_DATA(0x0F);
	TFT_WRITE_DATA(0x18);
	TFT_WRITE_DATA(0x2F);
	TFT_WRITE_DATA(0x28);


	TFT_WRITE_DATA(0x20);
	TFT_WRITE_DATA(0x22);
	TFT_WRITE_DATA(0x1F);

	TFT_WRITE_DATA(0x1B);
	TFT_WRITE_DATA(0x23);
	TFT_WRITE_DATA(0x37);


	TFT_WRITE_DATA(0x00);

	TFT_WRITE_DATA(0x07);
	TFT_WRITE_DATA(0x02);
	TFT_WRITE_DATA(0x10);


	TFT_WRITE_COMMAND(0xe1);
	TFT_WRITE_DATA(0x0F);
	TFT_WRITE_DATA(0x1B);
	TFT_WRITE_DATA(0x0F);

	TFT_WRITE_DATA(0x17);



	TFT_WRITE_DATA(0x33);
	TFT_WRITE_DATA(0x2C);

	TFT_WRITE_DATA(0x29);

	TFT_WRITE_DATA(0x2E);
	TFT_WRITE_DATA(0x28);
	TFT_WRITE_DATA(0x30);


	TFT_WRITE_DATA(0x30);

	TFT_WRITE_DATA(0x39);
	TFT_WRITE_DATA(0x3F);

	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x07);
	TFT_WRITE_DATA(0x03);
	TFT_WRITE_DATA(0x10);

	//設定為了 RGB 5-6-5  65k顔色mode
	TFT_WRITE_COMMAND(0x2A); //65k mode
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x7F);

	TFT_WRITE_COMMAND(0x2B); //65k mode
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x9F);

	TFT_WRITE_COMMAND(0xF0); //65k mode
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_COMMAND(0xF6); //65k mode
	TFT_WRITE_DATA(0x00);


	TFT_WRITE_COMMAND(0x3A); //這個指令将螢幕設定為了 65k顔色模式
	TFT_WRITE_DATA(0x05);
	TFT_WRITE_COMMAND(0x29);//Display on
	lcd_set_direction();

	TFT_WRITE_REG(0x36,(1<<3)|(1<<6)|(1<<7)); //這個指令很關鍵,控制了螢幕的顯示方向等參數

	TFT_WRITE_COMMAND(0xc0);//Display on  TFT_WRITE_COMMAND(0x36  );設定�?始坐�?
	TFT_WRITE_DATA(0x0A);

	lcd_clear(0xffe0);
	led_high;
}
           

顯示資料

在初始化完成以後,就可以寫資料了。

在寫資料之前需要先設定顯示的區域,然後在寫入對應的資料。

與坐标設定相關的指令是2A,2B,2C。有了前面的教學,你應該可以看明白資料手冊了,在此就不細說了。

程式源碼在gitee源碼

需要的點選下載下傳就可以了。