国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S)

這篇具有很好參考價(jià)值的文章主要介紹了【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

SPI簡(jiǎn)介

SPI,英文全稱(chēng)Serial Peripheral Interface,即串行外圍設(shè)備接口,是一種高速、全雙工、同步的串行通信總線。

我們之前說(shuō)過(guò)I2C,那么我們就拿I2C和SPI做個(gè)對(duì)比。

SPI和I2C對(duì)比,優(yōu)勢(shì)在于SPI的傳輸速率比I2C快得多,劣勢(shì)在于SPI需要用的通信線比較多。

I2C只需要兩根線,而SPI至少需要4根:

  1. SCK(Serial Clock):串行時(shí)鐘線,由主設(shè)備產(chǎn)生,用于同步數(shù)據(jù)傳輸。
  2. MOSI(Master Output Slave Input):主機(jī)輸出從機(jī)輸入線,主設(shè)備通過(guò)這條線發(fā)送數(shù)據(jù)給從設(shè)備。
  3. MISO(Master Input Slave Output):主機(jī)輸入從機(jī)輸出線,主設(shè)備通過(guò)這條線接收從設(shè)備發(fā)送的數(shù)據(jù)。
  4. SS(Slave Select):從機(jī)選擇線(每個(gè)從機(jī)一根選擇線),用于選擇與主設(shè)備進(jìn)行通信的從設(shè)備。通常情況下,SS線為低電平有效,即當(dāng)SS線為低電平時(shí),選中對(duì)應(yīng)的從設(shè)備進(jìn)行通信。

通常我們拿個(gè)使用SPI來(lái)通信的模塊都是拿來(lái)當(dāng)從機(jī)的,所以我們的STM32(MCU)就是主機(jī)了,因此對(duì)于我們STM32來(lái)說(shuō),MOSI就是輸出線,MISO就是輸入線,那么我們應(yīng)該怎么去配置對(duì)應(yīng)線連接的GPIO口呢,我們可以看看官方手冊(cè)。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

官方手冊(cè)的建議(在第八章)是MOSI(主模式)設(shè)為推挽復(fù)用輸出,MISO設(shè)為浮空輸入或者是上拉輸入。?

跟I2C一樣,我這邊還是用的軟件模擬SPI,優(yōu)點(diǎn)就是GPIO口的選擇非常自由,而且只要GPIO口夠用,可連接的SPI設(shè)備是可以有很多的,因此在上面GPIO口的模式配置就配置為推挽輸出而不是推挽復(fù)用輸出,因?yàn)槲覀兪擒浖M,不需要復(fù)用功能。當(dāng)然如果各位小伙伴想用硬件SPI的話(huà),配置GPIO口的模式就需要配置為復(fù)用。

SPI時(shí)序

開(kāi)始與結(jié)束

我們先了解一下SPI是如何通信的,首先是SS線,這個(gè)是從機(jī)選擇線,當(dāng)它處于低電平的狀態(tài)下,那么該從機(jī)屬于被選中的狀態(tài),當(dāng)它處于高電平的狀態(tài)下,這個(gè)從機(jī)就屬于不被選中。

因此我們可以認(rèn)為當(dāng)SS從高電平拉低到低電平,這個(gè)算是起始的一個(gè)時(shí)序。而SS從低電平拉高到高電平,就算是結(jié)束的時(shí)序。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

和I2C相比,SPI的起始和結(jié)束的時(shí)序相對(duì)簡(jiǎn)單。并且SPI通信也不需要設(shè)備的地址,只需要一根SS選擇線即可控制是否選擇該從機(jī),好處是簡(jiǎn)單快捷,而壞處就是當(dāng)我們連接的從機(jī)過(guò)多時(shí),主機(jī)光是連接從機(jī)選擇線都得花掉不少GPIO口。

發(fā)送接收字節(jié)

發(fā)送接收字節(jié)看似是兩個(gè)時(shí)序,但是在SPI中卻是同一個(gè)時(shí)序,因?yàn)镾PI的機(jī)制是我們發(fā)送一個(gè)字節(jié),并且接收一個(gè)字節(jié)(那怕我們并不需要接收數(shù)據(jù))。反過(guò)來(lái)看也可以是我們接收一個(gè)字節(jié),并且發(fā)送一個(gè)字節(jié)(那怕這個(gè)字節(jié)是無(wú)用的數(shù)據(jù))。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

通過(guò)上圖大家應(yīng)該就可以明白了。我們所謂的發(fā)送接收字節(jié)實(shí)際上是交換字節(jié),因此實(shí)際上SPI就仨時(shí)序,開(kāi)始一個(gè),結(jié)束一個(gè),交換bit一個(gè)。

因此我們剩下就是要搞明白交換bit的時(shí)序是什么。

交換bit的時(shí)序有四種版本,分別是模式0,1,2,3,一般情況下模式0是通用的,因此我們了解一下模式0。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

實(shí)際上就是在SCK上升沿的時(shí)候,移出MOSI的數(shù)據(jù),在SCK下降沿的時(shí)候讀取MISO的數(shù)據(jù)。

因此我們需要在SCK上升沿之前把需要發(fā)送的數(shù)據(jù)位放置在MOSI線上。

并且在SCK下降沿的時(shí)候馬上讀取MISO線上的數(shù)據(jù)位(實(shí)際上下降沿和讀取應(yīng)該是同時(shí)的,但是我們軟件模擬沒(méi)法同時(shí),但是效果是一樣的)

STM32軟件模擬SPI

通過(guò)上面時(shí)序的介紹,我們就可以寫(xiě)出下面的軟件模擬SPI的代碼了,下面的代碼可以直接用,只需要將對(duì)應(yīng)通信線的GPIO口的宏定義改掉即可自己指定通信線使用的GPIO口。

#include "stm32f10x.h"                  // Device header

#define Z_SPI_SS_GPIO GPIO_Pin_0
#define Z_SPI_SCK_GPIO GPIO_Pin_1
#define Z_SPI_MOSI_GPIO GPIO_Pin_2
#define Z_SPI_MISO_GPIO GPIO_Pin_3

void Z_SPI_SetSS(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_SPI_SS_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_SPI_SS_GPIO,Bit_SET);
}

void Z_SPI_SetSCK(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_SPI_SCK_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_SPI_SCK_GPIO,Bit_SET);
}

void Z_SPI_SetMOSI(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_SPI_MOSI_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_SPI_MOSI_GPIO,Bit_SET);
}

uint8_t Z_SPI_GetMISO(void){
    return GPIO_ReadInputDataBit(GPIOA,Z_SPI_MISO_GPIO);
}

