[应用相关] [stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画

[复制链接]
410|1
 楼主| deadtime 发表于 2020-1-1 16:50 | 显示全部楼层 |阅读模式
>_<:这里的动画是黄色矩形区域中一个模仿俯视图的起重机运作动画,一个是模仿主视图的吊钩的运动。通过改变初始Init函数中的数据b_x,b_y实现矩形区域的移动。当实时采集时要首先根据起重机的实际情况改变比例,当传感器传来数据时就相当于这里的run函数,只要把传感器数据接收函数和相关函数结合即可。
 楼主| deadtime 发表于 2020-1-1 16:51 | 显示全部楼层
>_<:main code:

  1. #include "stdlib.h"
  2. #include "GUI.H"
  3. /*
  4. 颜色
  5. */
  6. #define Black     0x000000
  7. #define White    0xFFFFFF
  8. #define Blue    0xFF0000
  9. #define Red        0x0000FF
  10. /*
  11. 画矩形区----------改造的和51一样的函数
  12. */
  13. void Rectangle(int left,int up,int right,int down,U16 color)
  14. {
  15.     GUI_SetColor(color);
  16.     GUI_DrawHLine(up,left,right);//横线
  17.     GUI_DrawHLine(down,left,right);//横线
  18.     GUI_DrawVLine(left,up,down);//垂线
  19.     GUI_DrawVLine(right,up,down);//垂线
  20. }
  21. /*
  22. 画线函数-----------改造的和51一样的函数
  23. */
  24. void Line(int x0,int y0,int x1,int y1,U16 color)
  25. {
  26.     GUI_SetColor(color);
  27.     GUI_DrawLine(x0,y0,x1,y1);
  28. }
  29. ///////////////////////////////////////////////////////////////////////////
  30. int b_x,b_y,b_l,b_w;//轨道的x,y,长,宽
  31. //大车的位置,老位置,y值,宽,速度,加速度,左限位,右限位
  32. int m_x,m_old_x,m_y,m_l,m_w,m_v,m_a,m_l_limit_p,m_r_limit_p;
  33. //小车的位置,老位置,超出部分,速度,加速度,上限位,下限位
  34. int s_y,s_old_y,s_extre_part,s_v,s_a,s_u_limit_p,s_d_limit_p;


  35. int h_x,h_y,h_w;//横梁的x,y和宽
  36. int move_x_v,move_y_v,move_a;//水平移动速度,
  37. int line_x,line_old_x,line_y,line_l,line_old_l;//伸长部分x,老x,y,长,老长
  38. //--------------------------------------------------------------
  39. void init1()
  40. {
  41.     b_x=40,b_y=120,b_l=100,b_w=420;
  42.     m_x=m_old_x=b_x+10,m_y=b_y-10,m_l=120,m_w=50,m_v=1,m_a=0,m_l_limit_p=40,m_r_limit_p=b_x+b_w-m_l_limit_p;
  43.     s_y=s_old_y=b_y+10,s_extre_part=10,s_v=1,s_a=0,s_u_limit_p=b_y+10,s_d_limit_p=b_y+b_l-10;
  44. }
  45. void init2()
  46. {
  47.     h_x=b_x,h_y=b_y+b_l+60,h_w=b_w;
  48.     move_x_v=s_v*h_w/m_l,move_y_v=2,move_a=0;
  49.     line_x=line_old_x=100,line_y=h_y+3,line_l=line_old_l=50;
  50. }
  51. //---------------------------Draw-------------------------------
  52. void drawBig()
  53. {
  54.     Line(b_x,b_y,b_x+b_w,b_y,Black);
  55.     Line(b_x,b_y+b_l,b_x+b_w,b_y+b_l,Black);
  56. }//主梁画
  57. void drawMiddle()
  58. {
  59.     if(m_x!=m_old_x)Line(m_old_x,m_y,m_old_x,m_y+m_l,White);
  60.     Line(m_x,m_y,m_x,m_y+m_l,Blue);
  61.     if(m_x!=m_old_x)Line(m_old_x+m_w,m_y,m_old_x+m_w,m_y+m_l,White);
  62.     Line(m_x+m_w,m_y,m_x+m_w,m_y+m_l,Blue);
  63. }//画横梁
  64. void drawSmall()
  65. {
  66.     if(s_old_y!=s_y || m_x!=m_old_x)Line(m_old_x-s_extre_part,s_old_y,m_old_x+m_w+s_extre_part,s_old_y,White);
  67.     Line(m_x-s_extre_part,s_y,m_x+m_w+s_extre_part,s_y,Red);
  68. }//画小车
  69. void draw1()
  70. {
  71.     drawBig();//画主梁
  72.     drawMiddle();//画横梁
  73.     drawSmall();//画小车
  74. }//总画函数
  75. //----------------------------run-----------------------------
  76. void runMiddle()
  77. {
  78.     m_old_x=m_x;
  79.     m_x+=m_v;
  80.     if(m_x+m_w>=m_r_limit_p || m_x<=m_l_limit_p)m_v*=-1;//达到警戒线
  81. }//横梁移动
  82. void runSmall()
  83. {
  84.     s_old_y=s_y;
  85.     line_old_x=line_x;
  86.     s_y+=s_v;
  87.     line_x+=move_x_v;
  88.     if(s_y>=s_d_limit_p || s_y<=s_u_limit_p){
  89.         s_v*=-1;
  90.         move_x_v*=-1;
  91.     }//达到警戒线
  92. }//小车移动
  93. void run1()
  94. {
  95.     runMiddle();
  96.     runSmall();
  97. }//运动函数
  98. /////////////////////////////////////////////////////////////////////////////////
  99. //-------------------------draw--------------------------------
  100. void drawGou()
  101. {
  102.     if(line_old_x!=line_x || line_old_l!=line_old_l){
  103.         Rectangle(line_old_x-3,line_y+line_old_l,line_old_x+3,line_y+line_old_l+6,White);
  104.         Line(line_old_x,line_y+line_old_l+6,line_old_x,line_y+line_old_l+9,White);
  105.         Line(line_old_x,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+9,White);
  106.         Line(line_old_x+6,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+15,White);
  107.         Line(line_old_x+6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+15,White);
  108.         Line(line_old_x-6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+12,White);
  109.     }
  110.     Rectangle(line_x-3,line_y+line_l,line_x+3,line_y+line_l+6,Blue);
  111.     Line(line_x,line_y+line_l+6,line_x,line_y+line_l+9,Black);
  112.     Line(line_x,line_y+line_l+9,line_x+6,line_y+line_l+9,Black);
  113.     Line(line_x+6,line_y+line_l+9,line_x+6,line_y+line_l+15,Black);
  114.     Line(line_x+6,line_y+line_l+15,line_x-6,line_y+line_l+15,Black);
  115.     Line(line_x-6,line_y+line_l+15,line_x-6,line_y+line_l+12,Black);   
  116. }//画勾,x,y为绳的下端,r为大小
  117. void drawH()
  118. {
  119.     Line(h_x,h_y,h_x+h_w,h_y,Black);
  120. }//画横梁
  121. void drawHuaKuai()
  122. {
  123.     if(line_old_x!=line_x)Rectangle(line_old_x-6*3/4,line_y-6,line_old_x+6*3/4,line_y,White);
  124.     Rectangle(line_x-6*3/4,line_y-6,line_x+6*3/4,line_y,Blue);
  125. }//画滑块,x,y为绳的上端,r为大小
  126. void drawLine()
  127. {
  128.     if(line_old_l!=line_l || line_x!=line_old_x)Line(line_old_x,line_y,line_old_x,line_y+line_old_l,White);
  129.     Line(line_x,line_y,line_x,line_y+line_l,Black);
  130. }//画线
  131. void draw2()
  132. {
  133.     drawH();
  134.     drawHuaKuai();
  135.     drawLine();
  136.     drawGou();
  137. }
  138. ///////////////////////////////////////////////////////////////////////////
  139. //-------------------------draw尺子--------------------------------
  140. void draw0()
  141. {
  142.     GUI_SetColor(GUI_YELLOW);
  143.     GUI_FillRect(b_x-15,b_y-15,b_x+b_w+15,h_y+190);
  144.      Rectangle(b_x-15,b_y-15,b_x+b_w+15,h_y+190,GUI_BLUE);//画边框
  145. }
  146. ///////////////////////////////////////////////////////////////////////////
  147. void Fun(void)//fun里面的Fun函数------一切动画贴图都在此
  148. {
  149.     init1();//初始化1画面
  150.     init2();//初始化2画面
  151.     GUI_SetBkColor(WHITE);
  152.     GUI_Clear();
  153.     //GUI_DrawBitmap(&bmkk,0,0);
  154.     draw0();
  155.     while(1)
  156.     {
  157.         run1();
  158.         line_old_l=line_l;
  159.         line_l+=1;
  160.         if(line_l>160)line_l=10;
  161.         draw1();
  162.         draw2();
  163.         GUI_Delay(1);
  164.     }
  165. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

470

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部