单片机模块化编程

概述

        1、青铜示例:

#include <stdio.h>

enum {
    LED1,
    LED2,
    LED3,
    LED_NUM
};

void Func_LED1(unsigned char state);
void Func_LED2(unsigned char state);
void Func_LED3(unsigned char state);

/**
 * 函数指针数组定义格式
 * 函数返回类型 (*指针变量名[数组大小])(函数参数列表);
 * @param state
 * @return
 *
 */
void (*func[LED_NUM])(unsigned char state) = {Func_LED1, Func_LED2, Func_LED3};

void Func_LED1(unsigned char state)
{
    if (state)
        printf("LED1 ON\r\n");
    else
        printf("LED1 OFF\r\n");
}

void Func_LED2(unsigned char state)
{
    if (state)
        printf("LED2 ON\r\n");
    else
        printf("LED2 OFF\r\n");
}

void Func_LED3(unsigned char state)
{
    if (state)
        printf("LED3 ON\r\n");
    else
        printf("LED3 OFF\r\n");
}

int main() {

//    for (int i = 0; i < LED_NUM; ++i) {
//        func[i](1);
//    }

    func[LED1](1);
    func[LED2](1);
    func[LED3](1);

    return 0;
}

运行结果:

2、白银示例:

key.h文件

//
// Created by champion on 2021/11/30.
//

#ifndef UNTITLED1_KEY_H
#define UNTITLED1_KEY_H

typedef enum {
    KEY1,
    KEY2,
    KEY_NUM,
}KEY_ID_TYDEF;

typedef enum {
    KEY_IDLE,       //空闲
    KEY_PRESS,      //短按
    KEY_LONG_PRESS, //长按
    KEY_RELEASE,    //释放
}KEY_STATE_TYDEF;




typedef void (*pKeyScanCallBack) (KEY_ID_TYDEF KEY_ID, KEY_STATE_TYDEF KEY_STATE);

void keyScanCBRegister(pKeyScanCallBack pCB);
void keyInit(void);
void keyPoll(void);

#endif; //UNTITLED1_KEY_H

key.c文件

//
// Created by champion on 2021/11/30.
//
#include <stdio.h>
#include "key.h"

KEY_ID_TYDEF keyID;
KEY_STATE_TYDEF keyState;
pKeyScanCallBack pkeyScanCB;


void keyInit(void)
{
    keyID = 0;
    keyState = KEY_IDLE;
    pkeyScanCB = NULL;
}

void keyScanCBRegister(pKeyScanCallBack pCB)
{
    if (pkeyScanCB == NULL) {
        pkeyScanCB = pCB;
    }
}


void keyPoll(void)
{
    printf("Please Enter key ID: \r\n");
    if (scanf("%d", &keyID) == 1) {
        printf("\r\n");
        printf("Please Enter key state: \r\n");
        if (scanf("%d", &keyState) == 1) {
            //keyScanHandle(keyID, keyState) 这里相当于下面这句话,通过这样的方法,封装好硬件层于应用层的API
            if (pkeyScanCB != NULL) {
                pkeyScanCB(keyID, keyState);
            }
        }
    }
}

main.c文件

#include <stdio.h>
#include "key.h"
#include "stdint.h"

typedef struct {
    uint8_t value;
    void (*run_func)(void);
}FuncTYpedef;


void keyScanHandle(KEY_ID_TYDEF KEY_ID, KEY_STATE_TYDEF KEY_STATE)
{
    printf("KEY_ID :%d, KEY_STATE :%d \r\n", KEY_ID, KEY_STATE);
}


void run_fun(void)
{
    keyInit();
    keyScanCBRegister(keyScanHandle);
    keyPoll();
}

int main() {

    /**
     * 定义结构体变量
     * */
    FuncTYpedef init_fun = {
            .value = 10,
            .run_func = run_fun,
    };
    init_fun.value = 100;
    init_fun.run_func();

    /**
     * 结构体变量指针变量
     */
//    FuncTYpedef *pFun = {
//           // pFun->value = 0,
//            pFun->run_func = run_fun,
//    };
//    pFun->value = 200;
//    pFun->run_func();

    return 0;
}

运行结果:

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch_champion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值