Vehicle
结构体 | 宏定义 | 函数
vehicle.h 文件参考

赛车模拟控制程序头文件 更多...

#include "def.h"
#include "consol.h"
#include "S3c2410x.h"
#include "INT.h"
#include "2410lib.h"
#include "lcdlib.h"
#include <stdio.h>
#include <math.h>
vehicle.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

结构体

struct  Vehicle
 

宏定义

#define PI   3.14
 
#define COVER_BUF   0x32000000
 
#define BACKGROUND_BUF   0x31000000
 
#define SPEED_X   10
 
#define SPEED_Y   200
 
#define SPEED_W   90
 
#define SPEED_H   21
 
#define TRACK_RADIUS   100
 
#define TRACK_CENTRE_X   200.0f
 
#define TRACK_CENTRE_Y   120.0f
 
#define TRACK_WIDTH_HALF   17.0f
 
#define TRACK_COLOR   0x000000
 
#define VEHICLE_WIDTH_HALF   11
 
#define VEHICLE_COLOR   0xffff00
 

函数

void VehicleInit (void)
 赛车程序初始化函数 更多...
 
void VehicleStatusUpdate (void)
 更新赛车数据 更多...
 
void VehicleDisplays (void)
 显示赛车状态 更多...
 
void DisplaySMG (void)
 数码管显示函数 在左边两位显示当前已走圈数 更多...
 
void DisplayLED (int flag)
 LED 显示函数 更多...
 
void DisplayOneSMG (int p, int num, int dot)
 数码管显示函数 更多...
 
void DrawVehicle (float p, COLOR c)
 绘制赛车,即一个小矩形 更多...
 
void DrawTrack (void)
 绘制圆形赛道 更多...
 
void DrawRect (void)
 绘制蓝色矩形方块 更多...
 
void delay (int time)
 简单的延时函数 更多...
 
void __irq INT0_Handler (void)
 按键1中断处理函数 每按一次“档位”成员变量自减一 更多...
 
void __irq INT2_Handler (void)
 按键2中断处理函数 每按一次“档位”成员变量自增一 更多...
 

详细描述

赛车模拟控制程序头文件


作者
Gump, LDR
版本
V0.1
日期
2019-12-08

宏定义说明

#define PI   3.14

圆周率Π

#define COVER_BUF   0x32000000

背景图像地址

#define BACKGROUND_BUF   0x31000000

背景图像地址

#define SPEED_X   10

速度显示框横坐标

#define SPEED_Y   200

速度显示框纵坐标

#define SPEED_W   90

速度显示框宽度

#define SPEED_H   21

速度显示框高度

#define TRACK_RADIUS   100

赛道半径

#define TRACK_CENTRE_X   200.0f

赛道中心横坐标

#define TRACK_CENTRE_Y   120.0f

赛道中心纵坐标

#define TRACK_WIDTH_HALF   17.0f

赛道宽度的一半,实际长度 34 (赛车方块的对角线长度)

#define TRACK_COLOR   0x000000

赛道颜色

#define VEHICLE_WIDTH_HALF   11

赛车宽度的一半,实际长度 23

#define VEHICLE_COLOR   0xffff00

赛车颜色

函数说明

void VehicleInit ( void  )

赛车程序初始化函数

28 {
29  /* 绘制跑道背景图 */
30  unsigned char *ptr = (unsigned char *)BACKGROUND_BUF;
31  ShowImage(ptr, 0, 0, 1);
32 
33  /* 绘制跑道 */
34  DrawTrack();
35 
36  /* 绘制赛车 */
38 }
void DrawVehicle(float p, COLOR c)
绘制赛车,即一个小矩形
Definition: vehicle.c:234
#define VEHICLE_COLOR
Definition: vehicle.h:53
#define BACKGROUND_BUF
Definition: vehicle.h:39
void DrawTrack(void)
绘制圆形赛道
Definition: vehicle.c:204

函数调用图:

这是这个函数的调用关系图:

void VehicleStatusUpdate ( void  )

更新赛车数据

