>_<:>
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 }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』