|
回复 楼主季夏木槿 的帖子
有了上面的讲解,接下来,让我们分两步走:
第一步:画圆盘
第二步:画指针
1.画圆函数-----实现时钟表盘显示- /*******************************************/
- /* 函数功能:画圆 */
- /* 入口参数:x0,y0 圆心坐标 */
- /* r 半径 */
- /*******************************************/
- void TFT_DrawCircle(uint16 x0, uint16 y0, uint16 r)
- {
- uint16 a,b;
- int16 di;
- a=0;b=r;
- di=3-(r<<1); //判断下个点位置的标志
- while(a<=b)
- {
- TFT_DrawPoint(x0-b,y0-a); //3
- TFT_DrawPoint(x0+b,y0-a); //0
- TFT_DrawPoint(x0-a,y0+b); //1
- TFT_DrawPoint(x0-b,y0-a); //7
- TFT_DrawPoint(x0-a,y0-b); //2
- TFT_DrawPoint(x0+b,y0+a); //4
- TFT_DrawPoint(x0+a,y0-b); //5
- TFT_DrawPoint(x0+a,y0+b); //6
- TFT_DrawPoint(x0-b,y0+a);
-
- a++;
- //使用Bresenham算法画圆
- if(di<0)di +=4*a+6;
- else
- {
- di+=10+4*(a-b);
- b--;
- }
- TFT_DrawPoint(x0+a,y0+b);
- }
- }
复制代码 2.画直线---实现指针- /**********************************************/
- /* 函数功能;画直线 */
- /**********************************************/
- void TFT_DrawLine(uint16 x1, uint16 y1, uint16 x2, uint16 y2)
- {
- uint16 t;
- int xerr=0,yerr=0,delta_x,delta_y,distance;
- int incx,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++ )//画线输出
- {
- TFT_DrawPoint(uRow,uCol);//画点
- xerr+=delta_x ;
- yerr+=delta_y ;
- if(xerr>distance)
- {
- xerr-=distance;
- uRow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- uCol+=incy;
- }
- }
- }
复制代码 有了以上的两个函数,我们先把时钟的表盘画出来:
3.初始化表盘- /*========================================================================*/
- /* Name:init_Point_Clock() */
- /* Function:初始化表盘 */
- /* 参 数:(C_x,C_y):表盘中心坐标 */
- /* C_r :表盘半径 */
- /* */
- /*========================================================================*/
- void init_PointClock(uint16 C_x,uint16 C_y,uint16 C_r)
- {
- uint8 i;
- TFT_DrawCircle( C_x,C_y,C_r);
- for(i=0;i<60;i++)
- {
- if((i%5)==0)//画时刻度
- {
- TFT_DrawLine(TFT_TimeX(C_x,C_r,i),TFT_TimeY(C_y,C_r,i),TFT_TimeX(C_x,C_r-15,i),TFT_TimeY(C_y,C_r-15,i));
- }
- else //画分刻度
- {
- TFT_DrawLine(TFT_TimeX(C_x,C_r-10,i),TFT_TimeY(C_y,C_r-10,i),TFT_TimeX(C_x,C_r-5,i),TFT_TimeY(C_y,C_r-5,i));
- }
- }
- }
复制代码 来看一下效果:
下面,我们来画指针。
以秒针为例,我们知道两个点成线,其中一个点是表盘的圆心坐标,另外一点随着时间而变化,秒针每一秒走过的角度是固定的,那么能不能根据圆点坐标和走过的角度画出来秒针呢?答案是肯定的。
4.计算指针的X坐标- /***************************************************
- 函数名称:TFT_TimeX()
- 函数功能:计算指针的X坐标
- 输入参数:circle_x:圆心横坐标
- Length :半径长度
- Angle :角度
- 输出参数: x坐标
- ****************************************************/
- uint16 TFT_TimeX(uint16 circle_x,uint16 Length,uint16 Angle)
- {
- uint8 x;
- if((Angle>0) && (Angle<=15))
- {
- x = circle_x + Length * (sin(PI * Angle / 30));
- }
- else if(Angle > 15 && Angle <= 30)
- {
- x = circle_x + Length * cos((PI * Angle) / 30 - (PI / 2 ));
- }
- else if(Angle > 30 && Angle <= 45)
- {
- x = circle_x - Length * sin((PI * Angle) / 30- PI);
- }
- else
- {
- x = circle_x-Length * cos((PI * Angle) / 30 - ((3 * PI) / 2));
- }
- return x;
- }
复制代码 5.计算指针的Y坐标- /***************************************************
- 函数名称:TFT_TimeY()
- 函数功能:计算指针的Y坐标
- 输入参数:circle_y:圆心纵坐标
- Length :半径长度
- Angle :角度
- 输出参数: Y坐标
- ****************************************************/
- uint16 TFT_TimeY(uint16 circle_y,uint16 Length,uint16 Angle)
- {
- uint8 y;
- if((Angle>0) && (Angle<=15))
- {
- y = circle_y - Length * (cos(PI * Angle / 30));
- }
- else if(Angle > 15 && Angle <= 30)
- {
- y = circle_y + Length * sin((PI * Angle) / 30 - (PI / 2 ));
- }
- else if(Angle > 30 && Angle <= 45)
- {
- y = circle_y + Length * cos((PI * Angle) / 30- PI);
- }
- else
- {
- y = circle_y - Length * sin((PI * Angle) / 30 - ((3 * PI) / 2));
- }
- return y;
- }
复制代码 6.画指针- void Display_Point(uint16 C_x,uint16 C_y,uint16 leght,uint16 time) //指针显示
- {
- uint16 xstart;
- uint16 ystart;
- uint16 xend;
- uint16 yend;
- xstart=C_x;
- ystart=C_y;
- xend=TFT_TimeX(C_x,leght,time);
- yend=TFT_TimeY(C_y,leght,time);
- TFT_DrawLine(xstart,ystart,xend,yend); //画指针
- }
复制代码 现在,工作全部做完了,表盘有了,指针也会画了,剩下的内容就很简单了。先初始化表盘,不断刷新显示时、分、秒指针,时钟就走起来了!!自己试试吧!!
[ 本帖最后由 季夏木槿 于 2013-11-14 21:09 编辑 ] |
|