//LCD Init For 1.44Inch LCD Panel with ST7735.
void Lcd_Init(void)
{
LCD_GPIO_Init();
Lcd_Reset(); //Reset before LCD Init.
//LCD Init For 1.44Inch LCD Panel with ST7735.
Lcd_WriteCmd(0x11);//Sleep exit
delay_ms (120);
/*1.若你為了快速完成作業需求,只需要理解功能即可
直接復制粘貼下面代碼,會移植就0K.
2.若你有大把的空閑時間(學生),建議還是學會翻閱Datasheet
弄清原理,打好基礎,深入了解液晶屏的底層驅動
3.精通一種型號屏的底層驅動,萬變不離其中,其他屏也信手拈來*/
//ST7735R Frame Rate
Lcd_WriteCmd(0xB1);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteCmd(0xB2);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteCmd(0xB3);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteCmd(0xB4); //Column inversion
Lcd_WriteData(0x07);
//ST7735R Power Sequence
Lcd_WriteCmd(0xC0);
Lcd_WriteData(0xA2);
Lcd_WriteData(0x02);
Lcd_WriteData(0x84);
Lcd_WriteCmd(0xC1);
Lcd_WriteData(0xC5);
Lcd_WriteCmd(0xC2);
Lcd_WriteData(0x0A);
Lcd_WriteData(0x00);
Lcd_WriteCmd(0xC3);
Lcd_WriteData(0x8A);
Lcd_WriteData(0x2A);
Lcd_WriteCmd(0xC4);
Lcd_WriteData(0x8A);
Lcd_WriteData(0xEE);
Lcd_WriteCmd(0xC5); //VCOM
Lcd_WriteData(0x0E);
Lcd_WriteCmd(0x36); //MX, MY, RGB mode
Lcd_WriteData(0xC0);
//ST7735R Gamma Sequence
Lcd_WriteCmd(0xe0);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1a);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x18);
Lcd_WriteData(0x2f);
Lcd_WriteData(0x28);
Lcd_WriteData(0x20);
Lcd_WriteData(0x22);
Lcd_WriteData(0x1f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x23);
Lcd_WriteData(0x37);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x02);
Lcd_WriteData(0x10);
Lcd_WriteCmd(0xe1);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x17);
Lcd_WriteData(0x33);
Lcd_WriteData(0x2c);
Lcd_WriteData(0x29);
Lcd_WriteData(0x2e);
Lcd_WriteData(0x30);
Lcd_WriteData(0x30);
Lcd_WriteData(0x39);
Lcd_WriteData(0x3f);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x03);
Lcd_WriteData(0x10);
Lcd_WriteCmd(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00);
Lcd_WriteData(0x7f);
Lcd_WriteCmd(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00);
Lcd_WriteData(0x9f);
Lcd_WriteCmd(0xF0); //Enable test command
Lcd_WriteData(0x01);
Lcd_WriteCmd(0xF6); //Disable ram power save mode
Lcd_WriteData(0x00);
Lcd_WriteCmd(0x3A); //65k mode
Lcd_WriteData(0x05);
Lcd_WriteCmd(0x29);//Display on
}
ST7735S------>Datasheet鏈接:https://pan.baidu.com/s/1tBDSJ4NsbFSTCXCxqnkzAg 提取碼:uapn
建議先看看:苦練基本功《如何閱讀看懂一篇Datasheet》
1.查閱Datasheet的96頁COMMAND的篇章

