首頁 > 評測 > 新定義開發(fā)板評測-驅動1.8寸TFT屏

新定義開發(fā)板評測-驅動1.8寸TFT屏

  
  • 作者:
  • 來源:
  • [導讀]
  • 新定義開發(fā)板測評移植1.8寸TFT屏幕程序 本文主要和大家探討下,新定義的開發(fā)板如何驅動1.8寸TFT。 收到的開翻版的芯片型號如下圖: 08c09b2ef380b951c6a5c37ce393f21a (224.09 KB )下載附件2022-11-20 17:47 上傳
新定義開發(fā)板測評移植1.8寸TFT屏幕程序
本文主要和大家探討下,新定義的開發(fā)板如何驅動1.8寸TFT。
收到的開翻版的芯片型號如下圖:

本次使用的1.8寸液晶,驅動芯片為ST7735,此屏幕為SPI總線方式,共8個引腳如下圖:

GND---0V,VCC---3.3V,,SCL---P04,SDA---P05,RES-----P25,DC-----P26,CS-----P27,BL-----P24。
SCL為SPI時鐘,SDA為SPI數據,RES為SPI復位,DC為SPI指令和數據選擇端,CS為片選,BL為背光,本次采用GPIO模擬的方式實現(xiàn)。關于SPI驅動的時序,請自行研究,在此不做贅述,TFT驅動程序如下:
LCD.c
voidLCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{         
u16i,j;
LCD_Address_Set(xsta,ysta,xend-1,yend-1);//設置顯示范圍
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
LCD_WR_DATA(color);
}
}
}
/******************************************************************************
函數說明:在指定位置畫點
入口數據:x,y畫點坐標
                color 點的顏色
返回值:無
******************************************************************************/
voidLCD_DrawPoint(u16 x,u16 y,u16 color)
{
LCD_Address_Set(x,y,x,y);//設置光標位置
LCD_WR_DATA(color);
}
/******************************************************************************
函數說明:畫線
入口數據:x1,y1   起始坐標
                x2,y2   終止坐標
                color   線的顏色
返回值:無
******************************************************************************/
voidLCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
{
u16 t;
intxerr=0,yerr=0,delta_x,delta_y,distance;
intincx,incy,uRow,uCol;
delta_x=x2-x1; //計算坐標增量
delta_y=y2-y1;
uRow=x1;//畫線起點坐標
uCol=y1;
if(delta_x>0)incx=1; //設置單步方向
else if (delta_x==0)incx=0;//垂直線
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if (delta_y==0)incy=0;//水平線
else {incy=-1;delta_y=-delta_y;}
if(delta_x>delta_y)distance=delta_x; //選取基本增量坐標軸
else distance=delta_y;
for(t=0;t<distance+1;t++)
{
LCD_DrawPoint(uRow,uCol,color);//畫點
xerr+=delta_x;
yerr+=delta_y;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/******************************************************************************
函數說明:畫矩形
入口數據:x1,y1   起始坐標
                x2,y2   終止坐標
                color   矩形的顏色
返回值:無
******************************************************************************/
voidLCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
LCD_DrawLine(x1,y1,x2,y1,color);
LCD_DrawLine(x1,y1,x1,y2,color);
LCD_DrawLine(x1,y2,x2,y2,color);
LCD_DrawLine(x2,y1,x2,y2,color);
}
/******************************************************************************
函數說明:畫圓
入口數據:x0,y0   圓心坐標
                r       半徑
                color   圓的顏色
返回值:無
******************************************************************************/
voidDraw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
inta,b;
a=0;b=r;
while(a<=b)
{
LCD_DrawPoint(x0-b,y0-a,color);             //3           
LCD_DrawPoint(x0+b,y0-a,color);             //0           
LCD_DrawPoint(x0-a,y0+b,color);             //1               
LCD_DrawPoint(x0-a,y0-b,color);             //2            
LCD_DrawPoint(x0+b,y0+a,color);             //4               
LCD_DrawPoint(x0+a,y0-b,color);             //5
LCD_DrawPoint(x0+a,y0+b,color);             //6
LCD_DrawPoint(x0-b,y0+a,color);             //7
a++;
if((a*a+b*b)>(r*r))//判斷要畫的點是否過遠
{
b--;
}
}
}
/******************************************************************************
函數說明:顯示單個字符
入口數據:x,y顯示坐標
                num 要顯示的字符
fc字的顏色
bc字的背景色
sizey字號
                mode:  0非疊加模式  1疊加模式
返回值:無
******************************************************************************/
voidLCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
{
u8temp,sizex,t,m=0;
u16 i,TypefaceNum;//一個字符所占字節(jié)大小
u16 x0=x;
sizex=sizey/2;
TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
num=num-' ';    //得到偏移后的值
LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //設置光標位置
for(i=0;i<TypefaceNum;i++)
{
if(sizey==12)temp=ascii_1206[num];       //調用6x12字體
else if(sizey==16)temp=ascii_1608[num]; //調用8x16字體
else if(sizey==24)temp=ascii_2412[num]; //調用12x24字體
else if(sizey==32)temp=ascii_3216[num]; //調用16x32字體
else return;
for(t=0;t<8;t++)
{
if(!mode)//非疊加模式
{
if(temp&(0x01<<t))LCD_WR_DATA(fc);
else LCD_WR_DATA(bc);
m++;
if(m%sizex==0)
{
m=0;
break;
}
}
else//疊加模式
{
if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//畫一個點
x++;
if((x-x0)==sizex)
{
x=x0;
y+;
break;
}
}
}
}   
}
/******************************************************************************
函數說明:顯示字符串
入口數據:x,y顯示坐標
                *p 要顯示的字符串
fc字的顏色
bc字的背景色
sizey字號
                mode:  0非疊加模式  1疊加模式
返回值:無
******************************************************************************/
voidLCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
{         
while(*p!='\0')
{      
LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
x+=sizey/2;
p++;
}  
}
/******************************************************************************
函數說明:顯示數字
入口數據:m底數,n指數
返回值:無
******************************************************************************/
u32mypow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
/******************************************************************************
函數說明:顯示整數變量
入口數據:x,y顯示坐標
                num 要顯示整數變量
len要顯示的位數
fc字的顏色
bc字的背景色
sizey字號
返回值:無
******************************************************************************/
voidLCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
{         
u8t,temp;
u8enshow=0;
u8sizex=sizey/2;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+t*sizex,y,' ',fc,bc,sizey,0);
continue;
}elseenshow=1;
}
LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
}
}
/******************************************************************************
函數說明:顯示兩位小數變量
入口數據:x,y顯示坐標
                num 要顯示小數變量
len要顯示的位數
fc字的顏色
bc字的背景色
sizey字號
返回值:無
******************************************************************************/
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
{         
u8t,temp,sizex;
u16 num1;
sizex=sizey/2;
num1=num*100;
for(t=0;t<len;t++)
{
temp=(num1/mypow(10,len-t-1))%10;
if(t==(len-2))
{
LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);
t++;
len+=1;
}
LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
}
}
LCD.h
#ifndef __LCD_H
#define __LCD_H
#include "SC_Init.h"
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//指定區(qū)域填充顏色
void LCD_DrawPoint(u16 x,u16 y,u16 color);//在指定位置畫一個點
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//在指定位置畫一條線
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置畫一個矩形
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//在指定位置畫一個圓
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示一個字符
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示字符串
u32 mypow(u8 m,u8 n);//求冪
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//顯示整數變量
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//顯示兩位小數變量
//畫筆顏色
#define WHITE          0xFFFF
#define BLACK          0x0000
#define BLUE            0x001F  
#define BRED             0XF81F
#define GRED        0XFFE0
#define GBLUE       0X07FF
#define RED            0xF800
#define MAGENTA        0xF81F
#define GREEN          0x07E0
#define CYAN           0x7FFF
#define YELLOW         0xFFE0
#define BROWN      0XBC40 //棕色
#define BRRED      0XFC07 //棕紅色
#define GRAY       0X8430 //灰色
#define DARKBLUE       0X01CF//深藍色
#define LIGHTBLUE       0X7D7C//淺藍色
#define GRAYBLUE        0X5458 //灰藍色
#define LIGHTGREEN      0X841F //淺綠色
#define LGRAY      0XC618 //淺灰色(PANNEL),窗體背景色
#define LGRAYBLUE        0XA651 //淺灰藍色(中間層顏色)
#define LBBLUE           0X2B12 //淺棕藍色(選擇條目的反色)
#endif#ifndef __LCD_H
#define __LCD_H
#include "SC_Init.h"
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//指定區(qū)域填充顏色
void LCD_DrawPoint(u16 x,u16 y,u16 color);//在指定位置畫一個點
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//在指定位置畫一條線
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置畫一個矩形
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//在指定位置畫一個圓
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示一個字符
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示字符串
u32 mypow(u8 m,u8 n);//求冪
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//顯示整數變量
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//顯示兩位小數變量
//畫筆顏色
#define WHITE          0xFFFF
#define BLACK          0x0000
#define BLUE            0x001F  
#define BRED             0XF81F
#define GRED        0XFFE0
#define GBLUE       0X07FF
#define RED            0xF800
#define MAGENTA        0xF81F
#define GREEN          0x07E0
#define CYAN           0x7FFF
#define YELLOW         0xFFE0
#define BROWN      0XBC40 //棕色
#define BRRED      0XFC07 //棕紅色
#define GRAY       0X8430 //灰色
#define DARKBLUE       0X01CF//深藍色
#define LIGHTBLUE       0X7D7C//淺藍色
#define GRAYBLUE        0X5458 //灰藍色
#define LIGHTGREEN      0X841F //淺綠色
#define LGRAY      0XC618 //淺灰色(PANNEL),窗體背景色
#define LGRAYBLUE        0XA651 //淺灰藍色(中間層顏色)
#define LBBLUE           0X2B12 //淺棕藍色(選擇條目的反色)
#endif
lCDinit.c
voidLCD_GPIO_Init(void)
{
GPIO_Init(GPIO0, GPIO_PIN_4|GPIO_PIN_5, GPIO_MODE_OUT_PP);
GPIO_Init(GPIO2, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_MODE_OUT_PP);   
}
/******************************************************************************
函數說明:LCD串行數據寫入函數
入口數據:dat要寫入的串行數據
返回值:無
******************************************************************************/
voidLCD_Writ_Bus(u8 dat)
{
u8i;
LCD_CS_Clr();
for(i=0;i<8;i++)
{
LCD_SCLK_Clr();
if(dat&0x80)
{
LCD_MOSI_Set();
}
else
{
LCD_MOSI_Clr();
}
LCD_SCLK_Set();
dat<<=1;
}
LCD_CS_Set();
}
/******************************************************************************
函數說明:LCD寫入數據
入口數據:dat寫入的數據
返回值:無
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
LCD_Writ_Bus(dat);
}
/******************************************************************************
函數說明:LCD寫入數據
入口數據:dat寫入的數據
返回值:無
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
LCD_Writ_Bus(dat>>8);
LCD_Writ_Bus(dat);
}
/******************************************************************************
函數說明:LCD寫入命令
入口數據:dat寫入的命令
返回值:無
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
LCD_DC_Clr();//寫命令
LCD_Writ_Bus(dat);
LCD_DC_Set();//寫數據
}
/******************************************************************************
函數說明:設置起始和結束地址
入口數據:x1,x2 設置列的起始和結束地址
                y1,y2 設置行的起始和結束地址
返回值:無
******************************************************************************/
voidLCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址設置
LCD_WR_DATA(x1+2);
LCD_WR_DATA(x2+2);
LCD_WR_REG(0x2b);//行地址設置
LCD_WR_DATA(y1+1);
LCD_WR_DATA(y2+1);
LCD_WR_REG(0x2c);//儲存器寫
}
else if(USE_HORIZONTAL==1)
{
LCD_WR_REG(0x2a);//列地址設置
LCD_WR_DATA(x1+2);
LCD_WR_DATA(x2+2);
LCD_WR_REG(0x2b);//行地址設置
LCD_WR_DATA(y1+1);
LCD_WR_DATA(y2+1);
LCD_WR_REG(0x2c);//儲存器寫
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址設置
LCD_WR_DATA(x1+1);
LCD_WR_DATA(x2+1);
LCD_WR_REG(0x2b);//行地址設置
LCD_WR_DATA(y1+2);
LCD_WR_DATA(y2+2);
LCD_WR_REG(0x2c);//儲存器寫
}
else
{
LCD_WR_REG(0x2a);//列地址設置
LCD_WR_DATA(x1+1);
LCD_WR_DATA(x2+1);
LCD_WR_REG(0x2b);//行地址設置
LCD_WR_DATA(y1+2);
LCD_WR_DATA(y2+2);
LCD_WR_REG(0x2c);//儲存器寫
}
}
/******************************************************************************
函數說明:LCD初始化函數
入口數據:無
返回值:無
******************************************************************************/
voidLcd_Init(void)
{
LCD_RES_Clr();
delay_ms(100);
LCD_RES_Set();
delay_ms(100);
LCD_BLK_Set();
delay_ms(100);
//************* Start Initial Sequence **********//
LCD_WR_REG(0x11); //Sleep out
delay_ms(120);              //Delay 120ms
//------------------------------------ST7735S Frame Rate-----------------------------------------//
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB3);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
//------------------------------------End ST7735S Frame Rate---------------------------------//
LCD_WR_REG(0xB4); //Dot inversion
LCD_WR_DATA8(0x03);
//------------------------------------ST7735S Power Sequence---------------------------------//
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x04);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0XC0);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0x2A);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0xEE);
//---------------------------------End ST7735S Power Sequence-------------------------------------//
LCD_WR_REG(0xC5); //VCOM
LCD_WR_DATA8(0x1A);
LCD_WR_REG(0x36); //MX, MY, RGB mode
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
else LCD_WR_DATA8(0xA0);
//------------------------------------ST7735S Gamma Sequence---------------------------------//
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x22);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x2E);
LCD_WR_DATA8(0x30);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x2A);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x2E);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x13);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x16);
LCD_WR_DATA8(0x06);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x23);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x3B);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x13);
//------------------------------------End ST7735S Gamma Sequence-----------------------------//
LCD_WR_REG(0x3A); //65k mode
LCD_WR_DATA8(0x05);
LCD_WR_REG(0x29); //Display on
}
LCD init.h
#ifndef __LCD_INIT_H
#define __LCD_INIT_H
#include "SC_Init.h"
#define USE_HORIZONTAL 1  //設置橫屏或者豎屏顯示 0或1為豎屏 2或3為橫屏
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 128
#define LCD_H 160
#else
#define LCD_W 160
#define LCD_H 128
#endif
//-----------------LCD端口定義----------------
#define LCD_SCLK_Clr() GPIO_WriteLow(GPIO0, GPIO_PIN_4)//LCD_SCL=0//SCL=SCLK
#define LCD_SCLK_Set() GPIO_WriteHigh(GPIO0, GPIO_PIN_4)//LCD_SCL=1
#define LCD_MOSI_Clr() GPIO_WriteLow(GPIO0, GPIO_PIN_5)//LCD_SDA=0//SDA=MOSI
#define LCD_MOSI_Set() GPIO_WriteHigh(GPIO0, GPIO_PIN_5)//LCD_SDA=1
#define LCD_RES_Clr() GPIO_WriteLow(GPIO2, GPIO_PIN_5)//LCD_RES=0//RES
#define LCD_RES_Set() GPIO_WriteHigh(GPIO2, GPIO_PIN_5)//LCD_RES=1
#define LCD_DC_Clr() GPIO_WriteLow(GPIO2, GPIO_PIN_6)//LCD_DC=0//DC
#define LCD_DC_Set() GPIO_WriteHigh(GPIO2, GPIO_PIN_6)//LCD_DC=1
#define LCD_CS_Clr()  GPIO_WriteLow(GPIO2, GPIO_PIN_7)//LCD_CS=0//CS
#define LCD_CS_Set()  GPIO_WriteHigh(GPIO2, GPIO_PIN_7)//LCD_CS=1
#define LCD_BLK_Clr()  GPIO_WriteLow(GPIO2, GPIO_PIN_4)//LCD_BLK=0//BLK
#define LCD_BLK_Set()  GPIO_WriteHigh(GPIO2, GPIO_PIN_4)//LCD_BLK=1
void LCD_GPIO_Init(void);//初始化GPIO
void LCD_Writ_Bus(u8 dat);//模擬SPI時序
void LCD_WR_DATA8(u8 dat);//寫入一個字節(jié)
void LCD_WR_DATA(u16 dat);//寫入兩個字節(jié)
void LCD_WR_REG(u8 dat);//寫入一個指令
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//設置坐標函數
void LCD_Init(void);//LCD初始化
#endif
Main.c
void main(void)
{
LCD_GPIO_Init();
LCD_Init();//LCD初始化
while(1)
     {
LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
LCD_ShowString(12,30,"Redefine",WHITE,BLUE,24,0);
     }
}
顯示如下圖:

只顯示了幾個字符,起亞的不再贅述,如果想顯示其他漢字或者圖片,可以通過取模軟件,生成數組進行顯示。
芯片自帶硬件SPI,如果有時間計劃采用硬件SPI也試試。

  • 本文系21ic原創(chuàng),未經許可禁止轉載!

網友評論