需求

需要通过 C 语言实现简单的数码管或者段码液晶屏的简单的菜单选项功能

解决

结构体申明和定义

.h 文件中申明:

typedef struct value_channel
{
    unsigned char dir;
    unsigned int ADCValue[128];
}v_c;

extern v_c value[4];

.c 文件中定义

v_c value[4];

函数指针

定义一个函数指针

void ( * fp)(void);

函数功能和跳转


void fun_start_01(void);
{
    ......
}

void fun_start(void)
{
    switch(cs)
    {
      case 01:
	  fp=fun_start_01;
      break;
    }
}

在菜单调用的地方使用 ( * fp)(); 即可调用相应的菜单项。

函数地址

函数地址也可以放在数组中来调用:

typedef void( * dis_turn)(void);

void dis_turn_1(void)
void dis_turn_2(void)

dis_turn dis[]={dis_turn_1,dis_turn_2};

main()
{
   dis[0]();
   dis[1]();
}

实现菜单

typedef void(*FUN_P)(void);//(int Data)

typedef struct Message_Item
{
  unsigned char cStatus;
  FUN_P fnProcess;
}MSG_ITEM;

MSG_ITEM MSGMap[]={{0x00,fun_start},{0x01,fun_normal},{0x02,fun_set0},{0x03,fun_gas},{0x04,fun_set}};

void SearchMSGMAP(void) //(unsigned char cStatus)
{
  unsigned char n=0;
  for(n=0;n<UBOND(MSGMap);n++)
  {
      if(MSGMap[n].cStatus==(cs>>4)) //(cStatus>>4))
      {
      MSGMap[n].fnProcess();
      }
  }
}

参考