[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
>_<:这里的动画是黄色矩形区域中一个模仿俯视图的起重机运作动画,一个是模仿主视图的吊钩的运动。通过改变初始Init函数中的数据b_x,b_y实现矩形区域的移动。当实时采集时要首先根据起重机的实际情况改变比例,当传感器传来数据时就相当于这里的run函数,只要把传感器数据接收函数和相关函数结合即可。
>_<: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 36 37 int h_x,h_y,h_w;//横梁的x,y和宽 38 int move_x_v,move_y_v,move_a;//水平移动速度, 39 int line_x,line_old_x,line_y,line_l,line_old_l;//伸长部分x,老x,y,长,老长 40 //-------------------------------------------------------------- 41 void init1() 42 { 43 b_x=40,b_y=120,b_l=100,b_w=420; 44 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; 45 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; 46 } 47 void init2() 48 { 49 h_x=b_x,h_y=b_y+b_l+60,h_w=b_w; 50 move_x_v=s_v*h_w/m_l,move_y_v=2,move_a=0; 51 line_x=line_old_x=100,line_y=h_y+3,line_l=line_old_l=50; 52 } 53 //---------------------------Draw------------------------------- 54 void drawBig() 55 { 56 Line(b_x,b_y,b_x+b_w,b_y,Black); 57 Line(b_x,b_y+b_l,b_x+b_w,b_y+b_l,Black); 58 }//主梁画 59 void drawMiddle() 60 { 61 if(m_x!=m_old_x)Line(m_old_x,m_y,m_old_x,m_y+m_l,White); 62 Line(m_x,m_y,m_x,m_y+m_l,Blue); 63 if(m_x!=m_old_x)Line(m_old_x+m_w,m_y,m_old_x+m_w,m_y+m_l,White); 64 Line(m_x+m_w,m_y,m_x+m_w,m_y+m_l,Blue); 65 }//画横梁 66 void drawSmall() 67 { 68 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); 69 Line(m_x-s_extre_part,s_y,m_x+m_w+s_extre_part,s_y,Red); 70 }//画小车 71 void draw1() 72 { 73 drawBig();//画主梁 74 drawMiddle();//画横梁 75 drawSmall();//画小车 76 }//总画函数 77 //----------------------------run----------------------------- 78 void runMiddle() 79 { 80 m_old_x=m_x; 81 m_x+=m_v; 82 if(m_x+m_w>=m_r_limit_p || m_x<=m_l_limit_p)m_v*=-1;//达到警戒线 83 }//横梁移动 84 void runSmall() 85 { 86 s_old_y=s_y; 87 line_old_x=line_x; 88 s_y+=s_v; 89 line_x+=move_x_v; 90 if(s_y>=s_d_limit_p || s_y<=s_u_limit_p){ 91 s_v*=-1; 92 move_x_v*=-1; 93 }//达到警戒线 94 }//小车移动 95 void run1() 96 { 97 runMiddle(); 98 runSmall(); 99 }//运动函数 100 ///////////////////////////////////////////////////////////////////////////////// 101 //-------------------------draw-------------------------------- 102 void drawGou() 103 { 104 if(line_old_x!=line_x || line_old_l!=line_old_l){ 105 Rectangle(line_old_x-3,line_y+line_old_l,line_old_x+3,line_y+line_old_l+6,White); 106 Line(line_old_x,line_y+line_old_l+6,line_old_x,line_y+line_old_l+9,White); 107 Line(line_old_x,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+9,White); 108 Line(line_old_x+6,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+15,White); 109 Line(line_old_x+6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+15,White); 110 Line(line_old_x-6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+12,White); 111 } 112 Rectangle(line_x-3,line_y+line_l,line_x+3,line_y+line_l+6,Blue); 113 Line(line_x,line_y+line_l+6,line_x,line_y+line_l+9,Black); 114 Line(line_x,line_y+line_l+9,line_x+6,line_y+line_l+9,Black); 115 Line(line_x+6,line_y+line_l+9,line_x+6,line_y+line_l+15,Black); 116 Line(line_x+6,line_y+line_l+15,line_x-6,line_y+line_l+15,Black); 117 Line(line_x-6,line_y+line_l+15,line_x-6,line_y+line_l+12,Black); 118 }//画勾,x,y为绳的下端,r为大小 119 void drawH() 120 { 121 Line(h_x,h_y,h_x+h_w,h_y,Black); 122 }//画横梁 123 void drawHuaKuai() 124 { 125 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); 126 Rectangle(line_x-6*3/4,line_y-6,line_x+6*3/4,line_y,Blue); 127 }//画滑块,x,y为绳的上端,r为大小 128 void drawLine() 129 { 130 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); 131 Line(line_x,line_y,line_x,line_y+line_l,Black); 132 }//画线 133 void draw2() 134 { 135 drawH(); 136 drawHuaKuai(); 137 drawLine(); 138 drawGou(); 139 } 140 /////////////////////////////////////////////////////////////////////////// 141 //-------------------------draw尺子-------------------------------- 142 void draw0() 143 { 144 GUI_SetColor(GUI_YELLOW); 145 GUI_FillRect(b_x-15,b_y-15,b_x+b_w+15,h_y+190); 146 Rectangle(b_x-15,b_y-15,b_x+b_w+15,h_y+190,GUI_BLUE);//画边框 147 } 148 /////////////////////////////////////////////////////////////////////////// 149 void Fun(void)//fun里面的Fun函数------一切动画贴图都在此 150 { 151 init1();//初始化1画面 152 init2();//初始化2画面 153 GUI_SetBkColor(WHITE); 154 GUI_Clear(); 155 //GUI_DrawBitmap(&bmkk,0,0); 156 draw0(); 157 while(1) 158 { 159 run1(); 160 line_old_l=line_l; 161 line_l+=1; 162 if(line_l>160)line_l=10; 163 draw1(); 164 draw2(); 165 GUI_Delay(1); 166 } 167 }