×
单片机 > 单片机程序设计 > 详情

TFT2.4彩屏3 [自制动画效果-滑块+吊钩]

发布时间:2020-05-22 发布时间:
|

>_<:>

9325tp.h

 1 #ifndef __ILI9325_H__

 2 #define __ILI9325_H__

 3 

 4 void ILI9325_Initial(void);

 5 void Write_Cmd_Data(unsigned char x, unsigned int y);

 6 void Write_Cmd(unsigned char DH,unsigned char DL);

 7 void Write_Data(unsigned char DH,unsigned char DL);

 8 void delayms(unsigned int tt);

 9 void  Write_Data_U16(unsigned int y);

10 static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);

11 void CLR_Screen(unsigned int bColor);

12 void Put_pixel(unsigned char x,unsigned char y,unsigned int color);

13 void Line(unsigned int X0,

14         unsigned int Y0,

15         unsigned int X1,

16         unsigned int Y1,

17             unsigned int color);

18 void Rectangle(unsigned int left,

19                 unsigned int top,

20                 unsigned int right,

21                 unsigned int bottom,

22                 unsigned int color);                

23 #endif


9325tp.c

  1 /*----------------------------------------------------------------

  2 320x240彩屏液晶驱动程序

  3 ----------------------------------------------------------------*/

  4 #include"9325tp.h"

  5 #include"reg52.h"

  6 /*----------------------------------------------------------------

  7 全局变量

  8 ----------------------------------------------------------------*/

  9 #define WINDOW_XADDR_START    0x0050 // Horizontal Start Address Set

 10 #define WINDOW_XADDR_END    0x0051 // Horizontal End Address Set

 11 #define WINDOW_YADDR_START    0x0052 // Vertical Start Address Set

 12 #define WINDOW_YADDR_END    0x0053 // Vertical End Address Set

 13 #define GRAM_XADDR            0x0020 // GRAM Horizontal Address Set

 14 #define GRAM_YADDR            0x0021 // GRAM Vertical Address Set

 15 #define GRAMWR                 0x0022 // memory write

 16 

 17 #define DataPort P0                //数据口使用DataPort

 18 

 19 /*----------------------------------------------------------------

 20 定义硬件端口

 21 ----------------------------------------------------------------*/

 22 sbit CS=P2^2;        //片选

 23 sbit RES=P2^1;        //复位

 24 sbit RS=P2^4;        //数据/命令选择

 25 sbit RW=P2^5;

 26 /*----------------------------------------------------------------

 27 清屏函数

 28 输入参数:bColor 清屏所使用的背景色

 29 ----------------------------------------------------------------*/

 30 void CLR_Screen(unsigned int bColor)

 31 {

 32     unsigned int i,j;

 33     LCD_SetPos(0,240,0,320);//320x240

 34     for (i=0;i<320;i++)

 35     {

 36         

 37         for (j=0;j<240;j++)

 38             Write_Data_U16(bColor);

 39         

 40     }

 41 }

 42 /*----------------------------------------------------------------

 43 写命令、写数据

 44 输入参数:x 需要输入的命令 16位

 45 y 需要输入的数据 16位

 46 ----------------------------------------------------------------*/

 47 void  Write_Cmd_Data (unsigned char x,unsigned int y)

 48 {

 49     unsigned char m,n;

 50     m=y>>8;

 51     n=y;

 52     Write_Cmd(0x00,x);

 53     Write_Data(m,n);

 54     

 55 }

 56 

 57 /*----------------------------------------------------------------

 58 写16位数据

 59 ----------------------------------------------------------------*/

 60 void  Write_Data_U16(unsigned int y)

 61 {

 62     unsigned char m,n;

 63     m=y>>8;

 64     n=y;

 65     Write_Data(m,n);

 66     

 67 }

 68 /*----------------------------------------------------------------

 69 写命令

 70 ----------------------------------------------------------------*/

 71 

 72 void Write_Cmd(unsigned char DH,unsigned char DL)

 73 {

 74     CS=0;

 75     RS=0;

 76     

 77     DataPort=DH;

 78     RW=0;

 79     RW=1;

 80     

 81     DataPort=DL;

 82     

 83     RW=0;

 84     RW=1;

 85     CS=1;

 86 }

 87 

 88 /*----------------------------------------------------------------

 89 写数据 双8位

 90 ----------------------------------------------------------------*/

 91 void Write_Data(unsigned char DH,unsigned char DL)

 92 {

 93     

 94     CS=0;

 95     

 96     RS=1;

 97     DataPort=DH;

 98     RW=0;

 99     RW=1;

100     

101     DataPort=DL;    

102     RW=0;

103     RW=1;

104     CS=1;

105 }