//SPI初始化GPIO口
void Z_Init_SPI(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    //SS SCK MOSI 都是推挽輸出
    GPIO_InitTypeDef itd;
    itd.GPIO_Mode=GPIO_Mode_Out_PP;                  
    itd.GPIO_Pin=Z_SPI_SS_GPIO|Z_SPI_SCK_GPIO|Z_SPI_MOSI_GPIO;     
    itd.GPIO_Speed=GPIO_Speed_50MHz;                    
    GPIO_Init(GPIOA,&itd);
    //MISO 是浮空輸入或者是上拉輸入
    itd.GPIO_Mode=GPIO_Mode_IPU;
    itd.GPIO_Pin=Z_SPI_MISO_GPIO;
    GPIO_Init(GPIOA,&itd);

    //SS默認(rèn)是不選中,即高電平
    Z_SPI_SetSS(1);
    //SCK默認(rèn)低電平,以便拼接后續(xù)交換字節(jié)的時(shí)序
    Z_SPI_SetSCK(0);
    //MOSI與MISO什么電平都無(wú)所謂.
}

//SPI開(kāi)始時(shí)序
void Z_SPI_Start(void){
    Z_SPI_SetSS(0);
}

//SPI結(jié)束時(shí)序
void Z_SPI_End(void){
    Z_SPI_SetSS(1);
}

//交換字節(jié)時(shí)序
uint8_t Z_SPI_SwapByte(uint8_t data){
    uint8_t receive=0x00;
    for(uint16_t i=0;i<8;++i){
        Z_SPI_SetMOSI(data&(0x80>>i));
        Z_SPI_SetSCK(1);
        if(Z_SPI_GetMISO()==1) receive|=(0x80>>i);
        Z_SPI_SetSCK(0);
    }
    return receive;
}

TFT-LCD

TFT-LCD,全稱(chēng)Thin Film Transistor Liquid Crystal Display,即薄膜晶體管液晶顯示器,是多數(shù)液晶顯示器的一種,使用薄膜晶體管技術(shù)改善影象品質(zhì)。這種顯示器技術(shù)是一種微電子技術(shù)與液晶顯示器技術(shù)巧妙結(jié)合的技術(shù)。

具體來(lái)說(shuō),TFT-LCD由一系列的像素組成,每個(gè)像素由液晶分子和薄膜晶體管構(gòu)成。薄膜晶體管是一種電子開(kāi)關(guān),通過(guò)控制其通斷狀態(tài)來(lái)控制液晶分子的排列,從而實(shí)現(xiàn)像素的顯示。每個(gè)像素都有一個(gè)對(duì)應(yīng)的薄膜晶體管,它們分別由一個(gè)源極、柵極和漏極組成。當(dāng)薄膜晶體管的柵極電壓升高時(shí),源極和漏極之間會(huì)形成一個(gè)導(dǎo)通通道,電流可以通過(guò)。反之,當(dāng)柵極電壓降低時(shí),通道將關(guān)閉,電流無(wú)法通過(guò)。

液晶分子的排列狀態(tài)會(huì)影響光的傳播和偏振方向。液晶分子在電場(chǎng)的作用下可以呈現(xiàn)不同的排列方式,分別為平行排列和垂直排列。當(dāng)液晶分子呈現(xiàn)平行排列時(shí),光線經(jīng)過(guò)液晶層時(shí)會(huì)發(fā)生偏轉(zhuǎn),無(wú)法通過(guò)偏振器,像素呈現(xiàn)出黑色。而當(dāng)液晶分子呈現(xiàn)垂直排列時(shí),光線能夠通過(guò)液晶層和偏振器,像素呈現(xiàn)出亮色。

TFT-LCD液晶屏的優(yōu)點(diǎn)包括顯示效果良好,色彩還原度遠(yuǎn)超其他種類(lèi)的顯示屏,呈現(xiàn)給用戶(hù)的畫(huà)面色彩鮮艷,飽和度高,純白、純黑畫(huà)面純凈。同時(shí),其IPS系列可以達(dá)到178度全視角,用戶(hù)無(wú)論從哪個(gè)角度觀看效果都非常好。然而,由于其超薄的外形,無(wú)法實(shí)現(xiàn)超高亮度的需求,亮度上存在一定的限制。

TFT-LCD液晶屏的應(yīng)用場(chǎng)景非常廣泛,包括消費(fèi)類(lèi)電子產(chǎn)品(如智能手機(jī)、平板電腦、筆記本電腦、電視機(jī)等)、醫(yī)療設(shè)備領(lǐng)域(如超聲診斷儀、心電圖機(jī)等)、工業(yè)自動(dòng)化領(lǐng)域(如數(shù)控機(jī)床、工業(yè)機(jī)器人等)以及汽車(chē)電子領(lǐng)域(如汽車(chē)儀表、導(dǎo)航設(shè)備等)。

另外,根據(jù)行業(yè)報(bào)告,TFT-LCD光罩市場(chǎng)規(guī)模在逐年增長(zhǎng),其在筆記本和平板電腦、液晶顯示器、智能手機(jī)、液晶電視等領(lǐng)域的應(yīng)用也在不斷擴(kuò)大。

總的來(lái)說(shuō),TFT-LCD技術(shù)因其獨(dú)特的顯示性能和廣泛的應(yīng)用場(chǎng)景,成為了當(dāng)今顯示技術(shù)領(lǐng)域的重要一環(huán)。如需更多關(guān)于TFT-LCD技術(shù)的信息,建議查閱相關(guān)的技術(shù)手冊(cè)或行業(yè)研究報(bào)告。

上面一大段的介紹都來(lái)自文心一言,簡(jiǎn)單來(lái)說(shuō)我們需要知道的就是TFT-LCD就是一顯示屏。

問(wèn)題就在于我們應(yīng)該如何驅(qū)動(dòng)。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

上圖為我上手的1.8寸屏幕的TFT-LCD,它用的驅(qū)動(dòng)芯片是ST7735S。

其中CS線就是SS線,SDA線就是MOSI線,SCL線就是SCK線。并且我們發(fā)現(xiàn)它沒(méi)有MISO線,而且還多了DC和RST和BLK。

首先沒(méi)有MISO線是因?yàn)槲覀儾⒉恍枰c這塊屏幕進(jìn)行雙向通信,也就是說(shuō)它不會(huì)給我們發(fā)送數(shù)據(jù),只會(huì)接受我們給的數(shù)據(jù),因此沒(méi)有MISO線。

DC線是ST7735S用于區(qū)分接受的是數(shù)據(jù)還是命令的,當(dāng)DC線處于低電平的情況下收到數(shù)據(jù),那么這個(gè)數(shù)據(jù)就是命令。當(dāng)DC線處于高電平的情況下收到數(shù)據(jù),那么這個(gè)數(shù)據(jù)就是參數(shù)。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

