发新帖我要提问
123
返回列表
打印
[STM32F4]

月末了,分享个lcd的电子指针式时钟挺酷的。

[复制链接]
楼主: 一路向北lm
手机看帖
扫描二维码
随时随地手机跟帖
41
一路向北lm|  楼主 | 2017-11-30 22:19 | 只看该作者 回帖奖励 |倒序浏览
调用上面的函数实现画圆
void draw_circle()         //画圆
{
        get_circle(100,200,100,YELLOW);
        get_circle(100,200,99,YELLOW);
        get_circle(100,200,98,YELLOW);
        get_circle(100,200,97,YELLOW);
        get_circle(100,200,5,YELLOW);                       
}

使用特权

评论回复
42
一路向北lm|  楼主 | 2017-11-30 22:19 | 只看该作者
接着就是画表盘的分布点了。
void draw_dotline()  //画格点
{
        u8 i;
        u8 rome[][3]={"12","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" } ; //表盘数字
        int x1,y1,x2,y2,x3,y3;
        for(i=0;i<60;i++)
        {
                x1 = (int)(100 + (sin(i * PI / 30) * 92));
                y1 = (int)(100 - (cos(i * PI / 30) * 92));
                x2 = (int)(100 + (sin(i * PI / 30) * 97));
                y2 = (int)(100 - (cos(i * PI / 30) * 97));
                GUI_Line(x1,y1+100,x2,y2+100,RED);

                if(i%5==0)
                {
                        x1 = (int)(100 + (sin(i * PI / 30) * 85));
                        y1 = (int)(100 - (cos(i * PI / 30) * 85));
                        x2 = (int)(100 + (sin(i * PI / 30) * 97));
                        y2 = (int)(100 - (cos(i * PI / 30) * 97));
                        GUI_Line(x1,y1+100,x2,y2+100,RED);       

                        x3 = (int)(92 + (sin((i ) * PI / 30) * 80));
                        y3 = (int)(92 - (cos((i ) * PI / 30) * 80));

                        GUI_Show12ASCII(x3,y3+100,rome[i/5],YELLOW,BLACK);
                }
               
        }               
}

使用特权

评论回复
43
一路向北lm|  楼主 | 2017-11-30 22:21 | 只看该作者
下面即将开始画指针了,这个函数有点麻烦

使用特权

评论回复
44
一路向北lm|  楼主 | 2017-11-30 22:21 | 只看该作者
void draw_hand(int hhour,int mmin,int ssec)  //画指针
{
        int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
        xhour = (int)(60 * sin( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
        yhour = (int)(60 * cos( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
        xminute = (int)(90 * sin( mmin * PI / 30 + ssec * PI / 1800));
        yminute = (int)(90 * cos( mmin * PI / 30 + ssec * PI / 1800));
        xsecond = (int)(100 * sin( ssec * PI / 30));
        ysecond = (int)(100 * cos( ssec * PI / 30));

       
        GUI_Line(100 + xhour, 200 - yhour, 100 -xhour / 6, 200 + yhour / 6,RED);
        GUI_Line(100 + xminute, 200 - yminute, 100 -xminute / 4, 200 + yminute / 4,BLUE);
        GUI_Line(100 + xsecond, 200 - ysecond, 100 -xsecond / 3, 200 + ysecond / 3,GREEN);
       
}

使用特权

评论回复
45
一路向北lm|  楼主 | 2017-11-30 22:22 | 只看该作者
最后一个差指针了,这个完了就可以把表盘显示在TFT上了
void draw_hand_clear(int hhour,int mmin,int ssec)  //擦指针
{
        int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
        xhour = (int)(60 * sin( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
        yhour = (int)(60 * cos( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
        xminute = (int)(90 * sin( mmin * PI / 30 + ssec * PI / 1800));
        yminute = (int)(90 * cos( mmin * PI / 30 + ssec * PI / 1800));
        xsecond = (int)(100 * sin( ssec * PI / 30));
        ysecond = (int)(100 * cos( ssec * PI / 30));

       
        GUI_Line(100 + xhour, 200 - yhour, 100 -xhour / 6, 200 + yhour / 6,BLACK);
        GUI_Line(100 + xminute, 200 - yminute, 100 -xminute / 4, 200 + yminute / 4,BLACK);
        GUI_Line(100 + xsecond, 200 - ysecond, 100 -xsecond / 3, 200 + ysecond / 3,BLACK);
       
}

使用特权

评论回复
46
一路向北lm|  楼主 | 2017-11-30 22:24 | 只看该作者
我们只需要引入GUI.h和lcd.H可实现对TFT的初始化与操作,下面就是在主函数的数据处理了。

使用特权

评论回复
47
一路向北lm|  楼主 | 2017-11-30 22:25 | 只看该作者
部分主函数代码,作为参考,可以实现指针表盘的操作。
TFT_Init();
        TFT_ClearScreen(BLACK);
        GUI_Show12ASCII(10,10,"This is a RTC text!",YELLOW,BLACK);
        rtc_init();
        clockinit_RTC();
        draw_circle();
        draw_dotline();
        while(1)
        {
                if(timebz==1)
                {
                        draw_hand_clear(hour,min,sec);
                        timebz=0;
                        timedata=RTC_GetCounter();//获取RTC计数器的值
                        hour=timedata/3600;
                        min=(timedata%3600)/60;
                        sec=timedata%60;
                        dat[0]=hour/10+'0';
                        dat[1]=hour%10+'0';
                        dat[2]=':';
                        dat[3]=min/10+'0';
                        dat[4]=min%10+'0';
                        dat[5]=':';
                        dat[6]=sec/10+'0';
                        dat[7]=sec%10+'0';
                        dat[8]='\0';
                        draw_hand(hour,min,sec);

                }
                draw_circle();
                draw_dotline();
                GUI_Show12ASCII(80,50,dat,YELLOW,BLACK);               
        }                       

使用特权

评论回复
48
一路向北lm|  楼主 | 2017-11-30 22:26 | 只看该作者
好了这次分享就到这里了,感谢大家指正。

使用特权

评论回复
49
yiyigirl2014| | 2017-11-30 23:26 | 只看该作者
值得学习,这个应用还是很拉轰的

使用特权

评论回复
50
doniexun| | 2018-1-23 22:15 | 只看该作者
很赞,学习一下

使用特权

评论回复
51
mintspring| | 2018-1-26 16:17 | 只看该作者
长见识了

使用特权

评论回复
52
fsss007| | 2020-2-12 15:59 | 只看该作者
学习了,谢谢分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则