待办事项:
根据为赛车增加加速度属性值,使得赛车速度切换更加真实
46 {
47  static int led_counter; /* LED 闪烁计数器 */
48  static unsigned char led_status = 0; /* LED 当前状态 */
49 
50  /* 赛车前进 ****************************************************************/
51  /* 清除赛车当前位置 */
52  DrawVehicle(vehicle.position, 0xffffff);
53 
54  // if (vehicle.speed < vehicle.gear * 10) /* 后续改为根据加速度递增 */
55  /* “档位”映射为“速度” */
56  vehicle.speed = vehicle.gear * 10;
57 
58  /* “速度”成员变量格式化为字符串字面量 */
59  sprintf(speed, "Speed: %2d", vehicle.speed);
60 
61  /* 赛车位置前进 */
63 
64  /* 圈数增加 ****************************************************************/
65  if (vehicle.position > 360)
66  {
67  vehicle.position -= 360;
68  vehicle.laps++;
69  /* 每五圈就在数码管上显示当前圈数 */
70  if (((vehicle.laps) % 5) == 0)
71  {
72  display_flag = 1;
73  }
74  /* 只显示两位圈数 */
75  if (vehicle.laps >= 100)
76  {
77  vehicle.laps -= 100;
78  }
79  }
80 
81  /* 转换灯状态 **************************************************************/
82  /* 计数器循环计数 */
83  /* 数字 3 为档位放大系数,闪烁频率与档位呈正相关 */
84  if (led_counter < (4 - vehicle.gear) * 3)
85  {
86  led_counter++;
87 
88  /* LED显示 */
89  LED_Display(led_status);
90  }
91  /* 计数完成时 */
92  else if (led_counter >= (4 - vehicle.gear) * 3)
93  {
94  /* 计数器清零 */
95  led_counter = 0;
96 
97  /* 反转LED状态 */
98  led_status = (led_status == 1) ? 0 : 1;
99  }
100 }
unsigned char display_flag
Definition: vehicle.c:20
unsigned char speed
Definition: vehicle.h:30
Vehicle vehicle
Definition: vehicle.c:16
void DrawVehicle(float p, COLOR c)
绘制赛车,即一个小矩形
Definition: vehicle.c:234
float position
Definition: vehicle.h:29
volatile unsigned char gear
Definition: vehicle.h:32
unsigned char laps
Definition: vehicle.h:31
char speed[10]
Definition: vehicle.c:19

函数调用图:

这是这个函数的调用关系图:

void VehicleDisplays ( void  )

显示赛车状态

107 {
108  /* 绘制赛车 */
110 
111  DrawRect();
112  drawascii168(12, 220, speed, 1, 1, 0xffffff);
113 
114  /* 显示圈数与速度*/
115  if (display_flag != 0)
116  {
117  DisplaySMG();
118  display_flag = 0;
119  }
120 }
unsigned char display_flag
Definition: vehicle.c:20
Vehicle vehicle
Definition: vehicle.c:16
void DisplaySMG(void)
数码管显示函数 在左边两位显示当前已走圈数
Definition: vehicle.c:126
void DrawVehicle(float p, COLOR c)
绘制赛车,即一个小矩形
Definition: vehicle.c:234
float position
Definition: vehicle.h:29
#define VEHICLE_COLOR
Definition: vehicle.h:53
void DrawRect(void)
绘制蓝色矩形方块
Definition: vehicle.c:254
char speed[10]
Definition: vehicle.c:19

函数调用图:

这是这个函数的调用关系图:

void DisplaySMG ( void  )

数码管显示函数 在左边两位显示当前已走圈数

127 {
128  unsigned int i;
129 
130  for (i = 0; i < 100; i++) /* 显示一段时间 */
131  {
132  /* 数码管前两位显示圈数 */
133  DisplayOneSMG(0, vehicle.laps / 10, 0);
134  delay(5);
135  DisplayOneSMG(1, vehicle.laps % 10, 0);
136  delay(5);
137  }
138 
139  /* 显示完后清除数码管数据 */
140  DisplayOneSMG(0, 15, 0);
141  DisplayOneSMG(1, 15, 0);
142 }
void delay(int time)
简单的延时函数
Definition: vehicle.c:303
Vehicle vehicle
Definition: vehicle.c:16
void DisplayOneSMG(int p, int num, int dot)
数码管显示函数
Definition: vehicle.c:154
unsigned char laps
Definition: vehicle.h:31

函数调用图:

这是这个函数的调用关系图:

void DisplayLED ( int  flag)

LED 显示函数

参数
flag控制标志
186 {
187 
188  if (flag == 1) /* led on */
189  {
190  rGPFDAT &= ~(1 << 7);
191  rGPFDAT &= ~(1 << 4);
192  }
193  else /* led off */
194  {
195  rGPFDAT |= 1 << 7;
196  rGPFDAT |= 1 << 4;
197  }
198 }
void DisplayOneSMG ( int  p,
int  num,
int  dot 
)

数码管显示函数

参数
p数字在数码管中的位置
  • 0..3 从右到左依次为 0 ~ 3 位
num要显示的数字
dot是否显示小数点
  • 0 不显示小数点
  • 1 显示小数点
155 {
156  status(p)
157  {
158  case 0:
159  rGPGDAT &= ~(1 << 2); /* 设置数码管的位选 GPG2 = 0 (COM1) */
160  rGPEDAT &= ~(1 << 9); /* 设置数码管的位选 GPE9 = 0 (COM2) */
161  break;
162  case 1:
163  rGPGDAT |= (1 << 2); /* 设置数码管的位选 GPG2 = 1 (COM1) */
164  rGPEDAT &= ~(1 << 9); /* 设置数码管的位选 GPE9 = 0 (COM2) */
165  break;
166  case 2:
167  rGPGDAT &= ~(1 << 2); /* 设置数码管的位选 GPG2 = 0 (COM1) */
168  rGPEDAT |= (1 << 9); /* 设置数码管的位选 GPE9 = 1 (COM2) */
169  break;
170  case 3:
171  rGPGDAT |= (1 << 2); /* 设置数码管的位选 GPG2 = 1 (COM1) */
172  rGPEDAT |= (1 << 9); /* 设置数码管的位选 GPE9 = 1 (COM2) */
173  break;
174  }
175 
176  rGPEDAT = (rGPEDAT & ~(0x3C00)) | (num << 10); /* 对应数字 6 */
177  rGPHDAT = (rGPHDAT & ~(1 << 8)) | (dot << 8);
178 }

