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

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

[复制链接]
GKoSon 发布时间:2018-5-3 16:45
正好昨天论坛有童鞋问了一个问题,这是C语音的一个小细节。如下:ok case1:用的比较少 直接用的 struct{ }ringbuf;0 i. {. @# Z. }6 l0 Y
  1. #define Buffer_MAX_SIZE 10+ y. r3 n; ^8 q+ ?  t
  2. struct{) R) u& C, n1 O3 G) @4 i# \- `* d
  3.         unsigned int  headPosition;
    # V: l* k* m! `
  4.         unsigned int  tailPosition;+ C4 S; e# ?$ [4 w' i# u6 J
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];. j8 J( t/ k4 S) g% r$ I
  6. }ringbuf;. K. V% W4 K2 o' ~0 k8 N

  7. : ~* l1 p* ~! L" D( a& y
  8. int main()& v$ ]' v# m3 ~2 K0 {
  9. {  P3 H; T5 X2 Q% f; V
  10.     ringbuf.headPosition=2;5 V; ]! t2 e" |- u* D: H
  11. }
复制代码
ok case2:墙裂推荐用法 typedef struct { }ringbuf;     ringbuf Ringbuf;
/ j/ F4 x; s! c3 d
  1. #define Buffer_MAX_SIZE 10
    5 Z' ^+ R* Y, f3 \6 s
  2. typedef struct {
    1 r$ I2 y( M* [) W+ Q
  3.         unsigned int  headPosition;
    0 `! y3 d) Z! W$ K/ l5 m" n
  4.         unsigned int  tailPosition;
    , y9 k% [4 Z  j& B+ ^4 R. ~
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];
    ; M: j2 I8 V# x" k% Z
  6. }ringbuf;' l0 d: C! x4 Y1 {. Q$ l
  7. ) ~3 K8 H' O5 O! j2 s) M
  8. ringbuf Ringbuf;4 E7 L: G8 j6 v: Y* g  q
  9. # V# Q2 j6 ]5 x/ A) }; m
  10. int main()
    7 `$ a. f0 J$ E! l" g. ~  A
  11. {
    7 G6 ^9 V  K+ E, _0 S
  12.         Ringbuf.headPosition=2;! S1 K9 C% Q6 j! ^6 i9 o
  13. }
复制代码
ok case3:类似于上面 也就是typedef struct _ringbuf{}ringbuf;的 _ringbuf可有可无
. W" T! }$ R, J) i' w& u7 Q
  1. <blockquote>#define Buffer_MAX_SIZE 10
复制代码
好了 开始机器风格的第三章,跟第二章一样,但是他更加简洁。第二章用的是case3 本章我们用case2
+ I# P( _7 w5 n, F8 i/ [第一部分:框架
* n- o0 m$ `/ F- j( y4 D
  1. typedef struct
    % O' \$ O& l: P. S2 l/ }1 a( }' C
  2. {
    . B+ @/ c8 O& f# m0 c9 D
  3.     KeyParmaType        KeyParma;' ]) E& M3 k6 }* \& k. c
  4.     DeviceFixedPwsType  DevicePwd;* ?" X& }0 y4 ]( s
  5.     PwdSavePosType      PwdSavePos;
    ' J3 r) e/ |5 ?" ?9 I" E5 D1 O3 C
  6.     PwdSaveVarType      PwdSaveVar;
    ( K8 G7 S4 M- R% `2 O
  7. }_TouchKeyVarType;
    # z* ^+ P$ `2 N. A3 F2 P0 I2 ^+ E8 t
  8. ( V( A. M- o4 ~; x4 O
  9. typedef struct& k" p- A( u; Q7 Z( K/ }
  10. {
    # q( |- C- F$ m$ P# w$ M5 c' z' d( v
  11.     void                (*AddOpenLog)( void *pL , BYTE *UsePwd);, Y; u5 o& c, Y/ z
  12.     void                (*AddTempPwd)( void *pL , BYTE *ucPwd , DWORD dTimeStamp);
    ! s( W% w! T# [6 f
  13.     void                (*TouchI2CInit)( void);
    ( R9 D  k! @( n8 b7 N5 F7 o2 N9 ~
  14.     void                (*TouchLightInit)( void);7 q" q; i8 ~+ g8 C+ A; E
  15.     void                (*LightOn)(void);8 Z; S* Q9 a, p$ \, a
  16.     void                (*LightOff)(void);+ r5 A# g7 B5 {& H
  17.     void                (*ParmaClear)(void *pL);
      q0 X. E4 z0 ?$ D% Y
  18.     BYTE                (*InspectPwd)(void *pL , BYTE *UserPwd , BYTE *InputPwd , BYTE len);
    6 `# P& E# ~& c$ u/ m, a
  19.     WORD                (*ReadTouchIc)(void);//Read value form touch ic
    5 }) p- A" R7 a( \* E3 d; v. F3 ^
  20.     TouchKeyValeType    (*ReadKeyVaule )( void *pL); //Read key value1 d) R, t( A' d( q3 |
  21. }_TouchKeyConstType;5 b3 p" t( v. f

  22. / Z" O% d' F" w! @% t9 R7 M
  23. typedef struct* X0 _2 f+ j. u4 P0 {) C7 p
  24. {
    4 P" I1 v0 e. G% s& t7 k: j9 F
  25.     _TouchKeyConstType  *TKConst;
    ! |- j" D2 X9 \- T# C* ~* \1 y. ?
  26.     _TouchKeyVarType    *TKVar;! ?$ s* Q6 M- \2 x/ D/ x
  27. }_TouchKeyHandleType , *TouchKeyHandleType;
复制代码
可以看到 它的风格_TouchKeyVarType这种,_ 开头的就直接是名字了。最后封在一起
$ W: p4 g( x# P2 z! L9 _5 Q                      _TouchKeyHandleType , *TouchKeyHandleType;----------用_     和    名字区分6 ~$ f. B/ ?7 L( V" W* Q0 g9 W
前面第二章是 BeeperType,           *PBeeper;--------------------用Type和*p名字区分% g. K8 z! x& O. u* S
. k0 h/ q0 V# B  a, Z
( T. f! h7 E! p2 z3 z* C
第二部分:实例化; [# e1 p* i- M) r% m  \/ w% T
  1. _TouchKeyVarType  TouchKeyVar;
复制代码
一样的 数据成员暂时不管
4 i7 D0 x( e% i: P! o2 ~方法成员则实例化 比如下面的实现0 C; b, y& {! `/ V& ?
void SetTouchLightOpen ( void )
+ a4 \, m5 {" Z{* \6 m  B, }; U+ V; o7 @4 Q0 q9 n
    GPIO_SetBits ( TOUCH_LIGHT_PORT, TOUCH_LIGHT_PIN );
  V+ D/ m3 S% h* w8 s* _$ B}
/ T' n7 k# m# L) y( B! F7 N& Y+ x! u' l+ R6 G
# A2 g! o5 }, I0 H  v$ D
第三部:使用* |& p/ n: h$ D/ }/ l* @, k
现在gTKHandle就是一个全局变量了,它是一个句柄,(不是指针它是实体),它包含password的全部属性,拿去用吧。% ~* W# D1 L9 C! e! w
如果喜欢指针怎么办?
- j% P9 T. u% |
  1. void vKeyInputTask ( void * pvParameters )' T# _3 X" N$ g* I9 }& G
  2. {
    ( [' u9 k; P4 q6 A; O" \
  3.     TouchKeyHandleType pHandle = &gTKHandle;//指针出场
复制代码
+ W$ q% _( E/ h, d
3 _! P! M' n- f% S9 c9 ]) ^2 L# P, o

/ I+ F% \4 E3 e8 r1 }最后详细说一个案例:注意ReadKeyVaule
& R8 D7 z$ O" ~, k1 i5 W1
* d+ d9 P# z. wvoid vKeyInputTask ( void * pvParameters )5 `9 R/ T; \+ U- L& S
{
0 j9 n# R( z& [    TouchKeyHandleType pHandle = &gTKHandle;//指针出场
* J% z& b; D+ ?4 O    KeyParmaType *KeyData = &pHandle->TKVar->KeyParma;
( Z5 ?' `$ f6 t    BYTE ic_door = 0;
% U3 U+ z# \( b% |1 z" A% S& z" `5 C) ^
    pwd_log ( "Into touch key task ,password is init...\r\n" );+ a$ O$ @9 d% u5 `7 c7 g
    PasswordParmaInit ( pHandle );
! W! o& S# I2 g: n& n- B  j6 n! Z$ ~( r! t4 l( R5 V
    while ( 1 ); g9 V  V/ a# p
    {
/ [" b; H  g( V2 ^. h. s# X' o& Y  B        if ( xSemaphoreTake ( xBinarySemaphoreTouchPwd, portMAX_DELAY ) == pdTRUE )1 r$ M8 ^" x9 K7 }$ O0 `
        {3 }4 _9 ]( `# \. e1 Y
            if ( KeyData->ucInputKeyFlag == INPUT_KEY )
6 ~* d/ _2 r  S            {
& C% H' i3 K) D' P6 t                TouchKeyValeType    KeyValue = KEY_INIT;' C2 q8 }1 Z3 g; a; g, w, C' c
3 V3 e! x/ J" G3 E7 U0 ~" l+ T$ s# u$ {
                KeyData->ucInputKeyFlag = NO_KEY;
4 ?- x9 i4 k3 z5 I. [6 {                KeyValue = pHandle->TKConst->ReadKeyVaule ( pHandle );---完成死循环 定时轮训这个函数。8 O8 W) t1 a; G6 s5 J& ^
0 N) G! k! y. X$ K, P7 ]
。。。}
* `- v( r  V! l4 e6 P& B7 `. v
% F, f( j+ D/ o6 O: o2 u2" ?1 A2 [9 L6 }
前面已经初始化了
+ y" i5 m* z( ]+ h$ C. I& X_TouchKeyConstType TouchKeyConst =% U; R; B6 _; Y& ^* h4 f0 t
{, T  P0 N6 [. G, G
    .AddTempPwd = GetTempPwd,# s+ p2 ?6 K4 J" _! F$ L
    .ReadKeyVaule = ReadTouchKeyVaule,! a* k; S# B1 [& B0 d
。。。};! S4 t$ F: }" R% O6 u( p
1 r7 }6 l! ~- T; T0 S8 t7 U
31 P+ W3 E0 n2 r
我们看ReadTouchKeyVaule的实现(你无法找到它的调用的啦!!)
. L* a6 Z# S3 Y7 r+ Z, b
  1. TouchKeyValeType ReadTouchKeyVaule ( void *pL )
    0 s6 T* C# `) T9 T& b
  2. {
    3 R6 Z, _3 `5 P0 E1 r  {7 h5 u
  3.     TouchKeyHandleType pHandle = ( TouchKeyHandleType ) pL;
    4 c8 p& n- t4 w# I
  4.     WORD ReadVal = 0;
    # G8 ^1 |; C% r
  5.     TouchKeyValeType ucKey = KEY_INIT;
    + G( m" g; q, b6 K- b

  6. 5 O$ }* y* {5 `5 ~6 N
  7.     ReadVal = pHandle->TKConst->ReadTouchIc();) v0 y2 j2 Q# {) z; a2 E" s
  8. 4 J) V  v8 M+ T
  9.     switch ( ReadVal )& O9 W# K/ a+ r- L
  10.     {* x2 o3 ?. ~- z0 h7 V' k4 F
  11.     case 0x0001:
    + C" D; Z) ]+ e. f+ _
  12.         ucKey = KEY_ENTER;
    , A7 W: K( d3 _# e  M
  13.         pwd_log ( "Input # key \r\n" );6 D- k6 k4 E, v% t3 a* W& ~
  14.         break;' X/ l* `* ?& \0 M2 M. G9 {4 W; F$ U/ j
  15. 3 }2 F3 j! z4 ?' n5 `# }5 E
  16.     case 0x0002:& u! r$ j. a% S( B# M: D9 G
  17.         ucKey = KEY_0;
    7 R$ u5 K# i6 u; o9 P' b: L( w
  18.         pwd_log ( "Input 0 key  \r\n" );
    4 ]8 _3 z) n  j* U4 X
  19.         break;
    . F5 o9 p; m* e6 c  x
  20. ! R5 ?3 h" `& i7 H& J: z% m6 b0 k
  21.     case 0x0004:5 s* S% l* Q. Q- Z5 B+ R
  22.         ucKey = KEY_BACK;) H5 m1 ~, S: e! H% M0 w# M% k1 v+ I# f
  23.         pwd_log ( " Input * key  \r\n" );. p1 D& b, q6 W( R- @; g
  24.         break;
    ! e9 Q8 J( u' n7 [! n1 C$ Z% {2 }' N

  25. 6 A# L( e3 F. Q$ z( t2 y- B8 I$ A8 _
  26.     case 0x0008:, ?* Z  v" r' W) }
  27.         ucKey = KEY_9;- u( ?. X! R. g! |/ u4 h
  28.         pwd_log ( " Input 9 key  \r\n" );0 X, O5 p+ y) c. Y3 R; M4 d7 P
  29.         break;( W  F9 b# L7 |

  30. ( O1 f! C9 |3 R; r
  31.     case 0x0010:
    8 U- }. `9 L' G2 r; N
  32.         ucKey = KEY_8;
    6 F2 V* ^9 k: H  C9 s) V2 J
  33.         pwd_log ( " Input 8 key  \r\n" );
    + `9 z& L! l$ ?9 _" m3 B
  34.         break;
    % e  E5 u0 n2 q0 u$ e; m

  35. 1 i+ @) K$ ^, ]9 P
  36.     case 0x0020:
    1 j+ h: ]  f  m/ Q2 v% w
  37.         ucKey = KEY_7;. @1 K& g9 i! S# G9 o* C
  38.         pwd_log ( " Input 7 key  \r\n" );
    9 U% {5 m4 X5 K  I- S' M  N
  39.         break;: M' t8 z# i3 T3 e- q

  40. + J2 K' }2 M, l7 q
  41.     case 0x0040:
    - ?( j/ E& p, s2 j
  42.         ucKey = KEY_6;
    ! i3 Y8 u5 G$ v0 V& E) q
  43.         pwd_log ( " Input 6 key  \r\n" );
    7 d% c4 l6 a9 U
  44.         break;
    " ^; P# z! v0 A& v
  45. 2 }6 ~2 Q& K3 @3 y$ C- N& `. X
  46.     case 0x0080:! ^+ P$ E7 j7 n; H2 O  `
  47.         ucKey = KEY_5;- _, u  \/ n/ t' a; c) d
  48.         pwd_log ( " Input 5 key  \r\n" );6 l4 ]. _$ S% S; L
  49.         break;
    6 i( x* M0 o& n3 w- _+ a
  50. " p7 D; {8 c( d8 g' W
  51.     case 0x0100:
    ! h. y: S8 _2 J8 {) V3 d' `
  52.         ucKey = KEY_4;) q5 Z' F" |5 f1 f/ r5 _
  53.         pwd_log ( " Input 4 key  \r\n" );0 A, m  c+ q* V. I% t
  54.         break;6 D3 t' ~& p. z8 s

  55. # |/ o8 _0 Y1 M
  56.     case 0x0200:
    0 F3 N5 M4 |6 t- L, }
  57.         ucKey = KEY_3;+ D+ d' P+ Z3 j% y. L
  58.         pwd_log ( " Input 3 key  \r\n" );
    , v6 E, M9 d0 a: B
  59.         break;
    . ?- I% h/ ], b

  60. 3 W  h; B! E, h* S4 k0 A; o7 q
  61.     case 0x0400:
    1 S% j, p) K* I; W. I) _% l# \
  62.         ucKey = KEY_2;7 q2 q3 V3 ?" L# f
  63.         pwd_log ( " Input 2 key  \r\n" );
    * p+ r6 Q- w' e6 }. x5 [
  64.         break;
    1 h6 J, m! A# h8 o
  65. : `% Y: a2 m2 Q0 v: H
  66.     case 0x0800:- T: {1 F1 k+ R: b
  67.         ucKey = KEY_1;; Y0 T2 F  n; k- I& n
  68.         pwd_log ( " Input 1 key  \r\n" );% C! M2 B9 h: L# k& ]
  69.         break;$ n( |$ ]+ N3 X* _6 E0 ?5 M! h
  70. 8 e; Z# s4 b) C- w& G! H, Z. z
  71.     default :; s  @/ m+ V" E0 y
  72.         pwd_log ( "Read error value = %x.\r\n", ReadVal );! m' D0 J/ p' S7 A8 l
  73.         break;
    5 r* x' n. U  L9 O
  74.     }8 @% z1 N0 M: ^. ^, P

  75. ; [$ Y/ b9 I( }3 h; b
  76.     BeepRunCycle ( gpBeeper, 1, 50, 10 );
    - s* ?; C% n! l* k
  77.     return ucKey;
    6 o+ [3 ^6 o0 O9 F) K1 x# D
  78. }
    * o6 |3 c- C( l7 p  I5 y1 W/ \! h
复制代码
隔一段时间就执行一下,知道你按密码了。类似于刷卡板实时轮训,知道你刷卡了。
7 [8 ^# Q$ D6 ^2 ?, m; ^2 }3 S* {7 W
是的 上面的函数嵌套了按键板的IIC读函数,同上" m7 \# R8 k% I& _
  1. #define DEVICE_ID   0xA0& ]4 d) [# y$ q# w3 r7 `1 b4 L
  2. WORD ReadTouchKey(void)9 N  G' A* Z8 y5 v
  3. {/ r- C% r, Q; Z) \  P8 Z. g9 P
  4.   BYTE uD[4]={0x00,0x00,0x00,0x00};
    " D: f4 C5 E' [( y4 x  @% R) N
  5.   uint16_t touchDataTemp = 0;
    1 b, D% O4 a0 p  r
  6.   //LED_Backlight_Out(1);, M3 m; {/ m2 e: J9 H/ d9 T: [) T
  7.   //iic_read_all(DEVICE_ID,8,4,uD);
    8 [( f' a9 E8 x0 F. B# u
  8.   TouchKeyReadValue(&gTouchKeyI2c,0xA0,8 ,uD , 4);
    * _; w& e$ v- A6 m
  9.   touchDataTemp = uD[1];! b* V- f6 }& a6 T% @2 h2 c1 @7 Q
  10.   touchDataTemp <<= 8;
    5 ?9 n0 w% W; v1 [% U) l! g- Z
  11.   touchDataTemp |= uD[0];. N( l3 @* T7 m3 N

  12. + n/ G8 W, N+ R) g
  13.   return touchDataTemp;% M$ R" C* }" r: z& h
  14. }
复制代码
8 h! O0 N' x# {5 {( z
/ z1 a8 ?0 R- l7 n# W' u1 R9 i
收藏 评论2 发布时间:2018-5-3 16:45

举报

2个回答
GKoSon 回答时间:2018-5-3 18:03:23
正在看这个虐心的代码
; O9 o5 k: u$ ]) Z2 F3 H老大让我给产品提提建议
7 p( t( I! w6 u: W. B1 a; s3 [我。。。。。
3 ~; ~: p% Z$ I我就说我们看到的吧
/ B6 [/ U, ?& A% [4 @编码风格
9 v& o8 z: o, }" |, Q- N+ O; b. }
2.png
1.png
单片机爱好者 回答时间:2020-6-24 19:41:02
本来三行就搞定的东西,写这么多,看不懂~~~~~

所属标签

相似分享

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