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

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

[复制链接]
GKoSon 发布时间:2018-5-3 13:04
本帖最后由 与龙共舞 于 2018-5-3 14:09 编辑
1 s) ^. ^3 T3 @& E
# ~* o5 X4 v8 v& r8 f$ \上一篇是我自己抽象的逻辑,现在想直接看看别人怎么写的。
) x* Z+ @2 A2 P理解也进一步加深了。- A$ }, G+ a3 ?6 e3 Y
第一步:框架; J1 f: P% j% k/ d8 V3 P
beeper.h
  1. //常量结构体" F" U* L& C% f- ]" M+ p
  2. typedef const struct _BeepConstType{
    & @! }# q8 {, v9 p4 }1 N
  3.         void (*BeepOn)(void);
    2 V9 M* j; P: K( ^! s4 m& A3 m1 R
  4.         void (*BeepOff)(void);
    $ F5 q# o" s0 u! {. L' Q% r
  5. }BeepConstType, *PBeeperConst;
    ! E1 \5 S, |8 L7 l/ `1 {

  6. 1 S) H" `# [' B' K! I9 l9 ^
  7. //变量结构体
    : ?; F' M' T9 W' F+ d2 w
  8. typedef struct _BeepVarType{        ) j9 h/ ?& [8 w: W
  9.         WORD wTon, wToff;
      F! v4 w8 M! d+ |! k
  10.         volatile BYTE ucCnt, ucGpCnt;
    % Y% v. K% C" v1 o1 s
  11.         volatile WORD* pwTbl;
    + `% `' i3 \) M8 @$ }8 x
  12.         volatile WORD w1msCnt;
    3 u7 I4 H% |; {
  13.         volatile BeepStateType Status;! D$ d3 e0 e9 h* e
  14. }BeepVarType, *PBeeperVar;
    2 J0 I9 v% L1 k

  15. % y* A: O- [9 ^  [+ g1 Q% {; E
  16. //类结构体2 _; N% O, T- L1 q
  17. typedef const struct _BeeperType{
    # \) M" r5 v5 f; a8 D; G' B- L: b3 p7 P
  18.         PBeeperConst pConst;9 p; k* L# F3 d6 r. i6 S
  19.         PBeeperVar pVar;- y" {5 A& T' H. J
  20. }BeeperType, *PBeeper;
复制代码
5 w) U" i4 T, G1 [+ \, @+ x" r
_         开头的是结构体名称 并不重要可以不要% X  S; }4 n. b
Type   结尾的是结构体名称
3 [, i: q* V7 r0 J* u6 c& Y*P       开头的是结构体指针名称,它和上面是一对儿. W& D2 H3 C4 V3 h% P4 `2 o5 u, p
g         开头的是实例- l* `! V( e- `1 u" T
P         开头的是类型名称4 s( @4 A5 Q) |3 z' o% }! w

; ^$ A% ?* G" ?8 c* K. F/ B% ?第三步:使用
( u" X! `9 h$ r$ N2 C% j先说我们最后的期望是什么 就是下面这样
! Q5 ?( L& [- c7 E5 QBeeperType实例化一个对象,然后用指针PBeeper gpBeeper指向它。
& w5 a9 d/ y8 d叫做句柄。$ U/ r! H- G1 D& E% ?
看到& ]3 [3 R  _( L$ }+ [% O
gBeepConst' o: N! f) Z6 q* T; {5 c
gBeepVar
& w, ~/ f2 X3 d% R( i所以需要实例他们
) v' u% l5 [# f4 B+ d# E
  1. //类结构体: Z7 ~  M) v; }) o
  2. BeeperType gBeeper =1 F, S% g$ M; V5 a' M% ]8 V
  3. {
    7 D9 v( C3 F, ]4 ?- d; J
  4.       &gBeepConst, //PBeepConst pConst;
    / [" R% t# e0 F3 d
  5.       &gBeepVar //PBeepVar pVar;
    3 E( D' u( s+ T1 j
  6. };
    1 ^: t7 n: Y& l# s4 m; o! X
  7. //句柄
    . `* i! s/ g, }* j
  8. PBeeper gpBeeper = &gBeeper;
复制代码

9 G- O% N$ H4 {$ r! O9 C% o0 t' E- T, `0 Y4 y/ ~( N' Y
第二部:实例化
" O# N3 G& J0 u, ^) @, I
  1. . w+ R: W. t1 E6 R
  2. void McuSetLed1 ( void )
    6 a! H7 a) ?  S" w- X0 ]
  3. {& n. I, }5 D$ c( q* g
  4.      GPIO_SetBits ( Red_GPIO_PORT, Red_GPIO_PIN );
    % H. b) v2 X! ]( x
  5. }
    # }( {4 b: o  V3 o
  6. void McuClrLed1 ( void ); [2 j* j0 C4 u: j5 e! ^# P8 {
  7. {1 {, Y! N* s; \+ C  K' R* y
  8.      GPIO_ResetBits ( Red_GPIO_PORT, Red_GPIO_PIN );
    2 g0 ^0 m4 e. s- ?# h
  9. }
    * w3 o. s3 D# p! J+ Z

  10. : Q4 z' a( ?! x2 T0 E4 {4 Z& ~
  11. ' k4 F1 }' v9 |, m1 c! e( j- b
  12. BeepConstType gLed1Const =! q4 m' [( a( E
  13. {
    ' `" Z& w. {4 ]) H9 ?. ~1 F
  14.       McuSetLed1, //void (*BeepOn)(void);* I4 X- q- G2 r
  15.       McuClrLed1   //void (*BeepOff)(void);
    4 g6 b+ @- L( ?9 X
  16. };: S# j) u0 L7 f$ r9 u* I) o' U& L$ R) s

  17. / z2 J7 }' r6 V/ M- P& _2 ?
  18. BeepVarType gLed1Var;
    8 T% T$ n& h& P4 E! e$ }2 F
  19. //类结构体* @3 |5 [# ?5 G
  20. BeeperType gLed1 =% Z* H0 E/ c. g- D% G
  21. {
    & E5 Z* r+ Z# h2 [, V( X8 W+ R' R
  22.     &gLed1Const, //PBeepConst pConst;" x+ K1 Z. V6 _1 x8 c. m; I" r
  23.     &gLed1Var //PBeepVar pVar;+ C! O% l& O6 x' t4 h; p" u  O
  24. };
    . C! n# Q' Y, P, V# ~

  25.   @$ a8 R  w% F9 q+ O5 g/ r; g" z  o1 N1 b

  26. $ U$ |" _0 s; {/ [5 N
  27. //句柄
    - b& s" G4 u" `! Z! F+ Y. h
  28. PBeeper gpLed1 = &gLed1;
复制代码
主要是用句柄拿到了对象全部的属性0 }9 D: d4 X# B
) X. u- T. d( ~+ \
到这里就差不多了,可以看到方法已经填充好了。数据成员现在没有处理
& A: a1 O  O) `% K# b3 r$ c+ a看第一个函数吧。2 Z1 h# f) K+ l4 C& z. w1 H8 f( ~
void BeepLedInit ( void )5 `; c; w' {+ {5 h
{1 `; X) j. V& [* H2 O6 S0 @& z
    BeepInit ( gpLed1 );
3 f" X$ E  l( q' E! z% J. K# a    BeepInit ( gpLed2 );+ ]9 p* I/ B  W( z: [
    BeepInit ( gpLed3 );
( A+ ?2 B; x' g% m* M) J+ x0 j0 H    BeepInit ( gpBeeper );. ^0 h$ P7 A/ |- i! |
}
3 d/ I' H, ~/ U' z* j- j# W
/ h6 x, F  @' h) H; e0 |3 Z* Q  c
; }" }! X3 G( A! E哈哈( t& T' l3 t5 N' S6 \1 g
//初始化函数# y$ \3 n  I" w2 e
void BeepInit ( PBeeper pBp )0 }5 `6 ]) u' l" s' ^% A( f- ~: x
{
5 r% G( U7 i* B    pBp->pConst->BeepOff();0 e( ^1 c  [3 Z  X9 D- V3 z" H2 m
    pBp->pVar->wTon = 0;5 i2 Y% R' z( q  m) |- s6 @6 P
    pBp->pVar->wToff = 0;4 {9 g0 w% I2 j5 z1 y% w
    pBp->pVar->pwTbl = NULL;
8 j, `; `0 f) D2 b$ Z/ u* T    pBp->pVar->ucCnt = 0;* f6 }7 u& A% Q4 y; p9 H: S
    pBp->pVar->ucGpCnt = 0;$ A5 ]) P+ K; k& A# D; F* ?, I
    pBp->pVar->w1msCnt = 0;
6 ]9 d. \4 D" k  Q: l+ A3 o    pBp->pVar->Status = BPS_IDLE;. p) s' j+ m! p
}
1 T7 M6 ?/ T; m. H
; ?7 E1 _* |& ?# u2 O1 w/ W2 v5 P4 b' v

; d4 s* |9 Y1 B4 D" v4 g
3 I  p6 b4 `7 N
收藏 1 评论5 发布时间:2018-5-3 13:04

举报

5个回答
CC4 回答时间:2018-5-3 13:23:11
看不懂啊,
Tcreat 回答时间:2018-5-3 13:24:49
看半天 没看懂什么鬼
Tcreat 回答时间:2018-5-3 13:25:50
select326 发表于 2018-5-3 13:23) C; ]8 c$ P# Q' ^0 W$ R9 M' v
看不懂啊,
' |8 L) S8 _( z' h, \, E  ?
原来不是我一个人看不懂呀 这就放心了
mjjtim 回答时间:2018-5-5 15:27:45
原来不是我一个人看不懂呀 这就放心了
zsq933106 回答时间:2018-5-6 09:49:37
这是汇编语言吗?

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版