这是这个函数的调用关系图:

void DrawVehicle ( float  p,
COLOR  c 
)

绘制赛车,即一个小矩形

参数
p赛车当前所处在赛道的位置
c赛车颜色
235 {
236  int i, j;
237 
238  /* 以矩形的几何中心为定位点,从左上角到右下角绘制矩形 */
239  for (i = -VEHICLE_WIDTH_HALF; i < VEHICLE_WIDTH_HALF; i++)
240  {
241  for (j = -VEHICLE_WIDTH_HALF; j < VEHICLE_WIDTH_HALF; j++)
242  {
243  setpixel(TRACK_CENTRE_X + TRACK_RADIUS * cos(p * PI / 180.0f) + i,
244  TRACK_CENTRE_Y + TRACK_RADIUS * sin(p * PI / 180.0f) + j,
245  c);
246  }
247  }
248 }
#define TRACK_CENTRE_X
Definition: vehicle.h:47
#define PI
Definition: vehicle.h:36
#define TRACK_CENTRE_Y
Definition: vehicle.h:48
#define VEHICLE_WIDTH_HALF
Definition: vehicle.h:52
#define TRACK_RADIUS
Definition: vehicle.h:46

这是这个函数的调用关系图:

void DrawTrack ( void  )

绘制圆形赛道

205 {
206  int i, j;
207 
208  for (i = 0; i <= 360; i++)
209  {
210  for (j = TRACK_WIDTH_HALF - 1; j > -TRACK_WIDTH_HALF; j--)
211  {
212  setpixel(TRACK_CENTRE_X + (TRACK_RADIUS + j) * cos(i * PI / 180.0f),
213  TRACK_CENTRE_Y + (TRACK_RADIUS + j) * sin(i * PI / 180.0f),
214  0xffffff); /* 绘制白色内道 */
215  }
216 
217  /* 绘制黑色赛道描边 */
218  /* 用弧度表示角度,1度= Π/180(rad) */
219  setpixel(TRACK_CENTRE_X + (TRACK_RADIUS + TRACK_WIDTH_HALF) * cos(i * PI / 180.0f),
220  TRACK_CENTRE_Y + (TRACK_RADIUS + TRACK_WIDTH_HALF) * sin(i * PI / 180.0f),
221  TRACK_COLOR); /* 绘制外描边 */
222  setpixel(TRACK_CENTRE_X + (TRACK_RADIUS - TRACK_WIDTH_HALF) * cos(i * PI / 180.0f),
223  TRACK_CENTRE_Y + (TRACK_RADIUS - TRACK_WIDTH_HALF) * sin(i * PI / 180.0f),
224  TRACK_COLOR); /* 绘制内描边 */
225  }
226 }
#define TRACK_CENTRE_X
Definition: vehicle.h:47
#define TRACK_WIDTH_HALF
Definition: vehicle.h:49
#define TRACK_COLOR
Definition: vehicle.h:50
#define PI
Definition: vehicle.h:36
#define TRACK_CENTRE_Y
Definition: vehicle.h:48
#define TRACK_RADIUS
Definition: vehicle.h:46

这是这个函数的调用关系图:

void DrawRect ( void  )

绘制蓝色矩形方块

255 {
256 
257  int i, j;
258 
259  for (i = 0; i < SPEED_W; i++)
260  {
261  for (j = 0; j < SPEED_H; j++)
262  {
263  setpixel(SPEED_X + i,
264  SPEED_Y + j,
265  0x0000ff);
266  }
267  }
268 }
#define SPEED_X
Definition: vehicle.h:41
#define SPEED_H
Definition: vehicle.h:44
#define SPEED_Y
Definition: vehicle.h:42
#define SPEED_W
Definition: vehicle.h:43

这是这个函数的调用关系图:

void delay ( int  time)

简单的延时函数

参数
time延时次数
304 {
305  int i, j;
306  for (i = 0; i < time; i++)
307  for (j = 0; j < 1000; j++)
308  ;
309 }

这是这个函数的调用关系图:

void __irq INT0_Handler ( void  )

按键1中断处理函数 每按一次“档位”成员变量自减一

289 {
290  if (vehicle.gear > 0)
291  {
292  vehicle.gear--;
293  }
294 
295  ClearInt();
296 }
Vehicle vehicle
Definition: vehicle.c:16
volatile unsigned char gear
Definition: vehicle.h:32

这是这个函数的调用关系图:

void __irq INT2_Handler ( void  )

按键2中断处理函数 每按一次“档位”成员变量自增一

275 {
276  if (vehicle.gear < 3)
277  {
278  vehicle.gear++;
279  }
280 
281  ClearInt();
282 }
Vehicle vehicle
Definition: vehicle.c:16
volatile unsigned char gear
Definition: vehicle.h:32

这是这个函数的调用关系图: