基於NUCLEO-G071RB控制1.8寸TFT的項目

G0板卡展示及介紹


1、圖片展示



2、硬件介紹

STM32G0x1:新一代入門級32位MCU,超過93%的 I/O利用率,其中板卡包含STM32G071RB(M0+內核64MHz、128K Flash和36K SRAM)+ST-Link/V2-1調試器+兩組擴展接口(Arduino、STmorpho擴展接口)。下面是它的硬件資源圖。



項目概述

TFT彩屏是目前應用最廣泛的液晶顯示屏之一,全稱是Thin Film Transistor,即薄膜晶體管,屬於有源矩陣液晶顯示器,以顯示效果細膩、無閃爍、視角大、超薄等特點獲得了廣泛應用。從電視電腦顯示屏,到手機等小屏幕設備都廣泛採用TFT彩屏。而且它可以“主動地”對屏幕上的各個獨立的像素進行控制,這樣可以大大提高反應時間。一般TFT的反應時間比較快,約80毫秒,而且可視角度大,一般可達到130度左右,主要運用在高端產品。從而可以做到高速度、高亮度、高對比度顯示屏幕信息。TFT屬於有源矩陣液晶顯示器,在技術上採用了“主動式矩陣”的方式來驅動,方法是利用薄膜技術所作成的電晶體電極,利用掃描的方法“主動拉”控制任意一個顯示點的開與關,光源照射時先通過下偏光板向上透出,藉助液晶分子傳導光線,通過遮光和透光來達到顯示的目的。

因此本次項目使用新的G0開發板來進行控制1.8寸TFT屏的點亮並進行顯示字符串和數字及圖片等等功能。

硬件設計

1、板卡原理圖


2、接線說明

本次所使用的1.8寸TFT屏幕接線只需要外接6根線,分別試電源正負及和4跟信號線,分別如下連接:

SCL(時鐘線):D8

SDA(數據線):D9

RST(復位):C4

CLR(清除):C5


軟件調試


1、TFT初始化

<code>void LCD_Init(void){ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET); /*Configure GPIO pins : PC4 PC5 */ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pins : PD8 PD9 */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET); //OLED_CS_Clr(); //打開片選使能 LCD_RST_Clr(); HAL_Delay(500); LCD_RST_Set(); HAL_Delay(500); //OLED_BLK_Set(); LCD_WR_REG(0x11);//Sleep exit HAL_Delay(500); //ST7735R Frame Rate LCD_WR_REG(0xB1); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB3); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB4); //Column inveLCD_DC ion LCD_WR_DATA8(0x07); //ST7735R Power Sequence LCD_WR_REG(0xC0); LCD_WR_DATA8(0xA2); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x84); LCD_WR_REG(0xC1); LCD_WR_DATA8(0xC5); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x00); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0xEE); LCD_WR_REG(0xC5); //VCOM LCD_WR_DATA8(0x0E); LCD_WR_REG(0x36); //MX, MY, RGB mode LCD_WR_DATA8(0xC0); #ifdef USE_LANDSCAPE LCD_WR_DATA8(0xA8); //豎屏C8 橫屏08 A8#else LCD_WR_DATA8(0xC8); //豎屏C8 橫屏08 A8#endif //ST7735R Gamma Sequence LCD_WR_REG(0xe0); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1a); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x2f); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x22); LCD_WR_DATA8(0x1f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x10); LCD_WR_REG(0xe1); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x17); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x2c); LCD_WR_DATA8(0x29); LCD_WR_DATA8(0x2e); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x3f); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x10); LCD_WR_REG(0x2a); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00+2); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x80+2); LCD_WR_REG(0x2b); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00+3); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x80+3); LCD_WR_REG(0xF0); //Enable test command LCD_WR_DATA8(0x01); LCD_WR_REG(0xF6); //Disable ram power save mode LCD_WR_DATA8(0x00); LCD_WR_REG(0x3A); //65k mode LCD_WR_DATA8(0x05); LCD_WR_REG(0x29);//Display on }/<code>


2、顯示圖片程序

<code>void showimage() //顯示40*40圖片{ int i,j,k; for(k=3;k<4;k++) { for(j=0;j<3;j++) { LCD_Address_set(40*j,40*k,40*j+39,40*k+39); //座標設置 for(i=0;i<1600;i++) { LCD_WR_DATA8(image[i*2+1]); LCD_WR_DATA8(image[i*2]); } } }}/<code>


3、顯示浮點數字程序

<code>//函數名 LCD_Show_Float//功能描述:顯示一個任意長度的float型常量或變量//入口參數:x_01,OLED的橫座標;y_01,OLED的頁數;can_0,要顯示的常量或變量;len,要顯示的小數位數。//返回值 :無//特別說明:輸入的小數位數要 低於或等於 所顯示數據的有效小數位數,否則由於浮點型數據的存儲方式 可能顯示出非有效小數位void LCD_Show_Float(unsigned char x_01,unsigned char y_01 ,floatcan_0,unsigned char len){ unsigned char cl_1,cl_2, m,t,real_len,reco_num;//cl_1,cl_2-cumulate累計1,i-小記錄, m,由於符號數據的移動位數, t-累加累減,real_len-數據真實長度,reco_num-數據記錄 unsigned long int can;//將小數部分全部放大成整數部分的值 unsigned int INT_P;//整數部分的值 unsigned int FLOAT_P;//小數部分化為整數的值 // x_01 += 8; /*符號處理*/ if(can_0<0) { m=1;//由於符號,所有數據向右移位 LCD_P8X8(y_01,x_01,'-',POINT_COLOR,BACK_COLOR); can_0=0-can_0; } else { m=1;//正號不顯示 LCD_P8X8(y_01,x_01,'+',POINT_COLOR,BACK_COLOR); } can = (int) (can_0*LCD_Pow(10,len)) ; INT_P = (int)can_0; FLOAT_P = (int)(can - INT_P*LCD_Pow(10,len)); /*計算整數部分長度*/ if(INT_P) { real_len=10;//設置整數部分可顯示的最大長度,隨意設! for(t=0;t<real>/<code>


效果演示

圖片演示


圖片演示

顯示字符串

顯示數字


顯示浮點數

總體展示