Datasheet96頁,在Instruction一欄中,看到SWRESET(Software Reset簡寫),再看D/CX一欄寫為0,即低電平,即表示命令(而D/CX高電平表示資料),及其后面所對應的功能Software Reset,直譯為“軟體復位”,實際也就是“螢屏重置”的功能,資料傳送有8位D7-D0,十六進制表示(Hex)為0x01,
1.很多Datasheet中(甚至計算機領域)很多命名都遵守見名知意的約定,讓人一下就能猜出它的意思,可讀性極高,
2.D/CX---->D表示Data資料的意思,C表示Command命令的意思
3.還有我們常說的片選信號CS------>Chip Select
4.R/W計算機術語---->讀和寫操作
5.還有專業Datasheet的,會在芯片引腳圖(就以D/C為例)C的頭上加上一撇,表示低電平有效,這讓閱讀Datasheet的工程師快速在圖中獲取資訊,必要時才去看文字介紹 ,正所謂–>先看目錄,后看內容,先看圖,后看文字
現在我寫個命令
void Lcd_WriteCmd(u8 Cmd)
Lcd_WriteCmd(0x01);//表示螢屏重置
現在我們完成一個挑戰,如何去讀TFT螢屏的ID
OK,看到RDDID,功能介紹為Read Display ID,看到D/Cx為0,知道是–>寫命令,按照D7-D0的順序HEX為0x04.
Lcd_WriteCmd(0x04);//表示Read Display ID 讀取ID
方法交給你們了,就自行探索了,不要怕英文,Datasheet專業術語都是固定的,Voltage總是萬年的電壓,Current總是萬年的電流,Current當時我在Datasheet中認為是形容詞------>”當前的“ , 被我大學老師笑話了一頓,每次看到這個單詞,腦海中總是浮現那個情景,哈哈!
2.程式實戰軟體模擬SPI
//SCL--->主機的時鐘信號
void SPI_WriteData(u8 Data)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
if(Data&0x80)
LCD_SDA_HIGH;
else
LCD_SDA_LOW;
LCD_SCL_LOW;
LCD_SCL_HIGH; //表示SCL時鐘信號處于上升沿,開始一位資料傳送
Data<<=1;
}
}
/*在上面SPI_WriteData()函式基礎上再進行封裝,在CS片選信號拉低的情況下,
操作D/C----->(96頁Datasheet中,高電平表示資料,低電平表示命令)
分別封裝成寫命令Lcd_WriteCmd(Cmd)函式和寫資料Lcd_WriteData(Data)函式*/
//RS命令和資料切換,命令低電平有效,資料高電平有效
void Lcd_WriteCmd(u8 Cmd)
{
LCD_CS_LOW;//CS片選信號低電平有效
LCD_DC_LOW; //命令
SPI_WriteData(Cmd);
LCD_CS_HIGH;
}
void Lcd_WriteData(u8 Data)
{
LCD_CS_LOW;
LCD_DC_HIGH; //資料
SPI_WriteData(Data);
LCD_CS_HIGH;
}
/*在SPI_WriteData()基礎上封裝成16bit處理*/
void Lcd_WriteData_16bit(u16 Data)
{
LCD_CS_LOW;
LCD_DC_HIGH;
SPI_WriteData(Data>>8);//
SPI_WriteData(Data);
LCD_CS_HIGH;
}
/*同時寫命令和資料*/
void Lcd_WriteReg(u8 Cmd,u8 Data)
{
Lcd_WriteCmd(Cmd);
Lcd_WriteData(Data);
}
3.查閱Datasheet的97頁COMMAND的篇章

通過對Datasheet中的command篇章的配置資訊,可幫助我們對TFT液晶屏上完成我們想要的功能配置
1.Column Address Set 列地址設定(Datasheet中Instruction簡寫為CASET,后方Function一欄有更詳細的功能介紹)
2.Row Address Set 行地址設定 (Datasheet中Instruction簡寫為RASET)
3.Memory Write(Datasheet中Instruction簡寫為RAMWR)
Lcd_WriteCmd(0x2A); //列地址設定命令
Lcd_WriteCmd(0x2B); //行地址設定命令
Lcd_WriteCmd(0x2C); //Memory Write填充
/*************************************************
函式名:LCD_Set_Region
功能:設定lcd顯示區域,在此區域寫點資料自動換行
入口引數:xy起點和終點
回傳值:無
*************************************************/
void Lcd_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end)
{
Lcd_WriteCmd(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(x_start);//Lcd_WriteData(x_start+2);
Lcd_WriteData(0x00);
Lcd_WriteData(x_end+2);
Lcd_WriteCmd(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y_start+0);
Lcd_WriteData(0x00);
Lcd_WriteData(y_end+1);
Lcd_WriteCmd(0x2c);
}
????計算機最讓人著迷之處,也是最偉大的思想之一就是“封裝”,當然也為后來者的學習道路留下了重重障礙,頗有一種“只見樹木,不見森林”的現象,容易為了細節而迷失其中,迷霧重重,
????在《Linux kernel development》一文中,序言有這樣一句話:但是所有人都必須直面一個問題:內核的學習曲線變得越來越長,也越來越陡峭,系統規模不斷擴大,復雜程度不斷提高,雖然現在的內核開發者對內核的掌握越發爐火純青,但新手卻無法跟上內核發展的步伐,長此以往將出現青黃不接的斷層,
????最近知乎看到這句話(鄭培柱 - 知乎 (zhihu.com)—>“對于求知欲特別強的人,有時候一定要學會“淺嘗輒止”,充分利用前輩經驗,避免陷入技術的誤區,比如放著公式不用,非得自己用二重積分推導一遍,”說的簡直不能再好,當初我也是這樣跌跌撞撞過來的,很有感觸,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395244.html
標籤:其他
