我发一个运行过的源码。
在.h文件中,有如下代码:
//TVM控制状态
typedef struct _m_TVM_CTRL
{
u32(*get_coin_totval)(void); //得到此次投入硬币总金额
u32(*get_coin_totcnt)(void); //得到此次投入硬币总数目
void(*clr_coin)(void); //清空金额和数目,每次新投币开始执行
u32(*get_coin_totrval)(void);//得到此次找零的总金额
u32(*get_coin_totrcnt)(void);//得到此次找零的硬币总数目
void(*clr_rcoin)(void); //清空金额和数目,每次新找零开始执行
void(*clr_hpx)(void); //清空某个hp中的所有硬币
void(*thp_add_money)(void); //将钱数汇总到循环找零hp中,当chg_mode为1的时候,可以执行该函数
u8 cur_cmd; //当前指令 0X00,无有效指令;0X32,开始收钱;0X33,硬币回收;0X34,找零;
u16 cmd_prm; //指令参数
u8 cmd_sta; //指令执行状态
m_HP_MESSAGE hp_msg[4]; //每个hopper的状态信息
}m_TVM_CTRL;
extern m_TVM_CTRL TVM_CTRL; //控制器
在.c文件中,有如下代码:
//TVM主控制器
m_TVM_CTRL TVM_CTRL= //控制器
{
get_coin_totval,
get_coin_totcnt,
clr_coin,
get_coin_totrval,
get_coin_totrcnt,
clr_rcoin,
clr_hpx,
thp_add_money,
0,
0,
0,
0,
};
get_coin_totva, clr_coinl等都是在.c文件中存在的函数的函数名。
这样,就完成了TVM_CTRL这个结构体的函数指针初始化,
接下来就可以方便应用了。
比如我要清空TVM的金额,我只需要写:TVM_CTRL.clr_coin();即可。
又比如,我要清空某个HOPPER,只需要写:TVM_CTRL.clr_hpx();
这样可以及其方便的管理某些设备的各个状态。
你可以把任何一个外设都定义为一个结构体,然后在这个里面包含了该外设的所有执行函数,及状态变量。从而非常方便的控制该外设。
更好的是,一旦有任何新增功能,只需要在原来的结构体里面塞函数或者变量就可以了。及其方便维护。