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

📄 f0b7f5f56761001d168eb4690aa46264

📁 在开发FPGA上比较有用
💻
字号:
/**************************************************************
 * 函数说明:智能型盲人导航仪
 * 
 * 
 * 
 * 备注:由NAVIGATOR 团队制作
 *  安江  曹汉超  卢茜茜  冯金龙  王耀文  常玉祥  田景  郭瑞 
**************************************************************/
#include <stdio.h>
#include <io.h>
#include <system.h>
#include <alt_types.h>
#include <string.h>
#include <stdlib.h>
// 读取键盘状态或数据超时次数
#define PS2_TIMEOVER  100000

// FreeDev PS2寄存器 OFFSET
#define PS2_STATUS 0x02
#define PS2_DATA  0x03

// FreeDev PS2状态位
#define PS2_NOACK 0x0001
#define PS2_TX_WRITE_ACK 0x0002
#define PS2_RX_DATA_READY 0x04
#define PS2_SHIFT_KEY_ON 0x08
#define PS2_RX_RELEASED 0x10
#define PS2_RX_EXTENDED 0x20

struct gps
{ 
  char    mark[12];
  char    time[10];
  char    value;
  char    dim[16];
  char    lon[15];
  char    ddmmyy[6];     
};

void *gPS2Base;

int wait_rx_ready(int count,alt_u16 *pStatus)
{
  int iRet;
  alt_u16 status,data;
  int i;
  
  if(count==0)
  {
    do{
      status=IORD(gPS2Base,PS2_STATUS);  
    }while(!(status & PS2_RX_DATA_READY)); 
    *pStatus=status; 
    return 0;
  }else
  {
    for(i=0;i<count;i++)
    {  
      status=IORD(gPS2Base,PS2_STATUS);
      if(status & PS2_RX_DATA_READY)
      {
        *pStatus=status;
        return 0;
      }
    }
    return -1;
   }
   return -1;
 } 

int read_scan_code(alt_u8 *scan_code)
{
  int iRet,i;
  alt_u16 status,data;
    
  if(wait_rx_ready(0,&status)<0)
    return -1;
  data=IORD(gPS2Base,PS2_DATA);
  *scan_code = (data & 0xff00)>>8;
  
  return 0;
   
 } 
 
int read_ascii(alt_u8 *code)
{
  int iRet;
  alt_u16 status,data;
  
  // 读键盘断码
  while(1)
  {  
    if(wait_rx_ready(0,&status)<0)
      return -1;
    if((status & PS2_RX_RELEASED))
      break;
    // 读通码
    data=IORD(gPS2Base,PS2_DATA);
  }
  
  // 读断码数据
  data=IORD(gPS2Base,PS2_DATA);
  *code = data & 0x00ff;
 
  return 0;
 } 
int init_ps2(void *base_addr)
{
  int iRet;
  unsigned char i;
  alt_u16 status,data;
  alt_u8 key;
  
  gPS2Base=base_addr;
  
  IOWR(FREEDEV_PS2_INST_BASE,PS2_DATA,0xFF);
  
 // printf("reset keyboard......\n");
  while(1)
  {
    iRet=read_scan_code(&key);
    if(iRet<0)
    {
      printf("读取键盘自测试字节错误");
      return -1;
    }
    
    if(key==0xfa)
      continue;
    else if(key!=0xaa)
      IOWR(gPS2Base,PS2_DATA,0xFF);
    else
      break;
  }
//  printf("reset keyboard OK!!\n");
  
  return 0;
}
/***************************************************************************
模块划分:以下属于gps 信息处理模块

负责人:郭瑞
***************************************************************************/
/**************************************************************
 * 函数名称:gps_module_datachuli()
 * 说明:接受GPS信号,查询当前所处地段;
 * 参数:gps接收到的经纬度值,返回为该地的值
 * 备注:navigator团队
 * 负责人;郭瑞
 ************************************************************/
