你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

学习机器风格的单片机程序(2)

[复制链接]
与龙共舞 发布时间:2018-5-3 13:04
本帖最后由 与龙共舞 于 2018-5-3 14:09 编辑

上一篇是我自己抽象的逻辑,现在想直接看看别人怎么写的。
理解也进一步加深了。
第一步:框架
beeper.h
  1. //常量结构体
  2. typedef const struct _BeepConstType{
  3.         void (*BeepOn)(void);
  4.         void (*BeepOff)(void);
  5. }BeepConstType, *PBeeperConst;

  6. //变量结构体
  7. typedef struct _BeepVarType{        
  8.         WORD wTon, wToff;
  9.         volatile BYTE ucCnt, ucGpCnt;
  10.         volatile WORD* pwTbl;
  11.         volatile WORD w1msCnt;
  12.         volatile BeepStateType Status;
  13. }BeepVarType, *PBeeperVar;

  14. //类结构体
  15. typedef const struct _BeeperType{
  16.         PBeeperConst pConst;
  17.         PBeeperVar pVar;
  18. }BeeperType, *PBeeper;
复制代码

_         开头的是结构体名称 并不重要可以不要
Type   结尾的是结构体名称
*P       开头的是结构体指针名称,它和上面是一对儿
g         开头的是实例
P         开头的是类型名称

第三步:使用
先说我们最后的期望是什么 就是下面这样
BeeperType实例化一个对象,然后用指针PBeeper gpBeeper指向它。
叫做句柄。
看到
gBeepConst
gBeepVar
所以需要实例他们
  1. //类结构体
  2. BeeperType gBeeper =
  3. {
  4.       &gBeepConst, //PBeepConst pConst;
  5.       &gBeepVar //PBeepVar pVar;
  6. };
  7. //句柄
  8. PBeeper gpBeeper = &gBeeper;
复制代码


第二部:实例化

  1. void McuSetLed1 ( void )
  2. {
  3.      GPIO_SetBits ( Red_GPIO_PORT, Red_GPIO_PIN );
  4. }
  5. void McuClrLed1 ( void )
  6. {
  7.      GPIO_ResetBits ( Red_GPIO_PORT, Red_GPIO_PIN );
  8. }


  9. BeepConstType gLed1Const =
  10. {
  11.       McuSetLed1, //void (*BeepOn)(void);
  12.       McuClrLed1   //void (*BeepOff)(void);
  13. };

  14. BeepVarType gLed1Var;
  15. //类结构体
  16. BeeperType gLed1 =
  17. {
  18.     &gLed1Const, //PBeepConst pConst;
  19.     &gLed1Var //PBeepVar pVar;
  20. };


  21. //句柄
  22. PBeeper gpLed1 = &gLed1;
复制代码
主要是用句柄拿到了对象全部的属性

到这里就差不多了,可以看到方法已经填充好了。数据成员现在没有处理
看第一个函数吧。
void BeepLedInit ( void )
{
    BeepInit ( gpLed1 );
    BeepInit ( gpLed2 );
    BeepInit ( gpLed3 );
    BeepInit ( gpBeeper );
}


哈哈
//初始化函数
void BeepInit ( PBeeper pBp )
{
    pBp->pConst->BeepOff();
    pBp->pVar->wTon = 0;
    pBp->pVar->wToff = 0;
    pBp->pVar->pwTbl = NULL;
    pBp->pVar->ucCnt = 0;
    pBp->pVar->ucGpCnt = 0;
    pBp->pVar->w1msCnt = 0;
    pBp->pVar->Status = BPS_IDLE;
}




收藏 1 评论5 发布时间:2018-5-3 13:04

举报

5个回答
select326 回答时间:2018-5-3 13:23:11
看不懂啊,
Tcreat 回答时间:2018-5-3 13:24:49
看半天 没看懂什么鬼
Tcreat 回答时间:2018-5-3 13:25:50

原来不是我一个人看不懂呀 这就放心了
mjjtim 回答时间:2018-5-5 15:27:45
原来不是我一个人看不懂呀 这就放心了
zsq933106 回答时间:2018-5-6 09:49:37
这是汇编语言吗?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版