BLK線應(yīng)該是背光控制,無(wú)需控制則接3.3V常亮即可。

RST線是給TFT復(fù)位用的。

下面機(jī)翻的有些不到位,我概括一下。

就是RST拉低,然后持續(xù)至少10us,接著把RST拉高,而后等待5~120ms即復(fù)位完成。

當(dāng)我們需要初始化之前需要先復(fù)位。因此我們可以在上面復(fù)位的時(shí)序之后接初始化的代碼。

一般來(lái)說(shuō)廠家會(huì)提供初始化的代碼,可以找TFT屏幕的賣(mài)家要,后面我會(huì)貼出來(lái)。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

命令

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

從官方提供的手冊(cè)可以看出可供我們操作的命令非常多,官方的手冊(cè)是英文的,上圖是我找的翻譯網(wǎng)站去機(jī)翻出來(lái)的,這就有問(wèn)題了,英文我看不懂,中文則和原版的意思有出入,英語(yǔ)不好的我留下了沒(méi)文化的淚。

總之雖然命令多,但是我們常用的其實(shí)就那幾個(gè)。

既然它是屏幕,那么最重要的就是顯示,因此我們只需要懂得如何顯示即可。

簡(jiǎn)單來(lái)說(shuō)我們需要選中一塊區(qū)域,然后往這塊區(qū)域里面寫(xiě)入我們要顯示的數(shù)據(jù)。

而我們選中一塊區(qū)域需要知道這塊區(qū)域的位置,而ST7725S的辦法如下。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

發(fā)送0x2A的命令,告訴屏幕我們現(xiàn)在要指定區(qū)域的列范圍了,命令發(fā)送完我們需要再發(fā)送四個(gè)參數(shù)(四個(gè)字節(jié))用來(lái)指定列的起始和開(kāi)頭,通過(guò)表格可以看出,第一個(gè)參數(shù)和第二個(gè)參數(shù)共同決定了開(kāi)始的列,而第三個(gè)參數(shù)和第四個(gè)參數(shù)共同決定了結(jié)束的列。

但是問(wèn)題在于這塊屏幕的大小是128*160的,所以第一個(gè)參數(shù)和第三個(gè)參數(shù)應(yīng)該為0,因?yàn)槲覀冇貌恢敲锤叩奈粩?shù)。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

?發(fā)送0x2B命令則指定區(qū)域的行,具體的流程和指定列是一樣的。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

指定了行和列之后,我們?cè)侔l(fā)送0x2C的命令,接著直接發(fā)送多個(gè)長(zhǎng)度為16bit的參數(shù)去填充我們指定的區(qū)域即可。

而每個(gè)參數(shù)就是一個(gè)RGB三色像素點(diǎn),那么我們應(yīng)該如何通過(guò)兩個(gè)字節(jié)去表示RGB的數(shù)值呢(這邊需要各位小伙伴們對(duì)RGB表示顏色有些許了解)

我們來(lái)看看廠家提供的初始化代碼。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

看的出來(lái)指定像素的時(shí)候,初始化代碼中是指定了16bit為一個(gè)像素點(diǎn)。

我們還得看看16個(gè)bit如何表示出RGB三種顏色的數(shù)值。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

R分5bit,G分6bit,B分5bit,一共16bit。

我們知道一般RBG每個(gè)通道都需要8個(gè)bit也就是數(shù)值最多為255。而這邊表示RGB的一共才16bit,因此在色彩的表現(xiàn)方面會(huì)稍差一些,但是也是夠用的。

知道了怎么使用這塊屏幕之后我們可以開(kāi)始敲代碼了。

首先先封裝一下SPI的函數(shù),因?yàn)镾T7735S還是有著自己的使用規(guī)則。

主要需要封裝的就是給ST7735S發(fā)送數(shù)據(jù)有兩種不同含義,可能是命令也可能是參數(shù),那么就要封裝一下。并且因?yàn)橐粋€(gè)像素點(diǎn)是16個(gè)bit,而我們上面SPI的驅(qū)動(dòng)只有交換一個(gè)字節(jié),也就是發(fā)送一個(gè)字節(jié),因此再封裝一個(gè)發(fā)送兩個(gè)字節(jié)的表示RGB的16個(gè)bit的函數(shù)。

#define Z_ST7735S_RST_GPIO GPIO_Pin_2
#define Z_ST7735S_DC_GPIO GPIO_Pin_3

void Z_ST7735S_SetRST(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_ST7735S_RST_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_ST7735S_RST_GPIO,Bit_SET);
}

void Z_ST7735S_SetDC(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_ST7735S_DC_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_ST7735S_DC_GPIO,Bit_SET);
}

void Z_ST7735S_SendCommand(uint8_t command){
    Z_SPI_Start();
    Z_ST7735S_SetDC(0);
    Z_SPI_SwapByte(command);
    Z_SPI_End();
}

void Z_ST7735S_SendData(uint8_t data){
    Z_SPI_Start();
    Z_ST7735S_SetDC(1);
    Z_SPI_SwapByte(data);
    Z_SPI_End();
}

void Z_ST7735S_Send16bitsRGB(uint16_t rgb){
    Z_ST7735S_SendData(rgb>>8);
    Z_ST7735S_SendData(rgb);
}

接下來(lái)就可以開(kāi)始控制我們的屏幕了。

首先需要初始化,初始化的代碼廠家會(huì)提供,我們修改一下函數(shù)名為自己的就行,可以CTRL+F查找然后一鍵替換。

在初始化品ST7735S之前,我們還需要額外初始化一下DC和RST的GPIO口,這是SPI的初始化中沒(méi)有的。而且需要先拉低RST,等待至少10us(代碼中Delay了1ms),接著拉高RST,等待最多120ms,然后就可以開(kāi)始發(fā)送命令和參數(shù)去初始化ST7735S了。

可以查看手冊(cè)去看看初始化代碼中的命令是什么意思,然后根據(jù)自己的需求去修改對(duì)應(yīng)位置的參數(shù)即可。