106 /*----------------------------------------------------------------

107 延时函数

108 ----------------------------------------------------------------*/

109 void delayms(unsigned int count)

110 {

111     int i,j;                                                                                

112     for(i=0;i

113     {

114         for(j=0;j<260;j++);

115     }                                                                                     

116 }

117 /*----------------------------------------------------------------

118 液晶初始化

119 ----------------------------------------------------------------*/

120 void ILI9325_Initial(void)

121 { 

122     CS=1;

123     delayms(5);

124     RES=0;

125     delayms(5);

126     RES=1;

127     delayms(50);

128     Write_Cmd_Data(0x0001,0x0100); 

129     Write_Cmd_Data(0x0002,0x0700); 

130     Write_Cmd_Data(0x0003,0x1030); 

131     Write_Cmd_Data(0x0004,0x0000); 

132     Write_Cmd_Data(0x0008,0x0207);  

133     Write_Cmd_Data(0x0009,0x0000);

134     Write_Cmd_Data(0x000A,0x0000); 

135     Write_Cmd_Data(0x000C,0x0000); 

136     Write_Cmd_Data(0x000D,0x0000);

137     Write_Cmd_Data(0x000F,0x0000);

138     //power on sequence VGHVGL

139     Write_Cmd_Data(0x0010,0x0000);   

140     Write_Cmd_Data(0x0011,0x0007);  

141     Write_Cmd_Data(0x0012,0x0000);  

142     Write_Cmd_Data(0x0013,0x0000); 

143     //vgh 

144     Write_Cmd_Data(0x0010,0x1290);   

145     Write_Cmd_Data(0x0011,0x0227);

146     //delayms(100);

147     //vregiout 

148     Write_Cmd_Data(0x0012,0x001d); //0x001b

149     //delayms(100); 

150     //vom amplitude

151     Write_Cmd_Data(0x0013,0x1500);

152     //delayms(100); 

153     //vom H

154     Write_Cmd_Data(0x0029,0x0018); 

155     Write_Cmd_Data(0x002B,0x000D); 

156     

157     //gamma

158     Write_Cmd_Data(0x0030,0x0004);

159     Write_Cmd_Data(0x0031,0x0307);

160     Write_Cmd_Data(0x0032,0x0002);// 0006

161     Write_Cmd_Data(0x0035,0x0206);

162     Write_Cmd_Data(0x0036,0x0408);

163     Write_Cmd_Data(0x0037,0x0507); 

164     Write_Cmd_Data(0x0038,0x0204);//0200

165     Write_Cmd_Data(0x0039,0x0707); 

166     Write_Cmd_Data(0x003C,0x0405);// 0504

167     Write_Cmd_Data(0x003D,0x0F02); 

168     //ram

169     Write_Cmd_Data(0x0050,0x0000); 

170     Write_Cmd_Data(0x0051,0x00EF);

171     Write_Cmd_Data(0x0052,0x0000); 

172     Write_Cmd_Data(0x0053,0x013F);  

173     Write_Cmd_Data(0x0060,0xA700); 

174     Write_Cmd_Data(0x0061,0x0001); 

175     Write_Cmd_Data(0x006A,0x0000); 

176     //

177     Write_Cmd_Data(0x0080,0x0000); 

178     Write_Cmd_Data(0x0081,0x0000); 

179     Write_Cmd_Data(0x0082,0x0000); 

180     Write_Cmd_Data(0x0083,0x0000); 

181     Write_Cmd_Data(0x0084,0x0000); 

182     Write_Cmd_Data(0x0085,0x0000); 

183     //

184     Write_Cmd_Data(0x0090,0x0010); 

185     Write_Cmd_Data(0x0092,0x0600); 

186     Write_Cmd_Data(0x0093,0x0003); 

187     Write_Cmd_Data(0x0095,0x0110); 

188     Write_Cmd_Data(0x0097,0x0000); 

189     Write_Cmd_Data(0x0098,0x0000);

190     Write_Cmd_Data(0x0007,0x0133);

191     

192     

193     

194     //    Write_Cmd_Data(0x0022);//        

195 }

196 /*----------------------------------------------------------------

197 画点

198 输入参数:x,y 需要画点坐标

199 color 点的颜色

200 ----------------------------------------------------------------*/

201 void Put_pixel(unsigned char x,unsigned char y,unsigned int color)

202 {

203     LCD_SetPos(x,x,y,y);

204     Write_Data_U16(color);

205 }

206 /*----------------------------------------------------------------

207 设置坐标

208 ----------------------------------------------------------------*/

209 static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)

210 {

211     Write_Cmd_Data(WINDOW_XADDR_START,x0);

212     Write_Cmd_Data(WINDOW_XADDR_END,x1);

213     Write_Cmd_Data(WINDOW_YADDR_START,y0);

214     Write_Cmd_Data(WINDOW_YADDR_END,y1);

215     Write_Cmd_Data(GRAM_XADDR,x0);

216     Write_Cmd_Data(GRAM_YADDR,y0);

217     Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);

218 }

219 /*----------------------------------------------------------------

220 在屏幕上画线

221 输入参数:  起始坐标X0,Y0,终止坐标X1,Y1

222 color 线颜色

223 ----------------------------------------------------------------*/ 

224 void Line(unsigned int X0,

225           unsigned int Y0,

226           unsigned int X1,

227           unsigned int Y1,

228           unsigned int color)

229 {

230     int dx = X1 - X0;

231     int dy = Y1 - Y0;

232     int P  = 2 * dy - dx;

233     int dobDy = 2 * dy;

234     int dobD = 2 * (dy - dx);

235     int PointX = 0,PointY = 0;

236     int incx = 0,incy = 0;

237     int distance = 0,xerr = 0,yerr = 0;

238     unsigned int i = 0;

239     

240     if(dx == 0)        //k=1斜率为1

241     {

242         PointX = X0;

243         if(Y0 < Y1)

244         {

245             PointY = Y0;

246         }

247         else

248         {

249             PointY = Y1;

250         }

251         for(i = 0;i <= ((Y0

252         {

253             

254             Put_pixel(PointX,PointY,color);

255             PointY++;

256         }

257         return;

258     }

259     if(dy == 0)        //k=0斜率为0

260     {

261         PointY = Y0;

262         if(X0 < X1)

263         {

264             PointX = X0;

265         }

266         else

267         {

268             PointX = X1;

269         }

270         for(i = 0;i <= ((X0

271         {

272             

273             Put_pixel(PointX,PointY,color);

274             PointX++;

275         }

276         return;

277     }

278     

279     if(dx > 0)

280         incx = 1;

281     else if(dx == 0)

282         incx = 0;

283     else

284         incx = -1;

285     

286     if(dy > 0)

287         incy = 1;

288     else if(dy == 0)

289         incy = 0;

290     else

291         incy = -1;

292     

293     dx = ((X0>X1) ? (X0-X1) : (X1-X0));

294     dy = ((Y0>Y1) ? (Y0-Y1) : (Y1-Y0));

295     

296     if(dx>dy) distance=dx;

297     else distance=dy;

298     

299     PointX = X0;

300     PointY = Y0;

301     for(i=0;i<=distance+1;i++)

302     {

303         

304         Put_pixel(PointX,PointY,color);

305         xerr+=dx;

306         yerr+=dy;

307         if(xerr>distance)

308         {

309             xerr-=distance;

310             PointX+=incx;

311         }

312         if(yerr>distance)

313         {

314             yerr-=distance;

315             PointY+=incy;

316         }

317     }

318 }

319 /*---------------------------------------------------------------------------

320 绘制矩形框

321 输入参数:矩形的起始位置left,top 

322 矩形的结束位置right,bottom 

323 矩形框的颜色color

324 -----------------------------------------------------------------------------*/

325 void Rectangle(unsigned int left,

326   unsigned int top,

327   unsigned int right,

328   unsigned int bottom,

329   unsigned int color)

330 {

331   Line(left,top,right,top,color);

332   Line(left,top,left,bottom,color);

333   Line(right,top,right,bottom,color);

334   Line(left,bottom,right,bottom,color);

335 }

 

  1 #include

  2 #include"9325tp.h"

  3 

  4 /////////////////////////////////////////////////////////////////////////////////

  5 /* LCD color */

  6 #define White          0xFFFF

  7 #define Black          0x0000

  8 #define Blue           0x001F

  9 #define Red            0xF800

 10 //#define Blue2          0x051F

 11 //#define Magenta        0xF81F

 12 //#define Green          0x07E0

 13 //#define Cyan           0x7FFF

 14 //#define Yellow         0xFFE0

 15 

 16 unsigned char b_x,b_y,b_l,b_w;

 17 unsigned char m_x,m_old_x,m_y,m_l,m_w,m_v,m_a,m_l_limit_p,m_r_limit_p;

 18 unsigned char s_y,s_old_y,s_extre_part,s_v,s_a,s_u_limit_p,s_d_limit_p;

 19 

 20 unsigned char h_x,h_y,h_w;

 21 unsigned char move_x_v,move_y_v,move_a;

 22 unsigned char line_x,line_old_x,line_y,line_l,line_old_l;

 23 //--------------------------------------------------------------

 24 void init1()

 25 {

 26     b_x=10,b_y=20,b_l=80,b_w=220;

 27     m_x=m_old_x=40,m_y=10,m_l=100,m_w=70,m_v=5,m_a=0,m_l_limit_p=40,m_r_limit_p=b_x+b_w-m_l_limit_p;

 28     s_y=s_old_y=80,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;

 29 }

 30 //---------------------------Draw-------------------------------

 31 void drawBig()

 32 {

 33     Line(b_x,b_y,b_x+b_w,b_y,Black);

 34     Line(b_x,b_y+b_l,b_x+b_w,b_y+b_l,Black);

 35 }//主梁画

 36 void drawMiddle()

 37 {

 38     if(m_x!=m_old_x)Line(m_old_x,m_y,m_old_x,m_y+m_l,White);

 39     Line(m_x,m_y,m_x,m_y+m_l,Blue);

 40     if(m_x!=m_old_x)Line(m_old_x+m_w,m_y,m_old_x+m_w,m_y+m_l,White);

 41     Line(m_x+m_w,m_y,m_x+m_w,m_y+m_l,Blue);

 42 }//画横梁

 43 void drawSmall()

 44 {

 45     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);

 46     Line(m_x-s_extre_part,s_y,m_x+m_w+s_extre_part,s_y,Red);

 47 }//画小车

 48 void draw1()

 49 {

 50     drawBig();//画主梁

 51     drawMiddle();//画横梁

 52     drawSmall();//画小车

 53 }//总画函数

 54 //----------------------------run-----------------------------

 55 void runMiddle()

 56 {

 57     m_old_x=m_x;

 58     m_x+=m_v;

 59     if(m_x+m_w>=m_r_limit_p || m_x<=m_l_limit_p)m_v*=-1;//达到警戒线

 60 }//横梁移动

 61 void runSmall()

 62 {

 63     s_old_y=s_y;

 64     line_old_x=line_x;

 65     s_y+=s_v;

 66     line_x+=move_x_v;

 67     if(s_y>=s_d_limit_p || s_y<=s_u_limit_p){

 68         s_v*=-1;

 69         move_x_v*=-1;

 70     }//达到警戒线

 71 }//小车移动

 72 void run1()

 73 {

 74     runMiddle();

 75     runSmall();

 76 }//运动函数

 77 /////////////////////////////////////////////////////////////////////////////////

 78 

 79 

 80 void init2()

 81 {

 82     h_x=10,h_y=180,h_w=220;

 83     move_x_v=s_v*11/4,move_y_v=2,move_a=0;

 84     line_x=line_old_x=160,line_y=h_y+3,line_l=line_old_l=50;

 85 }

 86 //-------------------------draw--------------------------------

 87 void drawGou()

 88 {

 89     if(line_old_x!=line_x || line_old_l!=line_old_l){

 90         Rectangle(line_old_x-3,line_y+line_old_l,line_old_x+3,line_y+line_old_l+6,White);

 91         Line(line_old_x,line_y+line_old_l+6,line_old_x,line_y+line_old_l+9,White);

 92         Line(line_old_x,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+9,White);

 93         Line(line_old_x+6,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+15,White);

 94         Line(line_old_x+6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+15,White);

 95         Line(line_old_x-6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+12,White);

 96     }

 97     Rectangle(line_x-3,line_y+line_l,line_x+3,line_y+line_l+6,Blue);

 98     Line(line_x,line_y+line_l+6,line_x,line_y+line_l+9,Black);

 99     Line(line_x,line_y+line_l+9,line_x+6,line_y+line_l+9,Black);

100     Line(line_x+6,line_y+line_l+9,line_x+6,line_y+line_l+15,Black);

101     Line(line_x+6,line_y+line_l+15,line_x-6,line_y+line_l+15,Black);

102     Line(line_x-6,line_y+line_l+15,line_x-6,line_y+line_l+12,Black);    

103 }//画勾,x,y为绳的下端,r为大小

104 void drawH()

105 {

106     Line(h_x,h_y,h_x+h_w,h_y,Black);

107 }//画横梁

108 void drawHuaKuai()

109 {

110     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);

111     Rectangle(line_x-6*3/4,line_y-6,line_x+6*3/4,line_y,Blue);

112 }//画滑块,x,y为绳的上端,r为大小

113 void drawLine()

114 {

115     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);

116     Line(line_x,line_y,line_x,line_y+line_l,Black);

117 }//画线

118 void draw2()

119 {

120     drawH();

121     drawHuaKuai();

122     drawLine();

123     drawGou();

124 }

125 //------------------------run-------------------------------

126 main()

127 {

128     ILI9325_Initial(); //初始化LCD

129     CLR_Screen(White); //用背景色清屏

130     init1();//初始化1画面

131     init2();//初始化2画面

132     while(1)

133     {

134         run1();

135         draw1();

136         draw2();

137     }

138 }



关键字:TFT2.4彩屏  滑块  吊钩 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址