新聞中心

stm32 驅(qū)動 TFT LCD

作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
577//清屏函數(shù)
578//Color:要清屏的填充色
579voidLCD_Clear(u16 Color)
580{
581u32 index=0;
582LCD_SetCursor(0x00,0x0000);//設(shè)置光標位置
583LCD_WriteRAM_Prepare();//開始寫入GRAM
584for(index=0;index<76800;index++)
585{
586LCD_WR_DATA(Color);//向每個GRAM寫入數(shù)據(jù)
587}
588}
589
590//在指定區(qū)域內(nèi)填充指定顏色
591//區(qū)域大小:
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//設(shè)置窗口
612LCD_WriteReg(R80, xsta);//水平方向GRAM起始地址
613LCD_WriteReg(R81, xend);//水平方向GRAM結(jié)束地址
614LCD_WriteReg(R82, ysta);//垂直方向GRAM起始地址
615LCD_WriteReg(R83, yend);//垂直方向GRAM結(jié)束地址
616LCD_SetCursor(xsta,ysta);//設(shè)置光標位置
617LCD_WriteRAM_Prepare();//開始寫入GRAM
618n=(u32)(yend-ysta+1)*(xend-xsta+1);
619while(n--){LCD_WR_DATA(color);}//顯示所填充的顏色.
620//恢復(fù)設(shè)置
621LCD_WriteReg(R80, 0x0000);//水平方向GRAM起始地址
622LCD_WriteReg(R81, (LCD_WIDTH-1));//水平方向GRAM結(jié)束地址
623LCD_WriteReg(R82, 0x0000);//垂直方向GRAM起始地址
624LCD_WriteReg(R83, (LCD_HEIGHT-1));//垂直方向GRAM結(jié)束地址
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;//設(shè)置單步方向
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);//根據(jù)坐標畫點
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//設(shè)置窗口
733num=num- ;//得到偏移后的值
734if(!mode)//非疊加方式
735{
736for(pos=0;pos
737{
738if(size==12)
739temp=asc2_1206[num][pos];//調(diào)用1206字體
740else
741temp=asc2_1608[num][pos];//調(diào)用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;
752x++;
753}
754x=x0;
755y++;
756}
757}else{//疊加方式
758for(pos=0;pos
759{
760if(size==12)
761temp=asc2_1206[num][pos];//調(diào)用1206字體
762else
763temp=asc2_1608[num][pos];//調(diào)用1608字體
764
765for(t=0;t
766{
767if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//畫一個點
768temp>>=1;
769}
770}
771}
772POINT_COLOR=colortemp;
773
774#else
775#define MAX_CHAR_POSX 232
776#define MAX_CHAR_POSY 304
777
778u8 temp;
779u8 pos,t;
780
781if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
782//設(shè)置窗口
783
784LCD_WriteReg(R80,x);//水平方向GRAM起始地址
785LCD_WriteReg(R81,x+(size/2-1));//水平方向GRAM結(jié)束地址
786LCD_WriteReg(R82,y);//垂直方向GRAM起始地址
787LCD_WriteReg(R83,y+size-1);//垂直方向GRAM結(jié)束地址
788LCD_SetCursor(x,y);//設(shè)置光標位置
789LCD_WriteRAM_Prepare();//開始寫入GRAM
790num=num- ;//得到偏移后的值
791if(!mode)//非疊加方式
792{
793for(pos=0;pos
794{
795if(size==12)
796temp=asc2_1206[num][pos];//調(diào)用1206字體
797else
798temp=asc2_1608[num][pos];//調(diào)用1608字體
799
800for(t=0;t
801{
802if(temp&0x01){
803LCD_WR_DATA(POINT_COLOR);
804}else{
805LCD_WR_DATA(BACK_COLOR);
806}
807
808temp>>=1;
809}
810}
811}else{//疊加方式
812
813for(pos=0;pos
814{
815if(size==12)
816temp=asc2_1206[num][pos];//調(diào)用1206字體
817else
818temp=asc2_1608[num][pos];//調(diào)用1608字體
819for(t=0;t
820{
821if(temp&0x01)
822LCD_DrawPoint(x+t,y+pos);//畫一個點
823temp>>=1;
824}
825}
826}
827//恢復(fù)窗體大小
828LCD_WriteReg(R80, 0x0000);//水平方向GRAM起始地址
829LCD_WriteReg(R81, (LCD_WIDTH-1));//水平方向GRAM結(jié)束地址
830LCD_WriteReg(R82, 0x0000);//垂直方向GRAM起始地址
831LCD_WriteReg(R83, (LCD_HEIGHT-1));//垂直方向GRAM結(jié)束地址
832
833#endif
834
835}
836
837//m^n函數(shù)
838u32 mypow(u8 m,u8 n)
839{
840u32 result=1;
841while(n--)result*=m;
842returnresult;
843}
844
845//顯示數(shù)字
846//x,y :起點坐標
847//len :數(shù)字的位數(shù)
848//size:字體大小
849//color:顏色
850//num:數(shù)值(0~4294967295);
851voidLCD_ShowNum(u8 x,u16 y,u32 num,u8 len,u8 size)
852{
853u8 t,temp;
854u8 enshow=0;
855for(t=0;t
856{
857temp=(num/mypow(10,len-t-1))%10;
858if(enshow==0&&t<(len-1))
859{
860if(temp==0)
861{
862LCD_ShowChar(x+(size/2)*t,y, ,size,0);
863continue;
864}else{
865enshow=1;
866}
867}
868LCD_ShowChar(x+(size/2)*t,y,temp+0,size,0);
869}
870}
871
872
873//顯示字符串
874//x,y:起點坐標
875//*p:字符串起始地址
876//用16字體
877voidLCD_ShowString(u8 x,u16 y,constu8 *p)
878{
879while(*p!=