void Z_ST7735S_Init(void){
    Z_SPI_Init();
    //除了上面SPI初始化的GPIO口,還需要額外初始化RST和DC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef itd;
    itd.GPIO_Mode=GPIO_Mode_Out_PP;                  
    itd.GPIO_Pin=Z_ST7735S_DC_GPIO|Z_ST7735S_RST_GPIO;     
    itd.GPIO_Speed=GPIO_Speed_50MHz;                    
    GPIO_Init(GPIOA,&itd);
    
    Z_ST7735S_SetRST(0);
    Delay_ms(1);
    Z_ST7735S_SetRST(1);
    Delay_ms(120);
    //廠家提供的固定的初始化代碼
    Z_ST7735S_SendCommand(0x11); //Sleep out 
    Delay_ms(120);              //Delay 120ms 
    //------------------------------------ST7735S Frame Rate-----------------------------------------// 
    Z_ST7735S_SendCommand(0xB1); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendCommand(0xB2); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendCommand(0xB3); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    //------------------------------------End ST7735S Frame Rate---------------------------------// 
    Z_ST7735S_SendCommand(0xB4); //Dot inversion 
    Z_ST7735S_SendData(0x03); 
    //------------------------------------ST7735S Power Sequence---------------------------------// 
    Z_ST7735S_SendCommand(0xC0); 
    Z_ST7735S_SendData(0x28); 
    Z_ST7735S_SendData(0x08); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendCommand(0xC1); 
    Z_ST7735S_SendData(0XC0); 
    Z_ST7735S_SendCommand(0xC2); 
    Z_ST7735S_SendData(0x0D); 
    Z_ST7735S_SendData(0x00); 
    Z_ST7735S_SendCommand(0xC3); 
    Z_ST7735S_SendData(0x8D); 
    Z_ST7735S_SendData(0x2A); 
    Z_ST7735S_SendCommand(0xC4); 
    Z_ST7735S_SendData(0x8D); 
    Z_ST7735S_SendData(0xEE); 
    //---------------------------------End ST7735S Power Sequence-------------------------------------// 
    Z_ST7735S_SendCommand(0xC5); //VCOM 
    Z_ST7735S_SendData(0x1A); 
    Z_ST7735S_SendCommand(0x36); //MX, MY, RGB mode 
    Z_ST7735S_SendData(0xC0); 
    //------------------------------------ST7735S Gamma Sequence---------------------------------// 
    Z_ST7735S_SendCommand(0xE0); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendData(0x22); 
    Z_ST7735S_SendData(0x07); 
    Z_ST7735S_SendData(0x0A); 
    Z_ST7735S_SendData(0x2E); 
    Z_ST7735S_SendData(0x30); 
    Z_ST7735S_SendData(0x25); 
    Z_ST7735S_SendData(0x2A); 
    Z_ST7735S_SendData(0x28); 
    Z_ST7735S_SendData(0x26); 
    Z_ST7735S_SendData(0x2E); 
    Z_ST7735S_SendData(0x3A); 
    Z_ST7735S_SendData(0x00); 
    Z_ST7735S_SendData(0x01); 
    Z_ST7735S_SendData(0x03); 
    Z_ST7735S_SendData(0x13); 
    Z_ST7735S_SendCommand(0xE1); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendData(0x16); 
    Z_ST7735S_SendData(0x06); 
    Z_ST7735S_SendData(0x0D); 
    Z_ST7735S_SendData(0x2D); 
    Z_ST7735S_SendData(0x26); 
    Z_ST7735S_SendData(0x23); 
    Z_ST7735S_SendData(0x27); 
    Z_ST7735S_SendData(0x27); 
    Z_ST7735S_SendData(0x25); 
    Z_ST7735S_SendData(0x2D); 
    Z_ST7735S_SendData(0x3B); 
    Z_ST7735S_SendData(0x00); 
    Z_ST7735S_SendData(0x01); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendData(0x13); 
    //------------------------------------End ST7735S Gamma Sequence-----------------------------// 
    Z_ST7735S_SendCommand(0x3A); //65k mode 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendCommand(0x29); //Display on 
}    

接下來(lái)我們就可以讓這塊屏幕顯示東西了。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

一般情況下我們僅僅是初始化之后沒(méi)有任何操作得到的結(jié)果是一塊花屏。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

發(fā)送了0x01的命令之后會(huì)得到一塊白屏。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

我這里不太確定,0x01是不是真的就是把屏幕復(fù)位成白屏,因?yàn)槲矣⑽牟缓?,中文翻譯的怪怪的,畢竟這個(gè)命令是軟件復(fù)位,人家可沒(méi)說(shuō)軟件復(fù)位是不是把屏幕復(fù)位成白屏。

而且文心一言也說(shuō)軟件復(fù)位這個(gè)命令可能使顯示出現(xiàn)黑屏或是異常。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

主要是我手上就一塊屏幕,沒(méi)法做比較,因此沒(méi)法判斷出白屏的原因,大家可以試一下自己的屏幕。

刷新整個(gè)屏幕

那么不用上面的命令,我們也不能頂著個(gè)花屏去顯示東西吧,因此我們封裝一個(gè)刷新整個(gè)屏幕的函數(shù),也就是把整個(gè)屏幕都指定為我們的區(qū)域,然后去把這個(gè)區(qū)域(整個(gè)屏幕)塞入同一個(gè)像素值,這樣就實(shí)現(xiàn)了刷新整個(gè)屏幕的效果。

//指定范圍
void Z_ST7735S_SpecifyScope(uint8_t xs,uint8_t xe,uint8_t ys,uint8_t ye){
    Z_ST7735S_SendCommand(0x2A);    //指定列范圍
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(xs);
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(xe);
    
    Z_ST7735S_SendCommand(0x2B);    //指定行范圍
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(ys);
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(ye);
    
    Z_ST7735S_SendCommand(0x2C);    //開(kāi)始內(nèi)存寫(xiě)入
}


void Z_ST7735S_RefreshAll(uint16_t rgb){
    Z_ST7735S_SpecifyScope(0,127,0,159);
    for(uint16_t j=0;j<160;++j){
        for(uint16_t i=0;i<128;++i){
            Z_ST7735S_Send16bitsRGB(rgb);
        }
    }
}

我這邊是分開(kāi)來(lái)了,先有個(gè)框選區(qū)域的函數(shù),發(fā)送的命令上面也介紹過(guò)了,大家應(yīng)該能看懂。

在RefreshAll這個(gè)函數(shù)中,先是調(diào)用了框選區(qū)域的的函數(shù)把整個(gè)屏幕都選中,然后再塞入固定的像素值,這樣就完成了刷新整個(gè)屏幕的效果。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

也可以把常用的顏色RGB數(shù)值改成宏定義方便使用。

顯示圖片

如果我們要展示圖片,那么流程也是類(lèi)似的,只不過(guò)是把要填充的像素點(diǎn)替換成圖片的像素。

我們可能用一些軟件去把要展示的圖片轉(zhuǎn)換為565RGB格式的像素點(diǎn),一般商家會(huì)提供,大家也可以關(guān)注我的公眾號(hào)“折途想要敲代碼”回復(fù)關(guān)鍵詞ST7735S獲取我整理的所有關(guān)于ST7735S的資料包括提取圖片像素的軟件以及后面用到的提取文字的軟件。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

