Vehicle
函数 | 变量
vehicle.c 文件参考

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

#include "vehicle.h"
vehicle.c 的引用(Include)关系图:

函数

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

变量

Vehicle vehicle
 
char speed [10]
 
unsigned char display_flag = 0
 

详细描述

赛车模拟控制程序源文件


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

函数说明

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 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 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 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 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 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 __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

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

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 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 }

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

变量说明

Vehicle vehicle
初始值:
= {
90, 0, 1, 2}

赛车结构体

char speed[10]

LCD 左上角显示的当前速度

unsigned char display_flag = 0

显示控制标志