我發一個運行過的源碼。
在.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();
這樣可以及其方便的管理某些設備的各個狀態。
你可以把任何一個外設都定義爲一個結構體,然後在這個裏面包含了該外設的所有執行函數,及狀態變量。從而非常方便的控制該外設。
更好的是,一旦有任何新增功能,只需要在原來的結構體裏面塞函數或者變量就可以了。及其方便維護。