參數(shù)調(diào)整好之后點(diǎn)擊保存,軟件就會(huì)把轉(zhuǎn)換后的像素值以數(shù)值的形式給我們整理出來(lái)。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

我們可以在我們的程序里包含它,也可以直接把整個(gè)數(shù)組復(fù)制。

接下來(lái)我們就直接把這個(gè)圖片展示出來(lái)。

void Z_ST7735S_ShowKun(void){
    Z_ST7735S_SpecifyScope(30,79,50,99);
    for(uint16_t i=0;i<5000;++i){
        Z_ST7735S_SendData(gImage_kun[i]);
    }
}

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

有幾個(gè)比較重要的點(diǎn)需要說(shuō)一下,第一就是我們生成的50*50的圖片,那像素點(diǎn)應(yīng)該是2500個(gè),而軟件給我們生成了5008大小的8bit的數(shù)組,這樣我們就需要每?jī)蓚€(gè)字節(jié)拼接成一個(gè)16位的像素(實(shí)際上不用拼接,我們直接使用發(fā)送8bit的參數(shù)的函數(shù)依次發(fā)出即可),但是5008/2=2504像素點(diǎn),因此是多了4個(gè)像素點(diǎn),我們就手動(dòng)把生成的數(shù)組的前八個(gè)元素(四個(gè)像素)刪掉即可。

否則就會(huì)看到我們的坤坤是向右偏移了一點(diǎn)的。

顯示文字

除了圖片以外,我們通常還需要展示文字,漢字太多了,一般就是要用什么漢字就去單獨(dú)取模。但是數(shù)字和字母比較少,我們可以取模完之后直接存進(jìn)程序里。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

它生成的數(shù)組不像上面圖片一樣我們可以直接使用,我們需要手動(dòng)調(diào)整一下,讓它變成可用的數(shù)組。

const unsigned char number[10][10]={
{0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00},/*"0",0*/
{0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x18,0x00},/*"1",1*/
{0x00,0x00,0x3C,0x42,0x02,0x0C,0x10,0x20,0x7E,0x00},/*"2",2*/
{0x00,0x00,0x3C,0x46,0x04,0x0C,0x02,0x42,0x3C,0x00},/*"3",3*/
{0x00,0x00,0x0C,0x14,0x24,0x44,0x7C,0x04,0x0C,0x00},/*"4",4*/
{0x00,0x00,0x3E,0x40,0x58,0x66,0x02,0x42,0x3C,0x00},/*"5",5*/
{0x00,0x00,0x3C,0x40,0x58,0x66,0x42,0x42,0x3C,0x00},/*"6",6*/
{0x00,0x00,0x7E,0x44,0x04,0x08,0x10,0x10,0x10,0x00},/*"7",7*/
{0x00,0x00,0x3C,0x42,0x62,0x3C,0x42,0x42,0x3C,0x00},/*"8",8*/
{0x00,0x00,0x3C,0x42,0x42,0x66,0x1A,0x04,0x78,0x00},/*"9",9*/
};


void Z_ST7735S_ShowChar(uint8_t x,uint8_t y,uint8_t ch,uint16_t rgb){
    if(ch>=10) return ;
    Z_ST7735S_SpecifyScope(x,x+7,y,y+9);
    for(uint8_t i=0;i<10;++i){
        uint8_t temp=number[ch][i];
        for(uint8_t j=0;j<8;++j){
            if((temp&0x80)!=0) Z_ST7735S_Send16bitsRGB(rgb);
            else Z_ST7735S_Send16bitsRGB(0x0000);
            temp<<=1;
        }
    }
}

int main(void){
    Z_ST7735S_Init();
    Z_ST7735S_RefreshAll(0x0000);
    while(1){
        
        Z_ST7735S_ShowChar(10,10,1,0xFFFF);
        Z_ST7735S_ShowChar(25,10,2,0xFFFF);
        Z_ST7735S_ShowChar(40,10,3,0xFFFF);
    }
}

?另外字符和圖片不一樣的地方在于,轉(zhuǎn)換后的字符得到的數(shù)值并不是像素點(diǎn),而是一排像素點(diǎn)。

我這邊設(shè)置的字符大小是8*10像素的,而轉(zhuǎn)換的數(shù)組里每個(gè)數(shù)值是10個(gè)8位數(shù)據(jù),因此每個(gè)數(shù)據(jù)就代表著一排的像素,因?yàn)樽址恍枰?6bit的RGB來(lái)表示顏色,只需要表示出對(duì)應(yīng)位置是否有顏色即可。

因此可以參考我上面的代碼,把數(shù)組里的數(shù)值按位取出,取出的是1,我們就往ST7735S傳遞一個(gè)自己選擇的RGB顏色,反之則傳遞一個(gè)與背景相同的顏色。

【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S),STM32F103,stm32,嵌入式硬件,單片機(jī),mcu,SPI

效果也還可以,可以通過(guò)軟件去調(diào)整字模的效果,我上面就演示了數(shù)字的用法,字母和漢字什么的也都大同小異,大家可以自己去試一試。

另外如果想要控制屏幕顯示一些形狀什么的,我這邊可以提供一點(diǎn)小思路,然后就不演示了(懶)。

如果我們指定區(qū)域的時(shí)候x和y軸的起始和結(jié)束坐標(biāo)都一致,那么是不是代表我們指定的區(qū)域就是一個(gè)點(diǎn),然后我們指定完區(qū)域之后再傳一個(gè)rgb16bit的參數(shù),就是描繪了一個(gè)點(diǎn)。

把畫(huà)一個(gè)點(diǎn)的函數(shù)封裝成函數(shù),然后再根據(jù)我們需要畫(huà)的形狀,比如說(shuō)是圓,經(jīng)過(guò)我們自己的數(shù)學(xué)計(jì)算,把圓的那個(gè)圈上畫(huà)滿(mǎn)一個(gè)個(gè)的點(diǎn),連起來(lái)看的效果就是一個(gè)點(diǎn)了。

但是我們也要知道,這樣子的效率比較低,效率高的方法還是一次性就選中一大片的區(qū)域,然后批量傳輸像素的數(shù)值。

當(dāng)然我這邊只是提供一種思路,大家只要知道ST7735S顯示的原理之后,接下來(lái)就可以自由地去編寫(xiě)自己的代碼了。

下面再貼一下完整的我寫(xiě)的SPI和ST7735S的驅(qū)動(dòng)代碼,里面的Delay.h就是延時(shí)函數(shù),不懂怎么寫(xiě)的小伙伴可以去看看我往期的文章。

