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

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

[复制链接]
GKoSon 发布时间:2018-5-3 16:45
正好昨天论坛有童鞋问了一个问题,这是C语音的一个小细节。如下:ok case1:用的比较少 直接用的 struct{ }ringbuf;
* Z2 ]6 h2 ~$ o/ i9 p1 x/ x8 F
  1. #define Buffer_MAX_SIZE 10
    0 ~. c( J7 |6 a/ H  H4 w
  2. struct{7 b7 m. H1 Y; K. O) ?! t3 b
  3.         unsigned int  headPosition;$ w( B3 K2 @# n" @" Y+ X
  4.         unsigned int  tailPosition;1 \1 p5 L8 ]& \2 d* Y6 W
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];
    , P$ \) U1 x$ ~5 g
  6. }ringbuf;" B% y0 X" N) y$ ?+ a, u

  7. % X: D" U* ]1 j9 c* U7 L7 W' a
  8. int main()- [. |2 e% p0 M3 F7 m8 B
  9. {2 R. L+ W# D3 ]2 M- B
  10.     ringbuf.headPosition=2;
    9 A& G) B$ a; f/ c; G. B4 W
  11. }
复制代码
ok case2:墙裂推荐用法 typedef struct { }ringbuf;     ringbuf Ringbuf;% }: P, J0 n: I5 g9 U+ {  h
  1. #define Buffer_MAX_SIZE 10& g# m5 c( {% ^1 T5 o- b- Z+ M& g
  2. typedef struct {8 S' Z: [7 t, s/ A! i$ {: S% W
  3.         unsigned int  headPosition;
    0 [8 l. B" T. l2 U
  4.         unsigned int  tailPosition;
    0 U8 V# U% w8 {* r/ ^- Q* `5 M
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];
    + c$ l( `& u8 X6 J7 ^8 Q: k) Q
  6. }ringbuf;+ z  h1 ]# @' c$ H% U" P  O

  7.   u3 d9 ~% I8 e$ f+ ^* A& O
  8. ringbuf Ringbuf;
    2 e1 ]  |5 e( C& _& @) l% P; U
  9. . W  }" s& _$ {% y: E; _0 G
  10. int main()4 z: h% n2 D( o* w7 r. F
  11. {9 X5 q6 O6 f6 u' _2 J* @% ?
  12.         Ringbuf.headPosition=2;& \! f- b5 D7 _
  13. }
复制代码
ok case3:类似于上面 也就是typedef struct _ringbuf{}ringbuf;的 _ringbuf可有可无
: @- F/ A; p( T5 L; [; ^( u
  1. <blockquote>#define Buffer_MAX_SIZE 10
复制代码
好了 开始机器风格的第三章,跟第二章一样,但是他更加简洁。第二章用的是case3 本章我们用case2% ?8 w. O$ u" K: J: ?
第一部分:框架. S' R% h  t: V4 N6 m
  1. typedef struct
    - F% |0 d6 J" q# B
  2. {/ l& Q# {# Z. v; m
  3.     KeyParmaType        KeyParma;& y2 m! C; V( V0 V- j& n8 M# U
  4.     DeviceFixedPwsType  DevicePwd;( C0 J5 S' y, Q
  5.     PwdSavePosType      PwdSavePos;
    # o7 b  m7 [4 d4 ?
  6.     PwdSaveVarType      PwdSaveVar;2 D2 V: n1 y7 s) }
  7. }_TouchKeyVarType;
    - L4 b" G* d, Y8 w$ w! m& q
  8. 6 |$ P+ D$ ?8 l
  9. typedef struct
    ; ^! |/ N$ o/ }* T
  10. {% D1 M3 X1 V: G- s2 B
  11.     void                (*AddOpenLog)( void *pL , BYTE *UsePwd);
    7 V; J3 O; k" j9 n- ?7 w. K1 o4 l) B/ m
  12.     void                (*AddTempPwd)( void *pL , BYTE *ucPwd , DWORD dTimeStamp);6 N! r+ Q+ j8 E, a- J& z
  13.     void                (*TouchI2CInit)( void);
    + @, u5 n9 K0 d
  14.     void                (*TouchLightInit)( void);
    & f! Q) M/ X9 U$ O( i5 U. N
  15.     void                (*LightOn)(void);
    7 P. D! W: V7 K& x$ ^" {- m# p
  16.     void                (*LightOff)(void);3 v+ o2 @4 v0 @0 m: f: d/ Q$ }
  17.     void                (*ParmaClear)(void *pL);
    " f( h* K" c, g& N. N2 f! B
  18.     BYTE                (*InspectPwd)(void *pL , BYTE *UserPwd , BYTE *InputPwd , BYTE len);2 a3 E; h8 h7 M6 A
  19.     WORD                (*ReadTouchIc)(void);//Read value form touch ic- ~- B5 d3 b! Y& g% D: v
  20.     TouchKeyValeType    (*ReadKeyVaule )( void *pL); //Read key value
    4 P2 h2 ?/ D( t9 n' W7 i
  21. }_TouchKeyConstType;+ c% \, s  E* n" m- K. x
  22. 2 L2 }' l& q* A9 m( w3 c6 d' ^
  23. typedef struct
    6 `' @5 [- j2 W3 T+ @# U
  24. {
    ( G/ t: b+ E1 @+ V6 T
  25.     _TouchKeyConstType  *TKConst;: u% g" P& j0 g* Q
  26.     _TouchKeyVarType    *TKVar;
    % e/ d* v2 I& M( \; X! W$ y
  27. }_TouchKeyHandleType , *TouchKeyHandleType;
复制代码
可以看到 它的风格_TouchKeyVarType这种,_ 开头的就直接是名字了。最后封在一起
& z. R: q# c1 K5 f                      _TouchKeyHandleType , *TouchKeyHandleType;----------用_     和    名字区分
: ^  o& Z+ u6 O  I+ S3 F, }前面第二章是 BeeperType,           *PBeeper;--------------------用Type和*p名字区分& T  b3 H4 P( }, V

+ }0 D3 }4 d6 M& d- ~
# ^% D$ h' a1 K% T第二部分:实例化
5 K2 J" o0 K# A& u0 M% l
  1. _TouchKeyVarType  TouchKeyVar;
复制代码
一样的 数据成员暂时不管/ z9 W, p8 _  q/ Y. ?
方法成员则实例化 比如下面的实现5 z8 U5 V: p& K3 i% `4 k
void SetTouchLightOpen ( void )/ o0 _0 K! s$ I4 s& l9 g/ g+ G: S
{
7 k7 H% N" a. g! `    GPIO_SetBits ( TOUCH_LIGHT_PORT, TOUCH_LIGHT_PIN );
9 @3 w- M* i6 q& |. z}
- ^! Y6 B% A0 Q/ J6 h. x- b. ?; ]5 N) j/ D* K

# e6 T9 a, C  o1 |第三部:使用
0 h& q0 Y/ f3 l6 E' t$ _0 J4 _2 f现在gTKHandle就是一个全局变量了,它是一个句柄,(不是指针它是实体),它包含password的全部属性,拿去用吧。+ a$ F( S) _$ o
如果喜欢指针怎么办?
" y, x4 Y9 [" x" N7 z
  1. void vKeyInputTask ( void * pvParameters )
    " [- o5 x' I- Z0 f6 V' b2 h! a
  2. {, L8 B7 a) x7 l6 x/ C( `
  3.     TouchKeyHandleType pHandle = &gTKHandle;//指针出场
复制代码
( I* y$ g7 G0 V; a2 G

9 d% q" G* R) g. P( f1 R- i4 J8 Z. f, A" U6 [3 N
最后详细说一个案例:注意ReadKeyVaule
6 |* N0 c6 [$ F5 Z# |, K( u& O1
4 c4 R; n2 z( i6 F, P/ e& K5 {void vKeyInputTask ( void * pvParameters )* z7 k( ~- [- B9 [6 g% S# o: h
{
7 s9 y1 g+ y5 a% M* W    TouchKeyHandleType pHandle = &gTKHandle;//指针出场
3 ^  B& ]1 L7 f( ]7 w  Q7 x  I    KeyParmaType *KeyData = &pHandle->TKVar->KeyParma;
( ^  h: v8 U2 ]& I    BYTE ic_door = 0;
5 x/ H8 f5 }( M2 ]2 o
+ S6 i+ |* `2 W; a/ `6 I% m    pwd_log ( "Into touch key task ,password is init...\r\n" );
) j! g+ q. ?8 s! F, E. s    PasswordParmaInit ( pHandle );5 ^( ]$ d0 \! G7 f  C1 L+ i
! c) K( e7 n5 `( B& t
    while ( 1 )& c" X9 c5 [$ Q  E  ~# {! w9 o2 b, T
    {
8 K% Q! B6 w- u8 N        if ( xSemaphoreTake ( xBinarySemaphoreTouchPwd, portMAX_DELAY ) == pdTRUE )  a( ]9 B' Y: C
        {( O! X  `5 y4 R0 O
            if ( KeyData->ucInputKeyFlag == INPUT_KEY )
8 ]" F' s9 V2 m" ~* G3 U8 c            {  b  ~4 g5 x- X& u
                TouchKeyValeType    KeyValue = KEY_INIT;
+ U. |0 {8 W, }* F, r$ V7 Z8 n) c& [" v: ?1 R$ S/ ], ?. l
                KeyData->ucInputKeyFlag = NO_KEY;2 z+ v9 u  b! P: ^: T0 x# F, }% |
                KeyValue = pHandle->TKConst->ReadKeyVaule ( pHandle );---完成死循环 定时轮训这个函数。# K! N9 B, [8 a9 y  R9 ~' I
0 R8 J% L2 O- p8 v
。。。}
/ @% H* a! e2 J
% U. c) y9 a: J6 p+ |! q! {26 O7 g3 [( z) T9 @+ z  y* E8 g+ I/ m, B
前面已经初始化了
1 k# U8 S& L: o_TouchKeyConstType TouchKeyConst =
# O3 Y, U- q% @4 r3 f# W3 ?( x3 m{, G3 T& Z. Q6 ]# r1 l
    .AddTempPwd = GetTempPwd,8 Q6 U. {8 r7 Q: N* B' r+ m
    .ReadKeyVaule = ReadTouchKeyVaule,
4 u% c! z6 t1 V2 \7 {* f。。。};5 E% y4 j5 R' l7 u6 X

. M$ d+ ~' a* J; _39 K4 D! ^" n  G4 O& P6 {. H
我们看ReadTouchKeyVaule的实现(你无法找到它的调用的啦!!)
9 C% s$ Z; ]8 q% M9 M
  1. TouchKeyValeType ReadTouchKeyVaule ( void *pL ): ]5 `7 y' B, ^( |+ l
  2. {. k5 a4 R* q  g( w0 w  w6 X* a
  3.     TouchKeyHandleType pHandle = ( TouchKeyHandleType ) pL;
    - l5 k. w$ K; v5 B, r: l- `( T
  4.     WORD ReadVal = 0;
    $ x. Q$ l' t9 l& [- }7 b; ^
  5.     TouchKeyValeType ucKey = KEY_INIT;+ s$ v+ {! U$ ^: u

  6. ! N' n1 J* g  l. A0 W: F  N( v
  7.     ReadVal = pHandle->TKConst->ReadTouchIc();: a8 N' _: S; }( O% \3 n  V6 s, _
  8. $ ^' T" r7 u. b" D1 k  U2 k9 V
  9.     switch ( ReadVal )
      c5 N0 Z/ f' _* T6 [6 v# L
  10.     {
    - `- W3 L$ w' r! n
  11.     case 0x0001:
    9 q, E2 d# A6 r) O
  12.         ucKey = KEY_ENTER;& n  s: z. N# V2 j" i& F  z
  13.         pwd_log ( "Input # key \r\n" );- t! v; F3 r% n) ~; U0 x4 t/ R4 k
  14.         break;
    6 s+ O+ l# K/ v8 ?2 o. P

  15. ! u9 U4 n: K" I+ y4 P% o, Y3 g
  16.     case 0x0002:/ N' L# E( {6 ]( E: ]
  17.         ucKey = KEY_0;
    . V( c5 `7 o0 ]2 {( D# R. ~
  18.         pwd_log ( "Input 0 key  \r\n" );& I& C* d% K9 {2 [
  19.         break;1 Q" V( g& n3 @& e
  20. ; z+ {+ I- C! d- b+ B* j, _
  21.     case 0x0004:1 E  B- l1 v6 Q- r8 P3 ?4 N8 r
  22.         ucKey = KEY_BACK;
    ( k  N" a: C( P/ y. E) O* c' B
  23.         pwd_log ( " Input * key  \r\n" );! @1 _5 F' u4 b8 {; Z) H, r  m; O
  24.         break;% k4 j; l: C& B: G' ?. O+ p& s

  25. 8 \% F& @- O# @" q& R8 V: ~
  26.     case 0x0008:+ S6 L  n0 R- P0 w: H
  27.         ucKey = KEY_9;
    3 `4 _/ o% [* f. k
  28.         pwd_log ( " Input 9 key  \r\n" );+ d+ }' g; f! T# r9 |; z" A9 n
  29.         break;
    # ^# D9 }6 ]* W- z0 Z
  30. 8 u" q# d  k' a. L6 a0 [
  31.     case 0x0010:
    & i; Y2 r7 k/ s. d8 X0 r  J
  32.         ucKey = KEY_8;
    : B( v+ D, p4 _/ [  b
  33.         pwd_log ( " Input 8 key  \r\n" );
    + I% G6 ]5 o1 D
  34.         break;* X. ~( c9 @! v3 e# ]& E5 O

  35. + A" h; y  A1 ~8 p# Y/ Q2 c; j8 t+ s9 Q
  36.     case 0x0020:( b% _9 F+ b. a: J
  37.         ucKey = KEY_7;
    " |- t! q& o2 n3 n) d8 O9 b: z
  38.         pwd_log ( " Input 7 key  \r\n" );. g8 a2 s% ]& V) a  _% D6 u
  39.         break;9 }6 }3 M6 |3 j0 ~
  40. ) W& U3 N6 n4 f( l. l
  41.     case 0x0040:0 x- r& t" M' E* W% s8 E. F3 ^
  42.         ucKey = KEY_6;6 O3 t, O% d7 X4 P2 |0 N
  43.         pwd_log ( " Input 6 key  \r\n" );0 H  v! X3 {7 S$ ~
  44.         break;
    . t+ c% C7 z# O1 I: k$ P& S
  45. " {  T# N) F: H* W
  46.     case 0x0080:, x1 H" ]3 _* S* r5 b
  47.         ucKey = KEY_5;
    , q; K! l* b" b( U3 F
  48.         pwd_log ( " Input 5 key  \r\n" );. J' J) K$ L$ w
  49.         break;
    ' m& q4 B9 _. E1 k) }

  50. . v3 P* r1 p' c2 U$ M9 k$ p
  51.     case 0x0100:# q  c! s: O; V; f* t  d3 G5 f+ v( l
  52.         ucKey = KEY_4;- E6 R7 e, K" [: n- j7 I, Q) r, T& ^9 M7 D
  53.         pwd_log ( " Input 4 key  \r\n" );' L$ k" h6 r7 \4 g4 X6 X
  54.         break;
    * G& Q6 A* p" a0 Z; W

  55. ' x5 c" |3 p6 A; {
  56.     case 0x0200:0 a- c" `3 r# @( U/ n. g* R0 A
  57.         ucKey = KEY_3;5 c, p: y* b; r1 I8 k  L( Y
  58.         pwd_log ( " Input 3 key  \r\n" );3 q# w- b: V1 J- s! C$ w
  59.         break;
    9 `& [& b) \8 m, h4 Y/ @0 l

  60. - E% L/ A' F  K" `. b6 o! b) ^
  61.     case 0x0400:
    , E5 K: M1 V" p) t' m
  62.         ucKey = KEY_2;& D5 W7 ^3 D, r* @, v( l
  63.         pwd_log ( " Input 2 key  \r\n" );
    4 z* N) n  l2 T/ ?0 x  Q
  64.         break;8 F" k8 a( I, c% u9 Q' u5 Z3 ]- e# E
  65. ! ~- r) {  q4 J  W# ^- t
  66.     case 0x0800:
      G! s7 g- p1 Y
  67.         ucKey = KEY_1;' G: o# U2 @$ J+ M* C/ [' x: o0 a
  68.         pwd_log ( " Input 1 key  \r\n" );* M- F7 C! w6 u1 U9 D% S5 K
  69.         break;
    6 p" K# \+ q( N9 i. m
  70.   `9 y& W, P" {2 [* C6 I: o
  71.     default :
    / v# C& V: ~: B0 \
  72.         pwd_log ( "Read error value = %x.\r\n", ReadVal );
    7 a# v' z9 i2 c" _5 t' r7 w
  73.         break;
    , w4 ]4 H6 l3 I1 U+ f  e4 {8 ?
  74.     }
    1 e1 D, T. g% J- A3 W- W: W

  75. " O$ I7 J( f$ A, R, p
  76.     BeepRunCycle ( gpBeeper, 1, 50, 10 );
    9 e8 e# |3 H2 u1 u- j" ~
  77.     return ucKey;
    9 Y- b2 W0 B) _
  78. }: U; l1 Y6 J' c
复制代码
隔一段时间就执行一下,知道你按密码了。类似于刷卡板实时轮训,知道你刷卡了。
% R) T+ d! |6 d! a, j- L% n+ B" ^1 _; W- M! r
是的 上面的函数嵌套了按键板的IIC读函数,同上+ O( Q, _5 m( y! i  Z! R
  1. #define DEVICE_ID   0xA0
    9 y, W  I% T6 u# k0 z# ^; _0 j
  2. WORD ReadTouchKey(void)4 n/ M0 F4 ?6 W
  3. {
    " A' |9 L% \2 s5 ~( C
  4.   BYTE uD[4]={0x00,0x00,0x00,0x00};
    6 B3 y  N3 k. V# h: n( |6 f& k* p/ M
  5.   uint16_t touchDataTemp = 0;% U9 C+ ~% W. Y! W
  6.   //LED_Backlight_Out(1);# a: x' c+ D9 j$ ^- v6 w' H8 g
  7.   //iic_read_all(DEVICE_ID,8,4,uD);
      i% G; t: ^; l
  8.   TouchKeyReadValue(&gTouchKeyI2c,0xA0,8 ,uD , 4);  \" j9 @- J6 V+ U( Q1 v! _9 _
  9.   touchDataTemp = uD[1];
    : \9 g" k6 [' l; k( k7 V
  10.   touchDataTemp <<= 8;
    . z. M6 }0 ^7 E1 W9 b
  11.   touchDataTemp |= uD[0];
    " p% x5 x4 M0 X9 ]- p0 K
  12. # J, p& u& \8 e1 y$ D3 v& i. F
  13.   return touchDataTemp;4 Z# ]1 A) m/ B& X  W  K0 x4 x
  14. }
复制代码

) |5 D  u! V4 \8 [- i1 s: L; y" m8 X" _) O5 }* g
收藏 评论2 发布时间:2018-5-3 16:45

举报

2个回答
GKoSon 回答时间:2018-5-3 18:03:23
正在看这个虐心的代码. p& H; H$ M% J  q5 d+ u  X
老大让我给产品提提建议
+ P& e8 e  B; n/ d' c7 u我。。。。。; e5 S5 Z% g( x2 M
我就说我们看到的吧 1 I, m* V- ?* Z9 O
编码风格* M9 w+ y" l: j1 N& F3 S/ {* @
2.png
1.png
单片机爱好者 回答时间:2020-6-24 19:41:02
本来三行就搞定的东西,写这么多,看不懂~~~~~

所属标签

相似分享

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