LCD上显示指针式的时钟

1、重点

  • (1)画线函数:画任意一条直线,包含斜线
  • (2)刻画时钟模型
  • (3)模拟时钟划线

2、画线函数

  • (1)通过直线方程:y = kx + b描线,很简单,但是像素点不会有小数,如此画出来的线,会丢失很多像素点,导致画出来的线不连续
  • (2)Bresenham算法,通过直线的一般方程:Ax + By + C = 0来进行描绘,依次逼近 。(网上也很多人采取这种算法)

3、时钟的形状

  • (1)通过网上找图片然后取模进行显示,就可以很方便弄出时钟模型,但是我不是很熟悉取模的步骤,在尝试过后便放弃了该方法。
  • (2)通过自己计算找出每个刻度的位置,然后大概确定起始与终点的位置,然后画线。不得不说,这种方法数据量比较大,只是找数据就会找很久的时间,并且在你显示时会发现误差很大,不准。
  • (3)确定指针的长度以及角度与时钟刻度的关系,通过x = R*cos(angle)`` y = R*sin(angle),定好坐标之后便能进行画线(圆心已知)。由于没有取模,因此不容易给表盘定指示。
  • (4)怎样确定时钟、分针、秒针的终点坐标,然后结合圆心来画线?
    ——由于每一个刻度都相应对应一个具体的角度,没走一个刻度偏移角度是确定了的。我们只需要建立一个坐标系,然后通过三角函数来计算,很方便获取坐标。我们只需要想计算就好了,难度不大。

4、函数实现

  • 1)画线函数

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;
                }
            }
        }   
    }
}

  • 2)计算终点坐标

    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;
  • 3)表盘绘制(无数值指示)

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);
        }       
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容