【STM32F103】SysTick系統(tǒng)定時(shí)器&延時(shí)函數(shù)_stm32f103 延時(shí)-CSDN博客文章瀏覽閱讀1.1k次,點(diǎn)贊23次,收藏24次。SysTick是Cortex-M3內(nèi)核中的一個(gè)外設(shè),內(nèi)嵌在NVIC中,叫系統(tǒng)定時(shí)器。當(dāng)處理器在調(diào)試期間被喊停時(shí),SysTick也將暫停運(yùn)作。一共有四個(gè)寄存器,不過(guò)我們通常用前三個(gè),不需要校準(zhǔn)。下圖出自《STM32F10xxx Cortex-M3編程手冊(cè)》第237頁(yè)。_stm32f103 延時(shí)https://blog.csdn.net/m0_63235356/article/details/135116207?spm=1001.2014.3001.5501

大家也可以關(guān)注我的公眾號(hào)“折途想要敲代碼”回復(fù)關(guān)鍵詞“ST7735S”,即可免費(fèi)下載我整理好的ST7735S的相關(guān)資料以及取圖片和字模的軟件。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859728.html

完整代碼(封裝了一小部分)

#include "stm32f10x.h"                  // Device header
#include "Delay.h"


/*
SPI驅(qū)動(dòng)代碼
*/
#define Z_SPI_SS_GPIO GPIO_Pin_4
#define Z_SPI_SCK_GPIO GPIO_Pin_0
#define Z_SPI_MOSI_GPIO GPIO_Pin_1
#define Z_SPI_MISO_GPIO GPIO_Pin_9

void Z_SPI_SetSS(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_SPI_SS_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_SPI_SS_GPIO,Bit_SET);
}

void Z_SPI_SetSCK(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_SPI_SCK_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_SPI_SCK_GPIO,Bit_SET);
}

void Z_SPI_SetMOSI(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_SPI_MOSI_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_SPI_MOSI_GPIO,Bit_SET);
}

uint8_t Z_SPI_GetMISO(void){
    return GPIO_ReadInputDataBit(GPIOA,Z_SPI_MISO_GPIO);
}

//SPI初始化GPIO口
void Z_SPI_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    //SS SCK MOSI 都是推挽輸出
    GPIO_InitTypeDef itd;
    itd.GPIO_Mode=GPIO_Mode_Out_PP;                  
    itd.GPIO_Pin=Z_SPI_SS_GPIO|Z_SPI_SCK_GPIO|Z_SPI_MOSI_GPIO;     
    itd.GPIO_Speed=GPIO_Speed_50MHz;                    
    GPIO_Init(GPIOA,&itd);
    //MISO 是浮空輸入或者是上拉輸入
    itd.GPIO_Mode=GPIO_Mode_IPU;
    itd.GPIO_Pin=Z_SPI_MISO_GPIO;
    GPIO_Init(GPIOA,&itd);

    //SS默認(rèn)是不選中,即高電平
    Z_SPI_SetSS(1);
    //SCK默認(rèn)低電平,以便拼接后續(xù)交換字節(jié)的時(shí)序
    Z_SPI_SetSCK(0);
    //MOSI與MISO什么電平都無(wú)所謂.
}

//SPI開(kāi)始時(shí)序
void Z_SPI_Start(void){
    Z_SPI_SetSS(0);
}

//SPI結(jié)束時(shí)序
void Z_SPI_End(void){
    Z_SPI_SetSS(1);
}

//交換字節(jié)時(shí)序
uint8_t Z_SPI_SwapByte(uint8_t data){
    uint8_t receive=0x00;
    for(uint8_t i=0;i<8;++i){
        Z_SPI_SetMOSI(data&(0x80>>i));
        Z_SPI_SetSCK(1);
        if(Z_SPI_GetMISO()==1) receive|=(0x80>>i);
        Z_SPI_SetSCK(0);
    }
    return receive;
}

/*
ST7725S驅(qū)動(dòng)代碼
*/
#define Z_ST7735S_RST_GPIO GPIO_Pin_2
#define Z_ST7735S_DC_GPIO GPIO_Pin_3

void Z_ST7735S_SetRST(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_ST7735S_RST_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_ST7735S_RST_GPIO,Bit_SET);
}

void Z_ST7735S_SetDC(uint8_t val){
    if(val==0) GPIO_WriteBit(GPIOA,Z_ST7735S_DC_GPIO,Bit_RESET);
    else GPIO_WriteBit(GPIOA,Z_ST7735S_DC_GPIO,Bit_SET);
}

void Z_ST7735S_SendCommand(uint8_t command){
    Z_SPI_Start();
    Z_ST7735S_SetDC(0);
    Z_SPI_SwapByte(command);
    Z_SPI_End();
}

void Z_ST7735S_SendData(uint8_t data){
    Z_SPI_Start();
    Z_ST7735S_SetDC(1);
    Z_SPI_SwapByte(data);
    Z_SPI_End();
}

void Z_ST7735S_Send16bitsRGB(uint16_t rgb){
    Z_ST7735S_SendData(rgb>>8);
    Z_ST7735S_SendData(rgb);
}

