⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 navigation.lst

📁 此程序是GPS定位导航程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 175   1          pnode = (path_t *)malloc(sizeof(path_t));
 176   1          assert(pnode);
 177   1      
C51 COMPILER V8.02   NAVIGATION                                                            05/25/2008 15:06:03 PAGE 4   

 178   1          /* 计算下一个位置的坐标 */
 179   1          pX += move[minId][0];
 180   1          pY += move[minId][1];
 181   1      
 182   1          pnode->pos      = create_pos(pX, pY);
 183   1          pnode->prev   = p;
 184   1          pnode->next   = (path_t *)0;
 185   1          pnode->direct = 0;
 186   1      
 187   1          /* 在新位置处,计算下一个位置可用的移动方向 */
 188   1          for(i = 0; i < 4; ++i) {
 189   2              if(maze[pY + move[i][1]][pX + move[i][0]] != PATH_BLOCK && maze[pY + move[i][1]][pX + move[i][0]] 
             -!= PATH_FOOTPRINT) {
 190   3                  /* 若尝试的下一个位置不是障碍物或自己走过的足迹,则视为可用方向,获得该方向的信号量 */
 191   3                      pnode->direct |= d_signal[i];
 192   3              }
 193   2          }
 194   1      
 195   1          return pnode;
 196   1      
 197   1      }
 198          
 199          /*
 200          == A*算法寻径函数 ===========================================
 201          -eX
 202          -eY                  :入口坐标
 203          -qX
 204          -qY                  :出口坐标
 205          -maze              :迷宫矩阵
 206          =============================================================
 207          */
 208          
 209          path_t * AStar(uint_t eX, uint_t eY, uint_t qX, uint_t qY, byte_t maze[MAZE_HEIGHT][MAZE_WIDTH]) {
 210   1          register int i;
 211   1      
 212   1      
 213   1          /* 压缩坐标 */
 214   1          uint_t quit_pos = create_pos(qX, qY);
 215   1      
 216   1          /* 构建入口路径节点,视为路径链的头 */
 217   1          path_t *head = (path_t *)malloc(sizeof(path_t));
 218   1          path_t *p    = (path_t *)0;
 219   1          path_t *back = (path_t *)0;
 220   1          assert(head);
 221   1      
 222   1          p = head;
 223   1          p->direct = 0;
 224   1          p->pos    = create_pos(eX,eY);
 225   1          p->next   = (path_t *)0;
 226   1          p->prev   = (path_t *)0;
 227   1      
 228   1          /* 创建入口处的可用方向 */
 229   1          for(i = 0; i < 4; ++i) {
 230   2              if(maze[eY + move[i][1]][eX + move[i][0]] != PATH_BLOCK)
 231   2                  /* 若无障碍物则获得该方向的信号量 */
 232   2                  p->direct |= d_signal[i];
 233   2          }
 234   1      
 235   1          do {
 236   2      
 237   2              /* 获得下个路径的节点指针 */
 238   2              back = evaluate(p, qX, qY, maze);
C51 COMPILER V8.02   NAVIGATION                                                            05/25/2008 15:06:03 PAGE 5   

 239   2              if(back) {
 240   3                  p->next = back;
 241   3                  p = p->next;
 242   3              }
 243   2      
 244   2              /* 无路可走则折回 */
 245   2              if(p->direct == 0 && p != head && p->pos != quit_pos) {
 246   3                  back = p->prev;
 247   3                  back->next = (path_t *)0;
 248   3      
 249   3                  /* 清楚脚印 */
 250   3                  maze[p->pos & 0x00FF][p->pos >> 8] = (byte_t)PATH_WALKON;
 251   3      
 252   3                  free(p);
 253   3                  p = back;
 254   3              }
 255   2      
 256   2              /* 若走不出迷宫,即折回到入口,且入口处的可用方向全部尝试过 */
 257   2              if(p == head && p->direct == 0) {
 258   3                  free(head);
 259   3                  return (path_t *)0;
 260   3              }
 261   2      
 262   2          } while( p->pos != quit_pos );
 263   1      
 264   1          /* 在出口处留下脚印,便于打印 */
 265   1          maze[p->pos & 0x00FF][p->pos >> 8] = (byte_t)PATH_FOOTPRINT;
 266   1      
 267   1          return head;
 268   1      
 269   1      }
 270          /*****************************************************************/
 271          
 272          
 273          /*****************************************************************/
 274          /*函数名称: show_menu_DaoHang.c                                 */
 275          /*函数功能: GPS导航                                             */      
 276          /*有无返回: 无                                                  */
 277          /*修改记录: 无修改记录                                          */
 278          /*入口参数: 
 279                       start_x------------------------------------起点x坐标
 280                                   start_y------------------------------------起点y坐标
 281                                   end_x  ------------------------------------终点x坐标
 282                                   end_y  ------------------------------------终点y坐标
 283                                                                                       */
 284          /*编写日期: 2008-5-01                                           */
 285          /*****************************************************************/
 286          
 287          //void show_menu_DaoHang(unsigned char start_x,unsigned char start_y,unsigned char end_x,unsigned char end
             -_y)
 288          void show_menu_DaoHang()
 289           {
 290   1           register unsigned char  i=0,j=0; 
 291   1               path_t *pHead;
 292   1               byte_t    mazetemp[MAZE_HEIGHT][MAZE_WIDTH]={0};
 293   1      
 294   1               for(i = 0; i < MAZE_HEIGHT; ++i) 
 295   1               {
 296   2              for(j = 0; j < MAZE_WIDTH; ++j)
 297   2                  mazetemp[i][j]=maze[i][j];
 298   2           
 299   2               } 
C51 COMPILER V8.02   NAVIGATION                                                            05/25/2008 15:06:03 PAGE 6   

 300   1           pHead=AStar((uint_t)(Position/1000),(uint_t)(Position%1000/100),(uint_t)(Position%100/10),(uint_t)(Po
             -sition%10),mazetemp);
 301   1        
 302   1          
 303   1          /* 打印地图 */
 304   1       
 305   1           for(i = 0; i < MAZE_HEIGHT; ++i) 
 306   1               {
 307   2              for(j = 0; j < MAZE_WIDTH; ++j)
 308   2              Display_Point(j,i,symbol[mazetemp[i][j]]);
 309   2                      /*
 310   2                                j-------代表x方向
 311   2                                i-------代表y方向
 312   2                                symbolic-路径显示         
 313   2                      */
 314   2      
 315   2           }
 316   1       
 317   1      }
 318           
 319          void Show_Map()
 320          {
 321   1      
 322   1               register unsigned char point_x=0,point_y=0;
 323   1           for(point_y = 0; point_y < MAZE_HEIGHT; ++point_y) 
 324   1               {
 325   2              for(point_x = 0; point_x < MAZE_WIDTH; ++point_x)
 326   2      
 327   2      //         Display_Point(point_x,point_y,symbol[maze[point_y][point_x]]);
 328   2                         Display_Point(point_x,point_y,symbol[maze0[point_y][point_x]]);
 329   2                      
 330   2                              /*        i-------代表y方向                                                                                                     
 331   2                                j-------代表x方向
 332   2                                   symbolic-路径显示      
 333   2                          */
 334   2      
 335   2           }
 336   1      
 337   1      }
 338            
 339              


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2737    ----
   CONSTANT SIZE    =    348    ----
   XDATA SIZE       =    550     326
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -