请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
GKoSon 发布时间:2018-5-3 16:45
正好昨天论坛有童鞋问了一个问题,这是C语音的一个小细节。如下:ok case1:用的比较少 直接用的 struct{ }ringbuf;
2 Y; v+ }' }8 j# @" {4 o
  1. #define Buffer_MAX_SIZE 102 X* Y* z+ ]) \/ @% R  h' A  e
  2. struct{9 ~: W" T# t! G( c
  3.         unsigned int  headPosition;, \9 W; p# N# e* n3 v# v0 |* r
  4.         unsigned int  tailPosition;
    8 ?+ d3 c! q9 o% S
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];
    , m3 Q9 E" h. s: U
  6. }ringbuf;+ @( j, d5 w% N1 X

  7. ) Q; H" b1 \4 T# N5 u  k
  8. int main()+ p: K7 F. j3 B5 X2 R
  9. {
    ! {4 o1 v. c; K) j5 J+ D$ k0 |) D
  10.     ringbuf.headPosition=2;
    : n3 {: ^5 T" X3 ?/ i
  11. }
复制代码
ok case2:墙裂推荐用法 typedef struct { }ringbuf;     ringbuf Ringbuf;1 _  a; q, `( ?: F4 \. F2 d0 Y
  1. #define Buffer_MAX_SIZE 10" @" C/ Y& r6 {  C
  2. typedef struct {# ~0 C4 s* z, C! v( f) ^$ p, M/ {
  3.         unsigned int  headPosition;
    7 W, v: {% ^# s. b- a
  4.         unsigned int  tailPosition;* |  p9 q* ?9 \
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];8 |' c% Z& _7 o& U. p/ u
  6. }ringbuf;
    + s/ Y$ Z) u: j' n% T

  7. ) Y% L4 N* Z* j) w  X' ~; d
  8. ringbuf Ringbuf;
    6 K& g0 q+ _  ^% R7 r3 n7 u

  9. + r# q3 N1 j# [
  10. int main()
    : ?5 v: A/ k: X: p' \  y7 C
  11. {  q* F4 R' H) ?0 e- f9 |  j
  12.         Ringbuf.headPosition=2;4 m+ g" S8 ~  D, C& b! d$ ~
  13. }
复制代码
ok case3:类似于上面 也就是typedef struct _ringbuf{}ringbuf;的 _ringbuf可有可无
; C4 F2 t$ w5 \5 V4 y/ n. o
  1. <blockquote>#define Buffer_MAX_SIZE 10
复制代码
好了 开始机器风格的第三章,跟第二章一样,但是他更加简洁。第二章用的是case3 本章我们用case2
$ _1 h  j: n* {第一部分:框架4 S2 s- V9 R$ |3 O
  1. typedef struct, ~, \/ ^* j# G! \* Z1 M; Z: P9 p  @' X
  2. {
    1 X! ]! Y- z/ I* C5 a; F1 ]! r
  3.     KeyParmaType        KeyParma;
    % C+ C9 m% B" x% ?( n+ o
  4.     DeviceFixedPwsType  DevicePwd;3 R% _% o6 ~( ~$ g9 R1 ~7 X: g
  5.     PwdSavePosType      PwdSavePos;
    * f3 H# t. A5 @6 c5 Y. D) N% s
  6.     PwdSaveVarType      PwdSaveVar;; \4 d& w. \, l/ r8 P; }  [* o
  7. }_TouchKeyVarType;" A; o! ?1 Z6 f4 ]

  8. 2 k; j) Q, @4 r
  9. typedef struct3 h# L3 }  Y! l* Q
  10. {
    $ j5 ?0 O* _0 ]% o( _, S+ p& y
  11.     void                (*AddOpenLog)( void *pL , BYTE *UsePwd);0 Y5 t( K3 z' A, N
  12.     void                (*AddTempPwd)( void *pL , BYTE *ucPwd , DWORD dTimeStamp);5 f8 Z/ o5 U+ z0 f$ l1 H
  13.     void                (*TouchI2CInit)( void);
    : ^% I/ j3 U, D+ H
  14.     void                (*TouchLightInit)( void);
    6 Q& H  L5 J9 U$ @' q6 E
  15.     void                (*LightOn)(void);
    6 u- @# Q3 T1 L" x
  16.     void                (*LightOff)(void);
    * |' A/ `4 s0 v4 c, M
  17.     void                (*ParmaClear)(void *pL);- K. b' H! q1 U. G) m
  18.     BYTE                (*InspectPwd)(void *pL , BYTE *UserPwd , BYTE *InputPwd , BYTE len);9 F1 S3 L$ z* r6 b- T( q
  19.     WORD                (*ReadTouchIc)(void);//Read value form touch ic/ U# [& g, f3 \- O* a
  20.     TouchKeyValeType    (*ReadKeyVaule )( void *pL); //Read key value
    2 n; K% h$ z/ ]/ i" B/ Z
  21. }_TouchKeyConstType;. p" `( ~) B; d3 q& e" O: O. `

  22. # K5 }3 q. }2 J& }2 @! k5 F
  23. typedef struct- P9 D! ]- _" M1 J" f
  24. {; V) U5 l1 U+ j! S$ a
  25.     _TouchKeyConstType  *TKConst;6 k' V$ R: M; z* g/ g2 R
  26.     _TouchKeyVarType    *TKVar;1 P! r+ q% g) \3 ?" A
  27. }_TouchKeyHandleType , *TouchKeyHandleType;
复制代码
可以看到 它的风格_TouchKeyVarType这种,_ 开头的就直接是名字了。最后封在一起! R7 l* D: t: y. w% @! P
                      _TouchKeyHandleType , *TouchKeyHandleType;----------用_     和    名字区分' o8 ~+ f& S2 P+ g5 g
前面第二章是 BeeperType,           *PBeeper;--------------------用Type和*p名字区分
5 y- Q% L& C& N" @
, `8 y5 l2 s9 F8 V  R! h' a! ]' ^- @4 }/ G7 ~* z0 y
第二部分:实例化
& l  ~  X6 I1 T- |( y# @
  1. _TouchKeyVarType  TouchKeyVar;
复制代码
一样的 数据成员暂时不管- r7 `5 k. d- L1 Y
方法成员则实例化 比如下面的实现1 w1 ^2 h, @: l( V
void SetTouchLightOpen ( void )
( P9 Z& f$ ~$ d1 d. d% e{/ C* Q4 Y& ^. a' F2 i
    GPIO_SetBits ( TOUCH_LIGHT_PORT, TOUCH_LIGHT_PIN );
( S6 |; @/ \# u: G! y5 b}9 W% Y, F) [9 n0 S+ m2 W0 I
% R, U0 Z6 z9 j* C7 q- ~- z3 I2 v# M; h
3 W) @$ ]9 F( _, a. ^% p* m& C, Y
第三部:使用7 f7 ~( e5 O4 F( H9 R
现在gTKHandle就是一个全局变量了,它是一个句柄,(不是指针它是实体),它包含password的全部属性,拿去用吧。! s! z2 H. M4 a0 x4 b2 }, G
如果喜欢指针怎么办?
# N; m- d0 J5 q6 X- E  r
  1. void vKeyInputTask ( void * pvParameters )9 R) i+ C8 t$ T9 ?
  2. {) \' c. M. b/ [# u  Z0 e# j
  3.     TouchKeyHandleType pHandle = &gTKHandle;//指针出场
复制代码

5 Y% ^* i: @: w9 W& m1 p# p! H' Z4 E- k! [3 U

2 e$ \9 b6 H! G) M- i最后详细说一个案例:注意ReadKeyVaule  l2 M3 I' x! s) F) W" g7 z
1, k7 R3 L) I* Y9 x
void vKeyInputTask ( void * pvParameters )& q9 q3 t9 D2 b4 U
{$ ^2 c4 @% S/ Q$ ^
    TouchKeyHandleType pHandle = &gTKHandle;//指针出场
3 \; t% ~1 [& M    KeyParmaType *KeyData = &pHandle->TKVar->KeyParma;. ^, ^2 f0 Y' {2 x6 Y4 a9 R
    BYTE ic_door = 0;
) R' g) v( c4 Z2 j* h; o' q8 Q! A5 d3 R1 H) L) s" W
    pwd_log ( "Into touch key task ,password is init...\r\n" );' w) W. R! w2 a2 ]& p/ k& J4 z
    PasswordParmaInit ( pHandle );9 P6 k; A3 q( _! K
6 M$ Y7 q+ J! M  Z) c
    while ( 1 )
2 |6 D# p& M* Q+ s  p. @( s; u    {' g( K9 j  M* F7 l, G' @
        if ( xSemaphoreTake ( xBinarySemaphoreTouchPwd, portMAX_DELAY ) == pdTRUE )0 R9 n$ t9 F! G' r2 t
        {0 V( E5 R, N# Y; x
            if ( KeyData->ucInputKeyFlag == INPUT_KEY ), O7 R0 M# J% z( E- t8 A
            {
* G( h3 h. l6 Z2 d3 t* j  F. {3 u                TouchKeyValeType    KeyValue = KEY_INIT;9 A/ x4 E3 f, A
1 Q. \( t/ s' i3 F* l6 h
                KeyData->ucInputKeyFlag = NO_KEY;$ K8 M- b7 a4 S/ v" b# n
                KeyValue = pHandle->TKConst->ReadKeyVaule ( pHandle );---完成死循环 定时轮训这个函数。
' Y9 E+ D+ X( p, r) B3 S$ Z& l& Y4 _4 e# w- T
。。。}. \% P$ H! q4 U2 \- H$ l0 k
: s( M6 Q) e' O' q9 A
2
8 A: X4 m+ X( V' F+ a前面已经初始化了: s% ?. ^4 [6 }3 Z2 |$ c  c6 u
_TouchKeyConstType TouchKeyConst =
) H* i  W, P, x8 }. y" j; c8 a{
5 a! D" O+ f" Z- f- \: G+ P7 Q& |    .AddTempPwd = GetTempPwd,2 _9 O6 p9 G& Z* S
    .ReadKeyVaule = ReadTouchKeyVaule,, {6 @$ e) e, E) k
。。。};, t8 J0 ~) A, O# l+ Q; p7 A& I
: z% j4 c' M& `7 ~2 G
3
* C( x* V" Y# g1 {我们看ReadTouchKeyVaule的实现(你无法找到它的调用的啦!!)% ^% q+ @0 ~1 V
  1. TouchKeyValeType ReadTouchKeyVaule ( void *pL )
      y. B7 X2 f) {) |
  2. {
    3 \+ j& m) s$ V  G# f
  3.     TouchKeyHandleType pHandle = ( TouchKeyHandleType ) pL;7 P* v$ V& a# P9 g# E5 i
  4.     WORD ReadVal = 0;
    9 `2 @5 @& e1 z( N, K6 p! s
  5.     TouchKeyValeType ucKey = KEY_INIT;
    * Y) a: Q9 B0 p
  6. . s( ~6 t" \2 R5 l8 [
  7.     ReadVal = pHandle->TKConst->ReadTouchIc();
    ; C0 H5 h5 O6 f& m# c3 D7 C" o

  8. , x+ k( e, Z. Q7 @! T1 ?
  9.     switch ( ReadVal )
    ( I( Q: s: o( X
  10.     {' Q% B2 _  ]. k. X
  11.     case 0x0001:
      a0 C$ M: K) ~. P( l
  12.         ucKey = KEY_ENTER;
    ( [7 N, x6 c3 ]6 _5 l: {
  13.         pwd_log ( "Input # key \r\n" );& B7 j7 D* x6 H8 ^8 g& F
  14.         break;7 z& s( Q0 C3 i3 m2 J5 @0 k% n  r
  15. 3 g/ L2 P  K. P  c  C% [+ H
  16.     case 0x0002:
    7 P9 O- P- q1 c1 L" z0 @% L
  17.         ucKey = KEY_0;$ ?0 ]; N0 v; l* A( k
  18.         pwd_log ( "Input 0 key  \r\n" );
    - V( S' y3 @  ]- D* r# x
  19.         break;. F  I! B: z& a3 K

  20. 1 G3 H) Y' i! L
  21.     case 0x0004:
    ' g) m# T9 Q# V5 q
  22.         ucKey = KEY_BACK;
    - s+ }/ Z$ ~, m2 z1 h
  23.         pwd_log ( " Input * key  \r\n" );
    ' J2 g4 \4 r: K5 f
  24.         break;
    & V# D( u  Y) l1 X7 u: H- |- J
  25. * c3 d: r0 _& {; @: R2 Y
  26.     case 0x0008:5 e: Y7 F2 _8 a" _: O
  27.         ucKey = KEY_9;
    / |8 V8 M, c9 X- m+ b. I9 z' K, M
  28.         pwd_log ( " Input 9 key  \r\n" );( J8 p; Y/ s' r) q) I* P
  29.         break;5 ?# W# d9 B% E& L$ K, l
  30. ( Z' `9 n- g# h& l+ v( s* K2 I5 A
  31.     case 0x0010:& M; C! ~* f! Y$ V
  32.         ucKey = KEY_8;
    ! D' a7 `6 a0 h3 {4 ^
  33.         pwd_log ( " Input 8 key  \r\n" );
    % v$ s* R; {$ c& h. ^, X& U7 ?
  34.         break;
    8 j" P$ S" H' x3 K( |4 `
  35. 2 U* L4 t7 [' w$ |
  36.     case 0x0020:
    2 A# V; [" ~3 z4 Y9 N" A: d5 f
  37.         ucKey = KEY_7;
    9 ~8 d& V" S% D1 q
  38.         pwd_log ( " Input 7 key  \r\n" );
    0 o' a4 U, l3 y8 H" _5 ]. N
  39.         break;2 U+ `3 Z5 Z/ T7 t

  40. 1 t6 e( L# u1 f% w# \; t
  41.     case 0x0040:
    5 E: w, a) F9 a, f( S; u' P
  42.         ucKey = KEY_6;
    6 b$ [) I  V" O# c
  43.         pwd_log ( " Input 6 key  \r\n" );
    % W, D% }  M2 Q" J3 A/ Y: v
  44.         break;( \$ _& U* _+ f5 b
  45. ( q! k7 z9 D! C8 g1 Y* v3 ?5 S
  46.     case 0x0080:4 u4 `5 F! `# \
  47.         ucKey = KEY_5;
    4 R" T& {: F3 g0 \& G
  48.         pwd_log ( " Input 5 key  \r\n" );
    + ]) j8 S. x; t/ H% }  S! n# M- e) ?
  49.         break;! r0 e8 _* N- |4 c1 y1 @& v
  50. + S6 L( H- M6 |4 o+ ~5 b
  51.     case 0x0100:
    7 S( Q2 T" x* E  l. L8 f* v1 X% p
  52.         ucKey = KEY_4;
    4 ~1 c2 q: J" I* E0 r
  53.         pwd_log ( " Input 4 key  \r\n" );' F$ m" b' f. n0 g# S
  54.         break;! S$ C4 `4 A& p3 d" @

  55. % f) L5 d# m4 ~7 \2 E% t. }
  56.     case 0x0200:$ l) W3 \; G# K
  57.         ucKey = KEY_3;" k" {& K* S/ r2 v
  58.         pwd_log ( " Input 3 key  \r\n" );# A$ R* ?) W( j
  59.         break;
      J! K) _0 b, t, i% N9 Z" r

  60. 8 w  V' O+ p* y  `8 v3 }% B. \$ p
  61.     case 0x0400:; M- C- \% N7 I3 O* e" g2 `
  62.         ucKey = KEY_2;- g4 [2 b  {& t8 e- L
  63.         pwd_log ( " Input 2 key  \r\n" );- }8 d  x5 J. v2 g7 a
  64.         break;
    & C8 t5 [1 b8 f0 ^8 r% H

  65. # T3 `$ f9 J5 b  K
  66.     case 0x0800:( b. @4 u* Q$ e1 W
  67.         ucKey = KEY_1;
    8 ?+ ]" q' y" S
  68.         pwd_log ( " Input 1 key  \r\n" );" o- b  r- j2 D/ G
  69.         break;
    % o0 a' t- K. G0 T3 V

  70. $ p+ w+ x' n8 @1 k( W6 H/ a" K
  71.     default :- K* T2 v% a4 [4 A
  72.         pwd_log ( "Read error value = %x.\r\n", ReadVal );3 F9 |( h# M: \, ]( Z" k3 Z! U
  73.         break;- R1 ]+ R0 k) J! ~
  74.     }
    # X- u( a+ ^/ |8 B9 j1 m( A/ m) g2 {/ e
  75. + y: g9 J+ D6 ?. |/ r
  76.     BeepRunCycle ( gpBeeper, 1, 50, 10 );6 ^9 n$ I  K. b3 Y4 M3 }( [: T
  77.     return ucKey;
    : V7 M! q7 s* _
  78. }/ A% M9 t' S  B" e" a4 j* [& u' p
复制代码
隔一段时间就执行一下,知道你按密码了。类似于刷卡板实时轮训,知道你刷卡了。! s) |1 C* s" b0 Z( l& u$ g
& i1 L8 V$ J8 Y7 ?, R$ Q1 ~
是的 上面的函数嵌套了按键板的IIC读函数,同上# E  H* ]$ ]4 r% u# B
  1. #define DEVICE_ID   0xA04 X. v' z: H1 D, k, Q
  2. WORD ReadTouchKey(void)
    0 M! w3 w# h5 k( _8 G
  3. {
    . C, D; Y' P: x" {9 @" R$ x
  4.   BYTE uD[4]={0x00,0x00,0x00,0x00};
    4 f$ W4 y) v) T+ y
  5.   uint16_t touchDataTemp = 0;
    $ @) d. _# D7 [* B: c+ U
  6.   //LED_Backlight_Out(1);" S1 b/ W0 Q0 }! ^
  7.   //iic_read_all(DEVICE_ID,8,4,uD);
    0 F( h& E7 r1 I- y0 r; v
  8.   TouchKeyReadValue(&gTouchKeyI2c,0xA0,8 ,uD , 4);
    $ G0 k$ N6 N# J2 u, P
  9.   touchDataTemp = uD[1];7 L) X: m( G: Q
  10.   touchDataTemp <<= 8;
    5 _* f% f# Z8 E' N4 e
  11.   touchDataTemp |= uD[0];
    0 t8 e/ q* }6 {: R" {& C

  12. / `- b+ R' G2 p% y* a2 R; t
  13.   return touchDataTemp;
    9 g$ q1 V7 ^4 g; t& `# i
  14. }
复制代码
2 R6 L) \& C$ L9 V) S3 k
, r' D0 w' j  ?( c  A
收藏 评论2 发布时间:2018-5-3 16:45

举报

2个回答
GKoSon 回答时间:2018-5-3 18:03:23
正在看这个虐心的代码' I- L7 K; q# @- j
老大让我给产品提提建议, {+ Y( L# b' v$ L4 a& a8 {& d
我。。。。。
$ w* h* x: a$ v' f7 r$ j我就说我们看到的吧
1 `$ ~) ]4 U4 t" w5 E4 G: w编码风格
8 h- e( M- s2 t) J. A$ {% s, {
2.png
1.png
单片机爱好者 回答时间:2020-6-24 19:41:02
本来三行就搞定的东西,写这么多,看不懂~~~~~

所属标签

相似分享

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