一、背景知識(shí)--顯示器
1.什么是TFT
(1)LCD顯示器的構(gòu)成:液晶面板+驅(qū)動(dòng)器【電壓驅(qū)動(dòng)】+控制器【邏輯控制】
(2)液晶面板大致分為:TN,TFT,IPS等
(3)驅(qū)動(dòng)器是跟隨面板的【帶動(dòng)液晶分子運(yùn)動(dòng)】,和面板更相關(guān),跟編程無(wú)關(guān)
(4)控制器的邏輯部分,和編程嚴(yán)重相關(guān)
2.LCD和LCM
(1)LCM就是LCD module(LCD模組),就是液晶面板+驅(qū)動(dòng)器(+控制器)的一套硬件模板
(2)LCD俠義僅僅指液晶面板,廣義指LCM
(3)商業(yè)組成:面板廠家,驅(qū)動(dòng)器廠家1,控制器IC廠家,LCM廠家,SoC廠家
3.LCD控制器
(1)顯示器編程時(shí)控制器是關(guān)鍵,至少80%精力在研究控制器手冊(cè)上
(2)有些LCM自帶控制器【自帶顯存】,控制器提供解開(kāi)和外部SoC對(duì)接(I80接口或者RGB接口或其他接口)
(3)有些LCM本身不帶控制器,需要外部SoC或者GPU【顯卡】來(lái)提供控制器(和顯存)。
一般是小屏幕(2.4存或者更?。┙o單片機(jī)用的,顯示內(nèi)容簡(jiǎn)單,刷新率低都是自帶控制器的;---》自帶控制器
而大屏幕的(比如4.3寸,7寸或者更大)給嵌入式設(shè)備使用,顯示內(nèi)容復(fù)雜,刷新率高的都是不帶控制器的,需要外部來(lái)提供控制器驅(qū)動(dòng)信號(hào)。--》不帶控制器
二、背景知識(shí)---顏色
1.顏色基礎(chǔ)知識(shí)
(1)自然界的顏色有無(wú)限種
(2)計(jì)算機(jī)中只能顯示出有限種,所以有6萬(wàn)色【65536】,24位色(真彩色),黑白,1位色等多種圖像
(3)人眼是并不精確的顏色識(shí)別設(shè)備,分辨率不高,還要視覺(jué)暫留
(4)所有顏色可以由RGB三原色疊加組成【256*256*256】
(5)圖像簡(jiǎn)單分為2種:黑白圖像又稱為灰度圖,彩色圖像
2.計(jì)算機(jī)中顏色的表示方法
(1)計(jì)算機(jī)中顏色顯示的單位是像素
(2)每一個(gè)像素由1/4/8/16/24【RGB】/32等個(gè)二進(jìn)制位來(lái)表示【24位:RGB,32位:ARGB--》A:表示透明度】
(3)常用:LCD1602/12864【1位色】,RGB565【16位--》6萬(wàn)色】,RGB888【24位--》真彩色】
3.LCD顯示器編程的一般規(guī)律
(1)低層硬件接好
(2)LCD控制器一通初始化
(3)顯存(framebuffer,GRAM【圖像RAM】)是關(guān)鍵,編程的核心就是如何正確填充顯存
(4)顯存由LCM或者SoC一側(cè)提供
三、本章的學(xué)習(xí)方式
1.搞清楚自己的LCD是什么類型的
本次使用的是ILI9325D
2.對(duì)比參照著看資料
1.原理圖
2.LCD數(shù)據(jù)手冊(cè)
ILI9325 pdf, ILI9325 Description, ILI9325 Datasheet, ILI9325 view ::: ALLDATASHEET :::
3.學(xué)會(huì)抓和放
(1)抓低層時(shí)序
(2)抓顯存操作
(3)抓數(shù)據(jù)手冊(cè)解讀
(4)抓顯存填充函數(shù)編寫(xiě)與調(diào)試
(5)放控制器初始化序列
四、控制器數(shù)據(jù)手冊(cè)【HX8347-D】
ILI9325 pdf, ILI9325 Description, ILI9325 Datasheet, ILI9325 view ::: ALLDATASHEET :::
HX8347-D datasheet
1.基本信息
1)RGB565模式:65,536(R(5),G(6),B(5))colors
2)接口: i80 system interface with 16-bit bus w【使用16bit的接口】
3)內(nèi)部的bit:240*320*18bit=1382400bit【按照顯示18位最大位來(lái)計(jì)算】
? ? ? ? 實(shí)際用了240*320*16bit
2.引腳定義
1.IM:接線類型:16bit
2.NCS(chip select):片選--引腳電平【負(fù)邏輯】
負(fù)邏輯的CS【0表示選中,1表示未選中】
3.NWR/SCL:寫(xiě)入數(shù)據(jù)【選中數(shù)據(jù)傳輸方式】
NWR:并行傳輸
SCL:串行傳輸
4.NRD:讀取數(shù)據(jù)
5.nRESET:軟件復(fù)位
初始化時(shí)候給ILI9325一個(gè)低電平
6.SDA:數(shù)據(jù)傳輸線
7.DNC_SCL:選擇傳輸數(shù)據(jù)/命令
DNC:表示傳輸命令/數(shù)據(jù)
SCL:時(shí)鐘周期
8.DB17-0:傳輸數(shù)據(jù)線
9.RCM1, RCM0
0x:x表示1或者0都可以
3.System interface circuit
4.Parallel bus system interface
5.定義引腳
如果我們不知道對(duì)應(yīng)的線應(yīng)該對(duì)應(yīng)原理圖的那一條,則對(duì)應(yīng)相關(guān)代碼去找
NCS【復(fù)位】--》原理圖:LCD_EN--》CS【0表示未選中,1表示選中】
DNC_SCL【選擇DNC還是SCL】:原理圖:LCD_RS【1表示傳輸cmd,0表示傳輸數(shù)據(jù)】
NRD_E【可讀接口】:原理圖:LCD_CS1
NWR_RNW【可寫(xiě)接口】:原理圖LCD_WR
DB7-0:數(shù)據(jù)傳輸
//TFTLCD彩屏數(shù)據(jù)控制端口定義
#define TFT_DATAPORTH P1
#define TFT_DATAPORTL P0
sbit TFT_CS = P2^7;//LCD_EN----NCS
sbit TFT_RST = P3^3;//SD-CS
sbit TFT_RS = P2^6;//LCD_RS
sbit TFT_WR = P2^5;//LCD_WR
sbit TFT_RD = P3^2;//DI
6.Write to the register:寫(xiě)命令
void TFT_WriteRegister(unsigned char cmd){
TFT_CS=0;//原來(lái)狀態(tài)為0
TFT_RD=1;//因?yàn)榇藭r(shí)是寫(xiě)寄存器,所以讀用不上
TFT_RS=0;//表示此時(shí)讀取的是命令(cmd)
TFT_DATAPORTH=cmd>>8;//高8位
TFT_DATAPORTL=cmd;//低八位
TFT_WR=0;//準(zhǔn)備讀取數(shù)據(jù)
TFT_WR=1;//讀取結(jié)束
TFT_CS=1;//記得讀完后將CS拉高
}
7.Write to the graphic RAM:寫(xiě)數(shù)據(jù)
void TFT_WriteRegister(unsigned char dat){
TFT_CS=0;//原來(lái)狀態(tài)為0
TFT_RD=1;//因?yàn)榇藭r(shí)是寫(xiě)寄存器,所以讀用不上
TFT_RS=1;//表示此時(shí)讀取的是數(shù)據(jù)
TFT_DATAPORTH=dat>>8;//高8位
TFT_DATAPORTL=dat;//低八位
TFT_WR=0;//準(zhǔn)備讀取數(shù)據(jù)
TFT_WR=1;//讀取結(jié)束
TFT_CS=1;//記得讀完后將CS拉高
}
8.將寫(xiě)命令和寫(xiě)數(shù)據(jù)函數(shù)合并
void TFT_WriteReg(unsigned int reg,unsigned int dat){
TFT_CS=0;//原來(lái)狀態(tài)為0
//寫(xiě)寄存器地址到IR
TFT_RD=1;//因?yàn)榇藭r(shí)是寫(xiě)寄存器,所以讀用不上
TFT_RS=0;//表示此時(shí)讀取的是命令(cmd)
TFT_DATAPORTH=reg>>8;//高8位
TFT_DATAPORTL=reg;//低八位
TFT_WR=0;//準(zhǔn)備讀取數(shù)據(jù)
TFT_WR=1;//讀取結(jié)束
//寫(xiě)寄存器值到該寄存器地址
TFT_RD=1;//因?yàn)榇藭r(shí)是寫(xiě)寄存器,所以讀用不上
TFT_RS=1;//表示此時(shí)讀取的是數(shù)據(jù)
TFT_DATAPORTH=dat>>8;//高8位
TFT_DATAPORTL=dat;//低八位
TFT_WR=0;//準(zhǔn)備讀取數(shù)據(jù)
TFT_WR=1;//讀取結(jié)束
TFT_CS=1;//記得讀完后將CS拉高
}
9.顏色數(shù)據(jù)的編碼
我們采用16bit
set_TFT_8B_REG(0x17,0x05);
10.Display Data GRAM;顯存
1.地址計(jì)數(shù)器
2.顯示模式
11.Command set:命令集
五、應(yīng)用層代碼分析和移植
1.寫(xiě)指令
//寫(xiě)命令
void TFT_WriteCmd(unsigned int cmd)
{
TFT_CS=0;
TFT_RD=1;
TFT_RS=0;
TFT_DATAPORTH=cmd>>8; // 高8位
TFT_DATAPORTL=cmd; // 低8位
TFT_WR=0;
TFT_WR=1;
TFT_CS=1;
}
//寫(xiě)數(shù)據(jù)
void TFT_WriteData(unsigned int dat)
{
TFT_CS=0;
TFT_RD=1;
TFT_RS=1;
TFT_DATAPORTH=dat>>8; // 數(shù)據(jù)高8位
TFT_DATAPORTL=dat; // 數(shù)據(jù)低8位
TFT_WR=0;;
TFT_WR=1;
TFT_CS=1;
}
2.初始化
// LCD模組的初始化時(shí)序--官方代碼
void TFT_Init(void)
{
TFT_RST = 1;
Delay(100);
TFT_RST = 0;
Delay(800);
TFT_RST = 1;
Delay(800);
TFT_CS = 0;
//************* Start Initial Sequence **********//
TFT_WriteCmd(0x002e);TFT_WriteData(0x0079);
TFT_WriteCmd(0x00ee);TFT_WriteData(0x000c);
//Driving ability Setting
TFT_WriteCmd(0x00ea);TFT_WriteData(0x0000);
TFT_WriteCmd(0x00eb);TFT_WriteData(0x0020);
TFT_WriteCmd(0x00ec);TFT_WriteData(0x0008);
TFT_WriteCmd(0x00ed);TFT_WriteData(0x00c4);
TFT_WriteCmd(0x00e8);TFT_WriteData(0x0040);
TFT_WriteCmd(0x00e9);TFT_WriteData(0x0038);
TFT_WriteCmd(0x00f1);TFT_WriteData(0x0001);
TFT_WriteCmd(0x00f2);TFT_WriteData(0x0010);
TFT_WriteCmd(0x0027);TFT_WriteData(0x00a3);
//Gamma 2.2 Setting
TFT_WriteCmd(0x0040);TFT_WriteData(0x0001);
TFT_WriteCmd(0x0041);TFT_WriteData(0x0007);
TFT_WriteCmd(0x0042);TFT_WriteData(0x0007);
TFT_WriteCmd(0x0043);TFT_WriteData(0x0013);
TFT_WriteCmd(0x0044);TFT_WriteData(0x0011);
TFT_WriteCmd(0x0045);TFT_WriteData(0x0024);
TFT_WriteCmd(0x0046);TFT_WriteData(0x0010);
TFT_WriteCmd(0x0047);TFT_WriteData(0x0057);
TFT_WriteCmd(0x0048);TFT_WriteData(0x0009);
TFT_WriteCmd(0x0049);TFT_WriteData(0x0014);
TFT_WriteCmd(0x004a);TFT_WriteData(0x0019);
TFT_WriteCmd(0x004b);TFT_WriteData(0x0019);
TFT_WriteCmd(0x004c);TFT_WriteData(0x0016);
TFT_WriteCmd(0x0050);TFT_WriteData(0x001b);
TFT_WriteCmd(0x0051);TFT_WriteData(0x002e);
TFT_WriteCmd(0x0052);TFT_WriteData(0x002c);
TFT_WriteCmd(0x0053);TFT_WriteData(0x0038);
TFT_WriteCmd(0x0054);TFT_WriteData(0x0038);
TFT_WriteCmd(0x0055);TFT_WriteData(0x003e);
TFT_WriteCmd(0x0056);TFT_WriteData(0x002a);
TFT_WriteCmd(0x0057);TFT_WriteData(0x006f);
TFT_WriteCmd(0x0058);TFT_WriteData(0x0009);
TFT_WriteCmd(0x0059);TFT_WriteData(0x0006);
TFT_WriteCmd(0x005a);TFT_WriteData(0x0006);
TFT_WriteCmd(0x005b);TFT_WriteData(0x000b);
TFT_WriteCmd(0x005c);TFT_WriteData(0x0016);
TFT_WriteCmd(0x005d);TFT_WriteData(0x00cc);
//Power Voltage Setting
TFT_WriteCmd(0x001b);TFT_WriteData(0x001b);
TFT_WriteCmd(0x001a);TFT_WriteData(0x0001);
TFT_WriteCmd(0x0024);TFT_WriteData(0x0029);
TFT_WriteCmd(0x0025);TFT_WriteData(0x0057);
//****VCOM offset**///
TFT_WriteCmd(0x0023);TFT_WriteData(0x008a);
//Power on Setting
TFT_WriteCmd(0x0018);TFT_WriteData(0x0036);
TFT_WriteCmd(0x0019);TFT_WriteData(0x0001);
TFT_WriteCmd(0x0001);TFT_WriteData(0x0000);
TFT_WriteCmd(0x001f);TFT_WriteData(0x0088);
Delay(5);
TFT_WriteCmd(0x001f);TFT_WriteData(0x0080);
Delay(5);
TFT_WriteCmd(0x001f);TFT_WriteData(0x0090);
Delay(5);
TFT_WriteCmd(0x001f);TFT_WriteData(0x00d0);
Delay(5);
//262k/65k color selection
TFT_WriteCmd(0x0017);TFT_WriteData(0x0005);
//SET PANEL
TFT_WriteCmd(0x0036);TFT_WriteData(0x0000);
//Display ON Setting
TFT_WriteCmd(0x0028);TFT_WriteData(0x0038);
Delay(40);
TFT_WriteCmd(0x0028);TFT_WriteData(0x003c);
//Set GRAM Area
TFT_WriteCmd(0x0002);TFT_WriteData(0x0000);
TFT_WriteCmd(0x0003);TFT_WriteData(0x0000);
TFT_WriteCmd(0x0004);TFT_WriteData(0x0000);
TFT_WriteCmd(0x0005);TFT_WriteData(0x00ef);
TFT_WriteCmd(0x0006);TFT_WriteData(0x0000);
TFT_WriteCmd(0x0007);TFT_WriteData(0x0000);
TFT_WriteCmd(0x0008);TFT_WriteData(0x0001);
TFT_WriteCmd(0x0009);TFT_WriteData(0x003f);
TFT_WriteCmd(0x22);
}
3.顏色顯示的位置
// 本函數(shù)用來(lái)告訴內(nèi)部的顯存偏移量指針,我們當(dāng)前要操作的顏色數(shù)據(jù)是對(duì)應(yīng)哪一個(gè)像素的
void TFT_SetWindow(unsigned int xStart,unsigned int yStart,unsigned int xEnd,unsigned int yEnd)
{
//HX8347-D
//起始x位
TFT_WriteCmd(0x02);TFT_WriteData(xStart>>8); //高8位
TFT_WriteCmd(0x03);TFT_WriteData(xStart); //低8位
//起始y位
TFT_WriteCmd(0x04);TFT_WriteData(xEnd>>8);
TFT_WriteCmd(0x05);TFT_WriteData(xEnd);
//結(jié)束x位
TFT_WriteCmd(0x06);TFT_WriteData(yStart>>8);
TFT_WriteCmd(0x07);TFT_WriteData(yStart);
//結(jié)束y位
TFT_WriteCmd(0x08);TFT_WriteData(yEnd>>8);
TFT_WriteCmd(0x09);TFT_WriteData(yEnd);
// 最后這個(gè)0x22是為了配合SetWindow之后 TFT_WriteData傳輸?shù)哪切﹤€(gè)【相當(dāng)于將顯示器的開(kāi)關(guān)打開(kāi)】
// 顏色數(shù)據(jù)來(lái)顯示的。
TFT_WriteCmd(0x22);
}
4.填充入顏色(清屏)
void TFT_ClearScreen(unsigned char color){
unsigned int x,y;
//設(shè)置屏幕將來(lái)要顯示的范圍
TFT_SetWindow(0,0,TFT_XMAX,TFT_YMAX);
for(y=0;y<TFT_YMAX+1;y++){
for(x=0;x<TFT_XMAX+1;x++){
TFT_WriteData(color);
}
}
}
5.顏色定義
// 顏色定義
#define WHITE 0xffff
#define BLACK 0x0000
#define RED 0xF800//R(5)G(6)B(5)-->R為1,G和B為0
#define GREEN 0x07e0
#define BLUE 0x001f
6.簡(jiǎn)單顯存操縱之畫(huà)點(diǎn)/線
1.畫(huà)一個(gè)點(diǎn)
//往(x,y)坐標(biāo)位置畫(huà)一個(gè)點(diǎn)
void GUI_DrawDot(uint x,uint y,uint color){
uchar i=0;
//起始和終止位置一樣,表示一個(gè)點(diǎn)
//初始化要開(kāi)始畫(huà)的位置
TFT_SetWindow(x,y,x,y);
//將顏色填入
TFT_WriteData(color);
//點(diǎn)的大小是3*3
TFT_SetWindow(x-1,y-1,x+1,y+1);
for(i=0;i<9;i++){
TFT_WriteData(color);
}
//點(diǎn)的大小是5*5
TFT_SetWindow(x-2,y-2,x+2,y+2);
for(i=0;i<25;i++){
TFT_WriteData(color);
}
}
2.畫(huà)一條橫線
//橫線
//往(x,y)坐標(biāo)位置畫(huà)一條橫線,長(zhǎng)度是l,顏色是color
void GUI_DrawLineX(uint x,uint y,uint l,uint color){
uchar i=0;
//一條線
TFT_SetWindow(x,y,x+l,y);
//三條線
TFT_SetWindow(x,y+1,x+l,y+1);
for(i=0;i<l+1;i++){//注意點(diǎn):是l+1
TFT_WriteData(color);
}
}
3.畫(huà)一條豎線
//豎線
//往(x,y)坐標(biāo)位置畫(huà)一條豎線,長(zhǎng)度是l,顏色是color
void GUI_DrawLineY(uint x,uint y,uint l,uint color){
uchar i=0;
//一條線
TFT_SetWindow(x,y,x,y+l);
for(i=0;i<l+1;i++){//注意點(diǎn):是l+1
TFT_WriteData(color);
}
}
4.畫(huà)一個(gè)十字架
//往(x,y)坐標(biāo)為中心點(diǎn)畫(huà)一個(gè)十字,長(zhǎng)度為1,顏色為color
void GUI_DrawShiZi(uint x,uint y,uint l,uint color){
uchar i=0;
//先畫(huà)橫線
TFT_SetWindow(x-l/2,y,x+l/2,y);
for(i=0;i<l+1;i++){//注意點(diǎn):是l+1
TFT_WriteData(color);
}
//先畫(huà)豎線
TFT_SetWindow(x,y-l/2,x,y+l/2);
for(i=0;i<l+1;i++){//注意點(diǎn):是l+1
TFT_WriteData(color);
}
}
7.LCD顯示之寫(xiě)字
注意點(diǎn):
1)一個(gè)漢字對(duì)應(yīng)2個(gè)字節(jié),所以我們?cè)O(shè)置
// ------------------ 漢字字模的數(shù)據(jù)結(jié)構(gòu)定義 ------------------------ //
struct Cn32CharTypeDef // 漢字字模數(shù)據(jù)結(jié)構(gòu)
{
unsigned char Index[2]; // 漢字內(nèi)碼索引,一個(gè)漢字占兩個(gè)字節(jié)
unsigned char Msk[116]; // 點(diǎn)陣碼數(shù)據(jù)(32*29/8)
};
/
// 漢字字模表,大小為:32*29 //
// 漢字庫(kù): 宋體二號(hào),橫向取模左高位,數(shù)據(jù)排列:從左到右從上到下 //
/
code struct Cn32CharTypeDef const CnChar32x29[]=
{
/*-- 文字: 普 --*/
/*-- 宋體22; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=30x29 --*/
/*-- 寬度不是8的倍數(shù),現(xiàn)調(diào)整為:寬度x高度=32x29 --*/
"普",0x00,0x00,0x00,0x00,0x00,0xE0,0x38,0x00,0x00,0x78,0x3C,0x00,0x00,0x3C,0x78,0x00,
0x00,0x3C,0x70,0xC0,0x00,0x1C,0xE1,0xE0,0x1F,0xFF,0xFF,0xF0,0x00,0x1C,0xE3,0x00,
0x0E,0x1C,0xE7,0xC0,0x07,0x9C,0xE7,0x80,0x03,0xDC,0xEF,0x00,0x03,0xDC,0xEE,0x00,
0x01,0xDC,0xFC,0x60,0x00,0x9C,0xF9,0xF0,0x7F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,
0x01,0xC0,0x0E,0x00,0x01,0xFF,0xFF,0x00,0x01,0xC0,0x0E,0x00,0x01,0xC0,0x0E,0x00,
0x01,0xC0,0x0E,0x00,0x01,0xFF,0xFE,0x00,0x01,0xC0,0x0E,0x00,0x01,0xC0,0x0E,0x00,
0x01,0xC0,0x0E,0x00,0x01,0xFF,0xFE,0x00,0x01,0xC0,0x0E,0x00,0x01,0xC0,0x0E,0x00,
0x00,0x00,0x00,0x00,
/*-- 文字: 中 --*/
/*-- 宋體22; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=30x29 --*/
/*-- 寬度不是8的倍數(shù),現(xiàn)調(diào)整為:寬度x高度=32x29 --*/
"中",0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x80,0x1F,0xFF,0xFF,0xE0,
0x1F,0xFF,0xFF,0xE0,0x1E,0x07,0x01,0xC0,0x1E,0x07,0x01,0xC0,0x1E,0x07,0x01,0xC0,
0x1E,0x07,0x01,0xC0,0x1E,0x07,0x01,0xC0,0x1E,0x07,0x01,0xC0,0x1F,0xFF,0xFF,0xC0,
0x1F,0xFF,0xFF,0xC0,0x1E,0x07,0x01,0xC0,0x1C,0x07,0x01,0x80,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x00,0x00,0x00,
}
//寫(xiě)出漢字大小為:32*29
void GUI_Write32CnChar(uint x, uint y, uchar *p, uint wordColor, uint backColor){
unsigned char i,j,wordNum;//wordNum:表示一共要顯示的數(shù)字個(gè)數(shù)
unsigned int color;
while(*p!='\0'){
//先確定要寫(xiě)的位置
TFT_SetWindow(x,y,x+31,y+28);
for(wordNum=0;wordNum<20;wordNum++){
//因?yàn)橐粋€(gè)漢字對(duì)應(yīng)兩個(gè)編碼,我們要確定這個(gè)編碼和字是否可以對(duì)應(yīng)上
if((CnChar32x29[wordNum].Index[0]==*p)
&&
(CnChar32x29[wordNum].Index[1]==*(p+1)))
{
//表示此時(shí)對(duì)應(yīng)上,則可以開(kāi)始讀取116個(gè)字模
for(i=0;i<116;i++){
//讀取每一位字模(一位8bit)
color=CnChar32x29[wordNum].Msk[i];
//將這一位數(shù)據(jù)讀出來(lái),然后判斷8位bit是1還是0
for(j=0;i<8;j++){
if(color&0x80){
//進(jìn)入,則表示此為bit為1,則這個(gè)位置是有漢字要顯示
TFT_WriteData(wordColor);
}else{
//表示這個(gè)位置沒(méi)有漢字顯示,則設(shè)置為背景色
TFT_WriteData(backColor);
}
//因?yàn)槲覀兪菑母呶婚_(kāi)始讀取,所以要將數(shù)據(jù)向左移動(dòng)一位
color<<=1;
}
}
}
}
}
}
8.LCD顯示圖像
1.用Image2LCD獲取圖像頭文件
Image to LCD
選擇:320*240
PC機(jī)上圖片默認(rèn)32位:8位R,8位G,8位B,8位透明
2.寫(xiě)繪圖函數(shù)
1)圖像出來(lái)的編碼,i是低8位,i+1是高8位
2)設(shè)置顯示范圍的時(shí)候,注意左閉右開(kāi)
//在(x,y)為左上角的位置上繪圖
void GUI_DrawPicture(uint x,uint y,uchar *pPic,uint width,uint height){
uint i;
//注意開(kāi)閉區(qū)間問(wèn)題【我們是32*29---》31*28】,所以結(jié)尾要分別-1
TFT_SetWindow(x+0,y+0,x+width-1,y+height-1);
//因?yàn)槲覀兪?6bit分為2字節(jié)發(fā)送,所以我們應(yīng)該2個(gè)為一組發(fā)送
//width*height*2:圖片的編碼數(shù)組
for(i=0;i<width*height*2;i+=2){
//i:表示低8位,i+1:表示高8位
//位或:將兩者合并起來(lái)
//0X89(低8位),0X98(高8位),
TFT_WriteData((pPic[i]<<0) | (pPic[i+1]<<8));
}
}
6.ILI9325數(shù)據(jù)手冊(cè)
1.基本信息
1)i80 系統(tǒng)接口,具有 8 位/9 位/16 位/18 位總線寬度
2)240RGBx320 點(diǎn)分辨率,具有真正的 262,144 顯示顏色
2.引腳
1.IM:串行外設(shè)接口
2.NCS:片選
NCS=1:表示未選中
NCS=0:表示選中
3.RS: 寄存器選擇信號(hào)
選中寄存器類型
RS=1:表示要進(jìn)行寫(xiě)數(shù)據(jù)
RS=0:表示要進(jìn)行寫(xiě)命令
4.nWR/SCL:選中寫(xiě)狀態(tài)
nWR/SCL=0:表示此時(shí)要進(jìn)入寫(xiě)狀態(tài)
nWR/SCL=1:表示此時(shí)不進(jìn)入寫(xiě)狀態(tài)
5.nRD:選擇讀狀態(tài)
nRD=0:表示此時(shí)要進(jìn)入讀狀態(tài)
nRD=1:表示此時(shí)不進(jìn)入讀狀態(tài)
6.nRESET
初始狀態(tài)為0
7.DB[17:0]:數(shù)據(jù)傳輸線
3.塊描述
IR:索引寄存器(index register)---》IR 是存儲(chǔ)來(lái)自控制寄存器和內(nèi)部GRAM 的索引信息的寄存器。
WDR:是臨時(shí)存儲(chǔ)要寫(xiě)入控制寄存器和內(nèi)部GRAM 的數(shù)據(jù)的寄存器。
4.寄存器
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-798125.html
6.Write to register:寫(xiě)寄存器(命令)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-798125.html
//寫(xiě)命令
void LIL9325_Write_Cmd(unsigned int cmd){
//表示此函數(shù)要進(jìn)行的操作是:寫(xiě)
TFT_WR=1;
//打開(kāi)片選
TFT_CS=0;
//表示此時(shí)寫(xiě)命令【1】or數(shù)據(jù)【0】
TFT_RS=0;
//此時(shí)是寫(xiě)命令,讀不用使用到,所以一直為高電平
TFT_RD=1;
//打開(kāi)寫(xiě)命令
TFT_WR=0;
TFT_WR=1;
TFT_DATAPORTL=cmd>>8;
TFT_DATAPORTL=dat&0x00ff;
TFT_WR=0;
TFT_WR=1;
//關(guān)閉片選
TFT_CS=1;
}
7.Read from Data:寫(xiě)數(shù)據(jù)
//寫(xiě)數(shù)據(jù)
void LIL9325_Write_Data(unsigned int dat){
//表示此函數(shù)要進(jìn)行的操作是:寫(xiě)
TFT_WR=1;
//打開(kāi)片選
TFT_CS=0;
//表示此時(shí)寫(xiě)命令【1】or數(shù)據(jù)【0】
TFT_RS=1;
//此時(shí)是寫(xiě)命令,讀不用使用到,所以一直為高電平
TFT_RD=1;
//打開(kāi)寫(xiě)命令
TFT_WR=0;
TFT_WR=1;
TFT_DATAPORTL=dat>>8;
TFT_DATAPORTL=dat&0x00ff;
TFT_WR=0;
TFT_WR=1;
//關(guān)閉片選
TFT_CS=1;
}
8.讀取數(shù)據(jù)
//讀取數(shù)據(jù)
void LIL_Read_Data(unsigned int dat){
//打開(kāi)片選
TFT_CS=0;
//此時(shí)是讀數(shù)據(jù)【1】
TFT_RS=1;
//此時(shí)是要進(jìn)行讀操作
TFT_RD=0;//則此時(shí)讀操作要拉為低電平
_nop_();
dat=TFT_DATAPORTL;
dat<<=8;
dat|=TFT_DATAPORTL;
//關(guān)閉讀操作,拉為高電平
TFT_RD=1;
//關(guān)閉片選
TFT_CS=1;
}
到了這里,關(guān)于【單片機(jī)】19-TFT彩屏的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!