void Z_ST7735S_Init(void){
    Z_SPI_Init();
    //除了上面SPI初始化的GPIO口,還需要額外初始化RST和DC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef itd;
    itd.GPIO_Mode=GPIO_Mode_Out_PP;                  
    itd.GPIO_Pin=Z_ST7735S_DC_GPIO|Z_ST7735S_RST_GPIO;     
    itd.GPIO_Speed=GPIO_Speed_50MHz;                    
    GPIO_Init(GPIOA,&itd);
    
    Z_ST7735S_SetRST(0);
    Delay_ms(1);
    Z_ST7735S_SetRST(1);
    Delay_ms(120);
    //廠家提供的固定的初始化代碼
    Z_ST7735S_SendCommand(0x11); //Sleep out 
    Delay_ms(120);              //Delay 120ms 
    //------------------------------------ST7735S Frame Rate-----------------------------------------// 
    Z_ST7735S_SendCommand(0xB1); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendCommand(0xB2); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendCommand(0xB3); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendData(0x3C); 
    Z_ST7735S_SendData(0x3C); 
    //------------------------------------End ST7735S Frame Rate---------------------------------// 
    Z_ST7735S_SendCommand(0xB4); //Dot inversion 
    Z_ST7735S_SendData(0x03); 
    //------------------------------------ST7735S Power Sequence---------------------------------// 
    Z_ST7735S_SendCommand(0xC0); 
    Z_ST7735S_SendData(0x28); 
    Z_ST7735S_SendData(0x08); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendCommand(0xC1); 
    Z_ST7735S_SendData(0XC0); 
    Z_ST7735S_SendCommand(0xC2); 
    Z_ST7735S_SendData(0x0D); 
    Z_ST7735S_SendData(0x00); 
    Z_ST7735S_SendCommand(0xC3); 
    Z_ST7735S_SendData(0x8D); 
    Z_ST7735S_SendData(0x2A); 
    Z_ST7735S_SendCommand(0xC4); 
    Z_ST7735S_SendData(0x8D); 
    Z_ST7735S_SendData(0xEE); 
    //---------------------------------End ST7735S Power Sequence-------------------------------------// 
    Z_ST7735S_SendCommand(0xC5); //VCOM 
    Z_ST7735S_SendData(0x1A); 
    Z_ST7735S_SendCommand(0x36); //MX, MY, RGB mode 
    Z_ST7735S_SendData(0xC0); 
    //------------------------------------ST7735S Gamma Sequence---------------------------------// 
    Z_ST7735S_SendCommand(0xE0); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendData(0x22); 
    Z_ST7735S_SendData(0x07); 
    Z_ST7735S_SendData(0x0A); 
    Z_ST7735S_SendData(0x2E); 
    Z_ST7735S_SendData(0x30); 
    Z_ST7735S_SendData(0x25); 
    Z_ST7735S_SendData(0x2A); 
    Z_ST7735S_SendData(0x28); 
    Z_ST7735S_SendData(0x26); 
    Z_ST7735S_SendData(0x2E); 
    Z_ST7735S_SendData(0x3A); 
    Z_ST7735S_SendData(0x00); 
    Z_ST7735S_SendData(0x01); 
    Z_ST7735S_SendData(0x03); 
    Z_ST7735S_SendData(0x13); 
    Z_ST7735S_SendCommand(0xE1); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendData(0x16); 
    Z_ST7735S_SendData(0x06); 
    Z_ST7735S_SendData(0x0D); 
    Z_ST7735S_SendData(0x2D); 
    Z_ST7735S_SendData(0x26); 
    Z_ST7735S_SendData(0x23); 
    Z_ST7735S_SendData(0x27); 
    Z_ST7735S_SendData(0x27); 
    Z_ST7735S_SendData(0x25); 
    Z_ST7735S_SendData(0x2D); 
    Z_ST7735S_SendData(0x3B); 
    Z_ST7735S_SendData(0x00); 
    Z_ST7735S_SendData(0x01); 
    Z_ST7735S_SendData(0x04); 
    Z_ST7735S_SendData(0x13); 
    //------------------------------------End ST7735S Gamma Sequence-----------------------------// 
    Z_ST7735S_SendCommand(0x3A); //65k mode 
    Z_ST7735S_SendData(0x05); 
    Z_ST7735S_SendCommand(0x29); //Display on 
}    

//指定范圍
void Z_ST7735S_SpecifyScope(uint8_t xs,uint8_t xe,uint8_t ys,uint8_t ye){
    Z_ST7735S_SendCommand(0x2A);    //指定列范圍
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(xs);
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(xe);
    
    Z_ST7735S_SendCommand(0x2B);    //指定行范圍
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(ys);
    Z_ST7735S_SendData(0x00);
    Z_ST7735S_SendData(ye);
    
    Z_ST7735S_SendCommand(0x2C);    //開(kāi)始內(nèi)存寫(xiě)入
}


void Z_ST7735S_RefreshAll(uint16_t rgb){
    Z_ST7735S_SpecifyScope(0,128,0,160);
    for(uint16_t j=0;j<160;++j){
        for(uint16_t i=0;i<128;++i){
            Z_ST7735S_Send16bitsRGB(rgb);
        }
    }
}

const unsigned char number[10][10]={
{0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00},/*"0",0*/
{0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x18,0x00},/*"1",1*/
{0x00,0x00,0x3C,0x42,0x02,0x0C,0x10,0x20,0x7E,0x00},/*"2",2*/
{0x00,0x00,0x3C,0x46,0x04,0x0C,0x02,0x42,0x3C,0x00},/*"3",3*/
{0x00,0x00,0x0C,0x14,0x24,0x44,0x7C,0x04,0x0C,0x00},/*"4",4*/
{0x00,0x00,0x3E,0x40,0x58,0x66,0x02,0x42,0x3C,0x00},/*"5",5*/
{0x00,0x00,0x3C,0x40,0x58,0x66,0x42,0x42,0x3C,0x00},/*"6",6*/
{0x00,0x00,0x7E,0x44,0x04,0x08,0x10,0x10,0x10,0x00},/*"7",7*/
{0x00,0x00,0x3C,0x42,0x62,0x3C,0x42,0x42,0x3C,0x00},/*"8",8*/
{0x00,0x00,0x3C,0x42,0x42,0x66,0x1A,0x04,0x78,0x00},/*"9",9*/
};


void Z_ST7735S_ShowChar(uint8_t x,uint8_t y,uint8_t ch,uint16_t rgb){
    if(ch>=10) return ;
    Z_ST7735S_SpecifyScope(x,x+7,y,y+9);
    for(uint8_t i=0;i<10;++i){
        uint8_t temp=number[ch][i];
        for(uint8_t j=0;j<8;++j){
            if((temp&0x80)!=0) Z_ST7735S_Send16bitsRGB(rgb);
            else Z_ST7735S_Send16bitsRGB(0x0000);
            temp<<=1;
        }
    }
}

int main(void){
    Z_ST7735S_Init();
    Z_ST7735S_RefreshAll(0x0000);
    while(1){
        
    }
}


                                            

