新聞中心

        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è)置光標(biāo)位置
        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è)置光標(biāo)位置
        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:起點坐標(biāo)
        632//x2,y2:終點坐標(biāo)
        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;//計算坐標(biāo)增量
        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;}//終點坐標(biāo)小于起始坐標(biāo),反方向,將坐標(biāo)重新定位為正坐標(biāo)
        646if(delta_y>0)incy=1;
        647elseif(delta_y==0)incy=0;//水平線
        648else{incy=-1;delta_y=-delta_y;}//終點坐標(biāo)小于起始坐標(biāo),反方向,將坐標(biāo)重新定位為正坐標(biāo)
        649if( delta_x>delta_y)distance=delta_x;//選取基本增量坐標(biāo)軸
        650elsedistance=delta_y;
        651for(t=0;t<=distance+1;t++ )//畫線輸出
        652{
        653LCD_DrawPoint(uRow,uCol);//根據(jù)坐標(biāo)畫點
        654xerr+=delta_x ;//X坐標(biāo)增量
        655yerr+=delta_y ;//Y坐標(biāo)增量
        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);//判斷下個點位置的標(biāo)志
        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è)置光標(biāo)位置
        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 :起點坐標(biāo)
        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:起點坐標(biāo)
        875//*p:字符串起始地址
        876//用16字體
        877voidLCD_ShowString(u8 x,u16 y,constu8 *p)
        878{
        879while(*p!= 主站蜘蛛池模板: 柳河县| 慈利县| 揭西县| 乌鲁木齐市| 神木县| 盐边县| 界首市| 湖南省| 和硕县| 南和县| 安福县| 长岛县| 当阳市| 贵港市| 神农架林区| 千阳县| 城口县| 阜康市| 石渠县| 县级市| 年辖:市辖区| 镇巴县| 浠水县| 京山县| 晋城| 南木林县| 谷城县| 赣榆县| 六枝特区| 许昌县| 准格尔旗| 龙陵县| 故城县| 龙口市| 贡觉县| 津南区| 新巴尔虎左旗| 息烽县| 汉阴县| 交城县| 保德县|