找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6358|回复: 1
收起左侧

超美感的摸拟指针挂钟(3.5真彩屏)for STM32源代码

  [复制链接]
ID:358930 发表于 2018-11-14 19:44 | 显示全部楼层 |阅读模式
唯美如画,原来科技创造也能如此诗意,源代码中已定意了圆心等数据,下一步就可以做三维立体艺术时钟了,目前还没有相关参考资料好像,只能自计算参数了,N夜的不眠,相信就有我美丽的彼岸,我在这里………代码错了,帮从源代码复制

电路原理图如下:
20181114_192112.jpg 20181114_192140.jpg 20181114_192204.jpg

STM32单片机源程序如下:
  1. #include "public.h"
  2. #include "printf.h"
  3. #include "rtc.h"
  4. #include "systick.h"
  5. #include "gui.h"
  6. #include "led.h"
  7. #include "math.h"

  8. #define PI 3.1415926

  9. int xo=120,yo=200,zo=100,ro=100;//表心坐标z 指针长,圆大小

  10. void get_circle(int x,int y,int r,int col)
  11. {
  12.         int xc=0;
  13.         int yc,p;
  14.         yc=r;
  15.         p=3-(r<<1);       
  16.         while(xc <= yc)
  17.         {
  18.                 GUI_Dot(x+xc,y+yc,col);
  19.                 GUI_Dot(x+xc,y-yc,col);       
  20.                 GUI_Dot(x-xc,y+yc,col);
  21.                 GUI_Dot(x-xc,y-yc,col);
  22.                 GUI_Dot(x+yc,y+xc,col);       
  23.                 GUI_Dot(x+yc,y-xc,col);
  24.                 GUI_Dot(x-yc,y+xc,col);
  25.                 GUI_Dot(x-yc,y-xc,col);
  26.                 if(p<0)
  27.                 {
  28.                         p += (xc++ << 2) + 6;       
  29.                 }
  30.                 else
  31.                         p += ((xc++ - yc--)<<2) + 10;
  32.         }
  33. }
  34. void draw_circle()         //画圆
  35. {
  36.         get_circle(xo,yo,ro,YELLOW);
  37.         get_circle(xo,yo,(ro-1),YELLOW);
  38.         get_circle(xo,yo,(ro-2),YELLOW);
  39.         get_circle(xo,yo,(ro-3),YELLOW);
  40.         get_circle(xo,yo,5,YELLOW);                       
  41. }
  42. void draw_dotline()  //画格点
  43. {
  44.         u8 i;
  45.         u8 rome[][3]={"12","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" } ; //表盘数字
  46.         int x1,y1,x2,y2,x3,y3;
  47.        
  48.         for(i=0;i<60;i++)
  49.         {
  50.                 x1 = (int)(xo + (sin(i * PI / 30) * (ro-8)));               
  51.                 y1 = (int)(ro - (cos(i * PI / 30) * (ro-8)));
  52.                
  53.                 x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
  54.                 y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
  55.                
  56.                 GUI_Line(x1,y1+ro,x2,y2+ro,RED);
  57.        
  58.                 if(i%5==0)
  59.                 {
  60.                         x1 = (int)(xo + (sin(i * PI / 30) * (ro-15)));
  61.                         y1 = (int)(ro - (cos(i * PI / 30) * (ro-15)));
  62.                         x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
  63.                         y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
  64.                         GUI_Line(x1,y1+ro,x2,y2+ro,RED);       

  65.                         x3 = (int)((xo-8) + (sin((i ) * PI / 30) * (ro-20)));
  66.                         y3 = (int)((ro-8) - (cos((i ) * PI / 30) * (ro-20)));

  67.                         GUI_Show12ASCII(x3,y3+ro,rome[i/5],YELLOW,BLACK);
  68.                 }
  69.                
  70.         }               
  71.        
  72. }
  73. void draw_hand(int hhour,int mmin,int ssec)  //画指针
  74. {
  75.         int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
  76.         xhour = (int)((zo-40) * sin( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
  77.         yhour = (int)((zo-40) * cos( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
  78.        
  79.         xminute = (int)((zo-10) * sin( mmin * PI / 30 + ssec * PI / 1800));
  80.         yminute = (int)((zo-10) * cos( mmin * PI / 30 + ssec * PI / 1800));
  81.        
  82.         xsecond = (int)(zo * sin( ssec * PI / 30));
  83.         ysecond = (int)(zo * cos( ssec * PI / 30));

  84.        
  85.         GUI_Line(xo + xhour, yo - yhour, xo -xhour / 6, yo + yhour / 6,RED);
  86.         GUI_Line(xo + xminute, yo - yminute, xo -xminute / 4, yo + yminute / 4,BLUE);
  87.         GUI_Line(xo + xsecond, yo - ysecond, xo -xsecond / 3, yo + ysecond / 3,GREEN);
  88.        
  89. }
  90. void draw_hand_clear(int hhour,int mmin,int ssec)  //擦指针
  91. {
  92.         int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
  93.        
  94.         xhour = (int)((zo-40) * sin( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
  95.         yhour = (int)((zo-40) * cos( hhour * PI / 6 + mmin * PI / 360 + ssec * PI / 1800));
  96.        
  97.         xminute = (int)((zo-10) * sin( mmin * PI / 30 + ssec * PI / 1800));
  98.         yminute = (int)((zo-10) * cos( mmin * PI / 30 + ssec * PI / 1800));
  99.        
  100.         xsecond = (int)(zo * sin( ssec * PI / 30));
  101.         ysecond = (int)(zo * cos( ssec * PI / 30));

  102.        
  103.         GUI_Line(xo + xhour, yo - yhour, xo -xhour / 6, yo + yhour / 6,BLACK);
  104.         GUI_Line(xo + xminute, yo - yminute, xo -xminute / 4, yo + yminute / 4,BLACK);
  105.         GUI_Line(xo + xsecond, yo - ysecond, xo -xsecond / 3, yo + ysecond / 3,BLACK);
  106.        
  107. }
  108. int main()
  109. {       
  110.        
  111.         u16 hour=0,min=0,sec=0;
  112.         u32 timedata=0;
  113.         u8 dat[9];        
  114.         LED_Init();          //端口初始化
  115.         TFT_Init();
  116.         TFT_ClearScreen(BLACK);
  117.         rtc_init();
  118.         clockinit_RTC();
  119.         draw_circle();
  120.         draw_dotline();
  121.         while(1)
  122.         {
  123.                
  124.                
  125.                
  126.                
  127.                 if(timebz==1)
  128.                 {
  129.                         draw_hand_clear(hour,min,sec);
  130.                         timebz=0;
  131.                         timedata=RTC_GetCounter();//获取RTC计数器的值
  132.                         hour=timedata/3600;
  133.                         min=(timedata%3600)/60;
  134.                         sec=timedata%60;
  135.                         dat[0]=hour/10+'0';
  136.                         dat[1]=hour%10+'0';
  137.                         dat[2]=':';
  138.                         dat[3]=min/10+'0';
  139.                         dat[4]=min%10+'0';
  140.                         dat[5]=':';
  141.                         dat[6]=sec/10+'0';
  142.                         dat[7]=sec%10+'0';
  143.                         dat[8]='\0';
  144.                         draw_hand(hour,min,sec);

  145.                 }
  146.                 draw_circle();
  147.                 draw_dotline();
  148.                 GUI_Show12ASCII(90,320,dat,YELLOW,BLACK);       
  149.     GUI_Show12ASCII(105,70,"BBJJ",YELLOW,BLACK);
  150.     GUI_Box(2,340,238,350,YELLOW);//画一个矩形实心图
  151.     GUI_Box(2,350,238,360,BLUE);//画一个矩形实心图
  152.     GUI_Box(2,360,238,370,GREEN);//画一个矩形实心图
  153.                
  154.                 GUI_Box(2,30,238,40,YELLOW);//画一个矩形实心图
  155.     GUI_Box(2,40,238,50,BLUE);//画一个矩形实心图
  156.     GUI_Box(2,50,238,60,GREEN);//画一个矩形实心图
  157.                
  158.         }       
  159.        
  160. }
复制代码

所有资料51hei提供下载:
TFT彩色圆形摸拟钟OK2.rar (412.35 KB, 下载次数: 77)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:517951 发表于 2020-11-15 14:00 | 显示全部楼层
谢谢楼主分享,,51hei有你更精彩!!累积黑币来下载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表