到了這里,關(guān)于【快速上手STM32】SPI通信協(xié)議&&1.8寸TFT-LCD(ST7735S)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32使用軟件SPI協(xié)議操作TFT18彩屏

    STM32使用軟件SPI協(xié)議操作TFT18彩屏

    時(shí)間記錄:2024/2/20 (1)SPI設(shè)備通過(guò)4根線進(jìn)行通信,CS片選線,選擇從設(shè)備,SCK時(shí)鐘線,由主設(shè)備產(chǎn)生時(shí)鐘,主機(jī)MOSI線連從機(jī)MISO線,由主機(jī)向從機(jī)發(fā)送信息,主機(jī)MISO線連接從機(jī)MOSI線,由從機(jī)向主機(jī)發(fā)送信息 (2)SPI分為4種通信方式 模式0:CPOL=0,CPHA=0,空閑時(shí)SCK時(shí)鐘線為低

    2024年02月21日
    瀏覽(23)
  • STM32 硬件SPI+DMA實(shí)現(xiàn)快速刷TFT屏

    STM32 硬件SPI+DMA實(shí)現(xiàn)快速刷TFT屏

    首先在TB上找一塊SPI驅(qū)動(dòng)的彩屏,下載商家提供的示例 例如我買(mǎi)的一款2.8寸SPI的TFT彩屏,商家提供的資料很齊全,模擬SPI和硬件SPI驅(qū)動(dòng)的程序都有 打開(kāi)硬件SPI驅(qū)動(dòng)的工程,商家提供的代碼是SPI2驅(qū)動(dòng),想換成其他的SPI可以到SPI.c文件中更改 打開(kāi)main.c,測(cè)試一下簡(jiǎn)單顏色填充刷

    2024年04月15日
    瀏覽(114)
  • stm32驅(qū)動(dòng)st7789 TFT-LCD屏幕顯示

    stm32驅(qū)動(dòng)st7789 TFT-LCD屏幕顯示

    一切程序以最后百度網(wǎng)盤(pán)鏈接的程序?yàn)闇?zhǔn),可能在寫(xiě)文章的時(shí)候有些地方有改動(dòng)。 主控:STM32F103C8T6 1.69 TFT-LCD(st7789驅(qū)動(dòng)) 1.1接線說(shuō)明 1.2硬件初始化 TFT-LCD是采用SPI通信的,這里使用stm32f103c8t6的SPI1,初始化代碼如下 1.3驅(qū)動(dòng)初始化 在原有的驅(qū)動(dòng)基礎(chǔ)上增加了幾個(gè)宏去控制顯

    2024年02月16日
    瀏覽(34)
  • STM32(HAL庫(kù))驅(qū)動(dòng)(1.44寸)TFT-LCD彩屏

    STM32(HAL庫(kù))驅(qū)動(dòng)(1.44寸)TFT-LCD彩屏

    目錄 1、簡(jiǎn)介 2、CubeMX初始化配置 2.1 基礎(chǔ)配置 2.1.1 SYS配置 ?2.1.2 RCC配置 2.2 屏幕引腳配置 2.3 項(xiàng)目生成 ?3、KEIL端程序整合 3.1 LCD驅(qū)動(dòng)添加 3.2?函數(shù)修改 3.2.1?lcd.h修改 3.2.2 lcd_innit.h?修改 ?3.2.3 lcd.c修改 ?3.2.4?lcd_inut.c修改 ?3.3?主函數(shù)代碼 3.3.1 添加頭文件 3.3.2?LCD進(jìn)行初始化

    2024年02月03日
    瀏覽(29)
  • STM32CubeMX教程22 FSMC - 8080并行接口TFT-LCD驅(qū)動(dòng)

    開(kāi)發(fā)板(正點(diǎn)原子stm32f407探索者開(kāi)發(fā)板V2.4) STM32CubeMX軟件(Version 6.10.0) 野火DAP仿真器 keil μVision5 IDE(MDK-Arm) ST-LINK/V2驅(qū)動(dòng) XCOM V2.6串口助手 使用STM32CubeMX軟件配置STM32F407開(kāi)發(fā)板 FSMC接口驅(qū)動(dòng)8080并行接口TFT-LCD顯示 ,具體為使用FSMC Bank 1-NOR/PSRAM4,片選信號(hào)為NE4(PG12),TFT-L

    2024年01月23日
    瀏覽(31)
  • 【【STM32-SPI通信協(xié)議】】

    【【STM32-SPI通信協(xié)議】】

    STM32-SPI通信協(xié)議 ?SPI(Serial Peripheral Interface)是由Motorola公司開(kāi)發(fā)的一種通用數(shù)據(jù)總線 ?四根通信線:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select) ?同步,全雙工 ?支持總線掛載多設(shè)備(一主多從) 既然是同步的,我們就會(huì)發(fā)

    2024年02月12日
    瀏覽(41)
  • STM32使用SPI協(xié)議主從通信

    STM32使用SPI協(xié)議主從通信

    目錄 前言 一、理論部分? ??? SPI簡(jiǎn)介?? SPI特征 SPI物理層 SPI協(xié)議層 SPI配置過(guò)程 SPI數(shù)據(jù)發(fā)送與接收過(guò)程 二、代碼部分 主機(jī)代碼 從機(jī)代碼 這是一篇學(xué)習(xí)筆記,記錄自己學(xué)習(xí)SPI通信。方便之后運(yùn)用的時(shí)候回顧。參考《STM32中文參考手冊(cè)》 ?????????SPI 協(xié)議是由摩托羅拉公

    2024年02月13日
    瀏覽(23)
  • 【正點(diǎn)原子STM32連載】 第二十五章 TFT-LCD(MCU屏)實(shí)驗(yàn) 摘自【正點(diǎn)原子】STM32F103 戰(zhàn)艦開(kāi)發(fā)指南V1.2

    【正點(diǎn)原子STM32連載】 第二十五章 TFT-LCD(MCU屏)實(shí)驗(yàn) 摘自【正點(diǎn)原子】STM32F103 戰(zhàn)艦開(kāi)發(fā)指南V1.2

    1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子stm32f103戰(zhàn)艦開(kāi)發(fā)板V4 2)平臺(tái)購(gòu)買(mǎi)地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套實(shí)驗(yàn)源碼+手冊(cè)+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html 前面我們介紹了OLED模塊及其顯示,但是該模塊只能顯示單色/雙色,不能顯示彩色,而且尺寸也較小

    2024年02月11日
    瀏覽(33)
  • STM32 SPI通信協(xié)議1——協(xié)議基本原理及管腳定義

    STM32 SPI通信協(xié)議1——協(xié)議基本原理及管腳定義

    ????????SPI全稱(chēng)為 Serial Peripheral interface ,譯為 串行外圍設(shè)備接口 。SPI主要應(yīng)用在EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)編碼器之間。 ? ? ? ? SPI是一種高速,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,

    2024年01月25日
    瀏覽(26)
  • 【STM32學(xué)習(xí)】——SPI通信協(xié)議&SPI時(shí)序&W25Q64存儲(chǔ)芯片&軟件SPI讀寫(xiě)

    【STM32學(xué)習(xí)】——SPI通信協(xié)議&SPI時(shí)序&W25Q64存儲(chǔ)芯片&軟件SPI讀寫(xiě)

    目錄 前言 一、SPI通信協(xié)議 1.概述? 2.硬件電路 ?3.移位示意圖 二、SPI時(shí)序 1.時(shí)序基本單元 2.完整時(shí)序波形 三、W25Q64存儲(chǔ)芯片 1.芯片簡(jiǎn)介 ?2.硬件電路引腳定義 ?3.芯片框圖 4.Flash操作注意事項(xiàng) 四、軟件SPI讀寫(xiě)W25Q64 五、SPI通信外設(shè) 總結(jié) 聲明:學(xué)習(xí)筆記來(lái)自江科大自化協(xié)B站教

    2024年02月09日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包