唯美如画,原来科技创造也能如此诗意,源代码中已定意了圆心等数据,下一步就可以做三维立体艺术时钟了,目前还没有相关参考资料好像,只能自计算参数了,N夜的不眠,相信就有我美丽的彼岸,我在这里………代码错了,帮从源代码复制
电路原理图如下:
STM32单片机源程序如下:
- #include "public.h"
- #include "printf.h"
- #include "rtc.h"
- #include "systick.h"
- #include "gui.h"
- #include "led.h"
- #include "math.h"
- #define PI 3.1415926
- int xo=120,yo=200,zo=100,ro=100;//表心坐标z 指针长,圆大小
- void get_circle(int x,int y,int r,int col)
- {
- int xc=0;
- int yc,p;
- yc=r;
- p=3-(r<<1);
- while(xc <= yc)
- {
- GUI_Dot(x+xc,y+yc,col);
- GUI_Dot(x+xc,y-yc,col);
- GUI_Dot(x-xc,y+yc,col);
- GUI_Dot(x-xc,y-yc,col);
- GUI_Dot(x+yc,y+xc,col);
- GUI_Dot(x+yc,y-xc,col);
- GUI_Dot(x-yc,y+xc,col);
- GUI_Dot(x-yc,y-xc,col);
- if(p<0)
- {
- p += (xc++ << 2) + 6;
- }
- else
- p += ((xc++ - yc--)<<2) + 10;
- }
- }
- void draw_circle() //画圆
- {
- get_circle(xo,yo,ro,YELLOW);
- get_circle(xo,yo,(ro-1),YELLOW);
- get_circle(xo,yo,(ro-2),YELLOW);
- get_circle(xo,yo,(ro-3),YELLOW);
- get_circle(xo,yo,5,YELLOW);
- }
- 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)(xo + (sin(i * PI / 30) * (ro-8)));
- y1 = (int)(ro - (cos(i * PI / 30) * (ro-8)));
-
- x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
- y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
-
- GUI_Line(x1,y1+ro,x2,y2+ro,RED);
-
- if(i%5==0)
- {
- x1 = (int)(xo + (sin(i * PI / 30) * (ro-15)));
- y1 = (int)(ro - (cos(i * PI / 30) * (ro-15)));
- x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
- y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
- GUI_Line(x1,y1+ro,x2,y2+ro,RED);
- x3 = (int)((xo-8) + (sin((i ) * PI / 30) * (ro-20)));
- y3 = (int)((ro-8) - (cos((i ) * PI / 30) * (ro-20)));
- GUI_Show12ASCII(x3,y3+ro,rome[i/5],YELLOW,BLACK);
- }
-
- }
-
- }
- void draw_hand(int hhour,int mmin,int ssec) //画指针
- {
- int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
- xhour = (int)((zo-40) * sin( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
- yhour = (int)((zo-40) * cos( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
-
- xminute = (int)((zo-10) * sin( mmin * PI / 30 + ssec * PI / 1800));
- yminute = (int)((zo-10) * cos( mmin * PI / 30 + ssec * PI / 1800));
-
- xsecond = (int)(zo * sin( ssec * PI / 30));
- ysecond = (int)(zo * cos( ssec * PI / 30));
-
- GUI_Line(xo + xhour, yo - yhour, xo -xhour / 6, yo + yhour / 6,RED);
- GUI_Line(xo + xminute, yo - yminute, xo -xminute / 4, yo + yminute / 4,BLUE);
- GUI_Line(xo + xsecond, yo - ysecond, xo -xsecond / 3, yo + ysecond / 3,GREEN);
-
- }
- void draw_hand_clear(int hhour,int mmin,int ssec) //擦指针
- {
- int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
-
- xhour = (int)((zo-40) * sin( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
- yhour = (int)((zo-40) * cos( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
-
- xminute = (int)((zo-10) * sin( mmin * PI / 30 + ssec * PI / 1800));
- yminute = (int)((zo-10) * cos( mmin * PI / 30 + ssec * PI / 1800));
-
- xsecond = (int)(zo * sin( ssec * PI / 30));
- ysecond = (int)(zo * cos( ssec * PI / 30));
-
- GUI_Line(xo + xhour, yo - yhour, xo -xhour / 6, yo + yhour / 6,BLACK);
- GUI_Line(xo + xminute, yo - yminute, xo -xminute / 4, yo + yminute / 4,BLACK);
- GUI_Line(xo + xsecond, yo - ysecond, xo -xsecond / 3, yo + ysecond / 3,BLACK);
-
- }
- int main()
- {
-
- u16 hour=0,min=0,sec=0;
- u32 timedata=0;
- u8 dat[9];
- LED_Init(); //端口初始化
- TFT_Init();
- TFT_ClearScreen(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(90,320,dat,YELLOW,BLACK);
- GUI_Show12ASCII(105,70,"BBJJ",YELLOW,BLACK);
- GUI_Box(2,340,238,350,YELLOW);//画一个矩形实心图
- GUI_Box(2,350,238,360,BLUE);//画一个矩形实心图
- GUI_Box(2,360,238,370,GREEN);//画一个矩形实心图
-
- GUI_Box(2,30,238,40,YELLOW);//画一个矩形实心图
- GUI_Box(2,40,238,50,BLUE);//画一个矩形实心图
- GUI_Box(2,50,238,60,GREEN);//画一个矩形实心图
-
- }
-
- }
复制代码
所有资料51hei提供下载:
TFT彩色圆形摸拟钟OK2.rar
(412.35 KB, 下载次数: 77)
|