微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 驱动 TFT LCD

stm32 驱动 TFT LCD

时间:11-26 来源:互联网 点击:

577//清屏函数

578//Color:要清屏的填充色

579voidLCD_Clear(u16 Color)

580{

581u32 index=0;

582LCD_SetCursor(0x00,0x0000);//设置光标位置

583LCD_WriteRAM_Prepare();//开始写入GRAM

584for(index=0;index<76800;index++)

585{

586LCD_WR_DATA(Color);//向每个GRAM写入数据

587}

588}

589

590//在指定区域内填充指定颜色

591//区域大小:

592// (xend-xsta)*(yend-ysta)

593voidLCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color)

594{

595

596#if USE_HORIZONTAL //横屏

597

598u16 colortemp=POINT_COLOR;

599u16 ytemp=ysta;

600POINT_COLOR=color;

601for(;xsta<=xend;xsta++)

602{

603for(;ysta<=yend;ysta++)LCD_DrawPoint(xsta,ysta);

604ysta=ytemp;

605}

606POINT_COLOR=colortemp;

607

608#else //竖屏

609

610u32 n;

611//设置窗口

612LCD_WriteReg(R80, xsta);//水平方向GRAM起始地址

613LCD_WriteReg(R81, xend);//水平方向GRAM结束地址

614LCD_WriteReg(R82, ysta);//垂直方向GRAM起始地址

615LCD_WriteReg(R83, yend);//垂直方向GRAM结束地址

616LCD_SetCursor(xsta,ysta);//设置光标位置

617LCD_WriteRAM_Prepare();//开始写入GRAM

618n=(u32)(yend-ysta+1)*(xend-xsta+1);

619while(n--){LCD_WR_DATA(color);}//显示所填充的颜色.

620//恢复设置

621LCD_WriteReg(R80, 0x0000);//水平方向GRAM起始地址

622LCD_WriteReg(R81, (LCD_WIDTH-1));//水平方向GRAM结束地址

623LCD_WriteReg(R82, 0x0000);//垂直方向GRAM起始地址

624LCD_WriteReg(R83, (LCD_HEIGHT-1));//垂直方向GRAM结束地址

625

626#endif

627

628}

629

630//画线

631//x1,y1:起点坐标

632//x2,y2:终点坐标

633voidLCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)

634{

635u16 t;

636intxerr=0,yerr=0,delta_x,delta_y,distance;

637intincx,incy,uRow,uCol;

638

639delta_x=x2-x1;//计算坐标增量

640delta_y=y2-y1;

641uRow=x1;

642uCol=y1;

643if(delta_x>0)incx=1;//设置单步方向

644elseif(delta_x==0)incx=0;//垂直线

645else{incx=-1;delta_x=-delta_x;}//终点坐标小于起始坐标,反方向,将坐标重新定位为正坐标

646if(delta_y>0)incy=1;

647elseif(delta_y==0)incy=0;//水平线

648else{incy=-1;delta_y=-delta_y;}//终点坐标小于起始坐标,反方向,将坐标重新定位为正坐标

649if( delta_x>delta_y)distance=delta_x;//选取基本增量坐标轴

650elsedistance=delta_y;

651for(t=0;t<=distance+1;t++ )//画线输出

652{

653LCD_DrawPoint(uRow,uCol);//根据坐标画点

654xerr+=delta_x ;//X坐标增量

655yerr+=delta_y ;//Y坐标增量

656if(xerr>distance)

657{

658xerr-=distance;

659uRow+=incx;

660

661}

662if(yerr>distance)

663{

664yerr-=distance;

665uCol+=incy;

666}

667}

668}

669

670//画矩形

671voidLCD_DrawRectangle(u8 x1, u16 y1, u8 x2, u16 y2)

672{

673LCD_DrawLine(x1,y1,x2,y1);

674LCD_DrawLine(x1,y1,x1,y2);

675LCD_DrawLine(x1,y2,x2,y2);

676LCD_DrawLine(x2,y1,x2,y2);

677}

678

679//在指定位置画一个指定大小的圆

680//(x,y):中心点

681//r :半径

682voidDraw_Circle(u8 x0,u16 y0,u8 r)

683{

684inta,b;

685intdi;

686a=0;b=r;

687di=3-(r<1);//判断下个点位置的标志

688while(a<=b)

689{

690LCD_DrawPoint(x0-b,y0-a);//3

691LCD_DrawPoint(x0+b,y0-a);//0

692LCD_DrawPoint(x0-a,y0+b);//1

693LCD_DrawPoint(x0-b,y0-a);//7

694LCD_DrawPoint(x0-a,y0-b);//2

695LCD_DrawPoint(x0+b,y0+a);//4

696LCD_DrawPoint(x0+a,y0-b);//5

697LCD_DrawPoint(x0+a,y0+b);//6

698LCD_DrawPoint(x0-b,y0+a);

699

700a++;

701

702//使用Bresenham算法画圆

703if(di<0){

704di +=4*a+6;

705}else{

706di+=10+4*(a-b);

707b--;

708}

709LCD_DrawPoint(x0+a,y0+b);

710}

711}

712

713//在指定位置显示一个字符

714//x:0~234

715//y:0~308

716//num:要显示的字符:" "--->"~"

717//size:字体大小 12/16

718//mode:叠加方式(1)还是非叠加方式(0)

719voidLCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode)

720{

721

722#if USE_HORIZONTAL

723

724#define MAX_CHAR_POSX 312

725#define MAX_CHAR_POSY 232

726

727u8 temp;

728u8 pos,t;

729u16 x0=x;

730u16 colortemp=POINT_COLOR;

731if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;

732//设置窗口

733num=num- ;//得到偏移后的值

734if(!mode)//非叠加方式

735{

736for(pos=0;pos

737{

738if(size==12)

739temp=asc2_1206[num][pos];//调用1206字体

740else

741temp=asc2_1608[num][pos];//调用1608字体

742

743for(t=0;t

744{

745if(temp&0x01)

746POINT_COLOR=colortemp;

747else

748POINT_COLOR=BACK_COLOR;

749

750LCD_DrawPoint(x,y);

751temp>>=1;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top