Skip to content

回调函数

c
typedef void (*Timer0_Callback)(void); // 定义函数指针
c
#define MAX_CALLBACK_COUNT 2

static Timer0_Callback s_callbacks[MAX_CALLBACK_COUNT]; // 函数指针数组

void Dri_Timer0_Init()
{
    u8 i;
    // 1.启用中断
    EA  = 1;
    ET0 = 1;

    // 2.工作模式:GATE=0;C/T=0;M1=0,M0=1
    TMOD &= 0xF0;
    TMOD |= 0x01;

    // 3.初始值
    TL0 = 64614;
    TH0 = 64614 >> 8; // 1ms

    // 4.启动
    TR0 = 1;

    // 5.初始化函数指数组
    for (i = 0; i < MAX_CALLBACK_COUNT; i++) {
        s_callbacks[i] = NULL;
    }
}

bit Dri_Timer0_RegisterCallback(Timer0_Callback callback)
{
    u8 i;
    // 确保不会重复注册
    for (i = 0; i < MAX_CALLBACK_COUNT; i++) {
        if (s_callbacks[i] == callback) {
            return 1;
        }
    }

    // 寻找坑位
    for (i = 0; i < MAX_CALLBACK_COUNT; i++) {
        if (s_callbacks[i] == NULL) {
            s_callbacks[i] = callback;
            return 1;
        }
    }

    return 0;
}

bit Dri_Timer0_DeregisterCallback(Timer0_Callback callback)
{
    u8 i;
    for (i = 0; i < MAX_CALLBACK_COUNT; i++) {
        if (s_callbacks[i] == callback) {
            s_callbacks[i] = NULL;
            return 1;
        }
    }

    return 0;
}

void Dri_Timer0_Handler() interrupt 1
{
    u8 i;
    // 1.重新装载初始值
    TL0 = 64614;
    TH0 = 64614 >> 8;

    // 2.轮询函数指针数组
    for (i = 0; i < MAX_CALLBACK_COUNT; i++) {
        if (s_callbacks[i] != NULL) {
            s_callbacks[i]();
        }
    }
}
最近更新