LCD上显示指针式的时钟

2018-12-30  本文已影响0人  你的优先级最高

1、重点

2、画线函数

3、时钟的形状

4、函数实现

void L_DrawLine(int x1,int y1,int x2,int y2,int color)
{
    int dx,dy,e;   //e:误差,偏离的多少
    dx=x2-x1; 
    dy=y2-y1;
    
    if(dx>=0)
    {
        if(dy >= 0) // dy>=0
        {
            if(dx>=dy) // 1/8 octant
            {
                e=dy-dx/2;
                while(x1<=x2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){y1+=1;e-=dx;}   
                    x1+=1;
                    e+=dy;
                }
            }
            else        // 2/8 octant
            {
                e=dx-dy/2;
                while(y1<=y2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){x1+=1;e-=dy;}   
                    y1+=1;
                    e+=dx;
                }
            }
        }
        else           // dy<0
        {
            dy=-dy;   // dy=abs(dy)
            if(dx>=dy) // 8/8 octant
            {
                e=dy-dx/2;
                while(x1<=x2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){y1-=1;e-=dx;}   
                    x1+=1;
                    e+=dy;
                }
            }
            else        // 7/8 octant
            {
                e=dx-dy/2;
                while(y1>=y2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){x1+=1;e-=dy;}   
                    y1 -= 1;
                    e += dx;
                }
            }
        }   
    }
    else //dx<0
    {
        dx=-dx;     //dx=abs(dx)
        if(dy >= 0) // dy>=0
        {
            if(dx>=dy) // 4/8 octant
            {
                e=dy-dx/2;
                while(x1>=x2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){y1+=1;e-=dx;}   
                    x1-=1;
                    e+=dy;
                }
            }
            else        // 3/8 octant
            {
                e=dx-dy/2;
                while(y1<=y2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){x1-=1;e-=dy;}   
                    y1+=1;
                    e+=dx;
                }
            }
        }
        else           // dy<0
        {
            dy=-dy;   // dy=abs(dy)
            if(dx>=dy) // 5/8 octant
            {
                e=dy-dx/2;
                while(x1>=x2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){y1-=1;e-=dx;}   
                    x1-=1;
                    e+=dy;
                }
            }
            else        // 6/8 octant
            {
                e=dx-dy/2;
                while(y1>=y2)
                {
                    LCD_SetPoint(x1,y1,color);
                    if(e>0){x1-=1;e-=dy;}   
                    y1-=1;
                    e+=dx;
                }
            }
        }   
    }
}

    s_angle = second*6;//秒对应的角度,把360°60等分,一秒偏移6°
    scale = (s_angle + 180.0)/180.0*3.1415926;
    sx = 80*cos(scale) + X_cicle;  //秒针的终点位置,加上圆心坐标
    sy = 80*sin(scale) + Y_cicle;//
    L_DrawLine(X_cicle, Y_cicle, sx_old, sy_old, Blue);//清除上一次的线(蓝底白线)
    L_DrawLine(X_cicle, Y_cicle, sx, sy, White);//画线
        
    sx_old = sx;    //用完之后赋值,便于下一次清除之前的线
    sy_old = sy;
void Display_Scale(void)//画刻度
{
    u8 i = 0,j = 0;
    static int x1 = 0,x2 = 0,y1 = 0,y2 = 0,angle = 0;
    float scale = 0;;
    for(i=0;i<60;i++)
    {
        angle = i*6;
        scale = (angle + 180.0)/180.0*3.1415926;

        if(i%5==0)
        {
            x1 = 100*cos(scale) + X_cicle;  //加上圆心坐标
            y1 = 100*sin(scale) + Y_cicle;
            
            x2 =  90*cos(scale) + X_cicle;  //加上圆心坐标
            y2 =  90*sin(scale) + Y_cicle;
              
            L_DrawLine(x1,y1,x2,y2,Red);
        }
        else 
        {
            x1 = 100*cos(scale) + X_cicle;  //加上圆心坐标
            y1 = 100*sin(scale) + Y_cicle;
            
            x2 =  95*cos(scale) + X_cicle;  //加上圆心坐标
            y2 =  95*sin(scale) + Y_cicle;

            L_DrawLine(x1,y1,x2,y2,White);
        }       
    }
}
上一篇 下一篇

猜你喜欢

热点阅读