int gps_module_chuli()
{
    FILE *  fp_scdt;
    char  ch;
    char data_in[80];
    char sh="1234";
    int i;
    int j;
    int m=0;
    int n=0;
    int cont[15];
    int  ditu_w[5]={1,2,3,4,5};
    int  ditu_j[5]={6,7,8,9,10};
    int  ditu_add[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}; 
    int  v=0;
    struct gps gps_data;
    FILE * fp_gps;
    if(fp_scdt=fopen("/dev/scdt_uart","r")==NULL)
         {
        printf("不能够链接到GPS!");
          }
          
          
    gps_data.dim[0]=4;
    gps_data.lon[0]=8;
    gps_data.value='A';
    if(gps_data.value!='A')
         {
         printf("不能正常定位!");
         }
  
    else 
           {
      ch=fgetc(fp_scdt);
     printf("%c",ch);
      for(i=0;i<5;i++)
                 {
        if(gps_data.dim[0]==ditu_w[i])
                     {
             m=i;
            printf("m=....%d",m);
           for(j=0;j<5;j++)
                        {
                if(gps_data.lon[0]==ditu_j[j]) 
                           {
                        n=j; 
                    printf("n=......%d",n); 
                    v=1;
                            }  
                         }
                      }   
                   }
                }
  return ditu_add[m][n]; 
 }
 int gps_module_search()
 {  
    int gps_module_chili();
    int a=gps_module_chuli();
    printf("目前您处的位置为%d",a);
    return  '4';
 }
 /******************************************************
  * 函数名称:gps_module_inguid
  * 说明:智能导航
  * 参数:输入为当前位置,输出为导航路径
  * 备注:navigator团队
  *  负责人:郭瑞
******************************************************/
int gps_module_inguid()
{
    
}

/*******************************************************
 * 函数名称:gps_module_menu()
 * 说明:GPS各功能的选择
 * 参数:键盘输入,调用各个模块
 * 备注:navigatour团队
 * 负责人:郭瑞
********************************************************/

int  gps_module_menu()
{  
int iRet;
int gps_module_search();
alt_u16 status,data;
alt_u8 key;
while(key!='0')
{
  FILE * fp_lcd;
  fp_lcd=fopen(LCD_16702_0_NAME,"w");
fprintf(fp_lcd,"follow voice\n "); 
fprintf(fp_lcd,"1:DQ chaxun");
fprintf(fp_lcd,"2:MB chaxun");
fprintf(fp_lcd,"3:ZN daohang");
fprintf(fp_lcd,"0:ZHU menu");
fprintf(fp_lcd,"4:DQ menu");     
printf(".........................................\n");
printf("请按照语音进行操作\n");
printf("正在初始化........................\n");
printf("\t1:当前位置查询\t2:目标地查询\n");
printf("\t3:进入智能导航\t0:返回主目录\n");
printf("\t其他任意键返回当前菜单\n");
printf("请输入你的操作\n");
iRet=init_ps2(FREEDEV_PS2_INST_BASE);
iRet=read_ascii(&key);
printf("%c\n",key); 
if (key<='4')
{
  switch(key)
  {
     case  '1':   key=gps_module_search();  break;
  // case  '2':   break;
  // case  '3':   break;
 //  case  '4':   break;
    default : printf("输入错误!请重新输入..................\n"); break;
  } 
} 
fclose(fp_lcd);
}

return 0;
}

int sos()
{
    FILE* fp_gps;
    char* msg="mean danger";
    fp_gps=fopen("/dev/scdt_uart", "r+");
    if(fp_gps)
    {
        fwrite(msg,strlen(msg),fp_gps);
        fclose(fp_gps);
    }
    return 0;
}







int menu()
{   
     FILE *fp_lcd;
    fp_lcd=fopen(LCD_16702_0_NAME,"w");
    int iRet;
    alt_u16 status,data;
    alt_u8 key;
  //  fprintf(fp_lcd,"................\n");
    fprintf(fp_lcd,"= 汉  =\n");
 //   fprintf(fp_lcd,"................\n");
    fprintf(fp_lcd,"follow guid!....\n");
    fprintf(fp_lcd,"汉\n");
    fprintf(fp_lcd,".2.sos message.\n");
    printf("选择一号键进入GPS导航\n");
    printf("选择二号键进入急救信息发送\n");
    printf("没有选择,进入普通模式\n");
    printf("请选择..............\n");
    iRet=init_ps2(FREEDEV_PS2_INST_BASE);
    iRet=read_ascii(&key);
    printf("%c\n",key); 
    return (key);
}


int main()
{   
     FILE *fp_lcd;
     IOWR(LCD_ON_BASE, 0x00,0x01);
     IOWR(LCD_BLON_BASE,0x00,0x01);
     
     int sos();
     alt_u8 k;
     while (1)
   {
     k=menu();
     switch (k)
     {              
         case  '1' :  gps_module_menu() ;  break ;
         case  '2' :  sos();     break ;
 //        case  '3' :  mangdaoshibie();break;
        default :  printf("输入错误,请重新输入!");
     }
     
   }
  return 0;
}

⌨️ 快捷键说明

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