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

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

[复制链接]
GKoSon 发布时间:2018-5-3 16:45
正好昨天论坛有童鞋问了一个问题,这是C语音的一个小细节。如下:ok case1:用的比较少 直接用的 struct{ }ringbuf;
* A& d, u4 P6 ~$ t) I7 `
  1. #define Buffer_MAX_SIZE 10, j0 s8 I  ]2 S9 R7 O) {, J: M
  2. struct{# {& i2 _7 R3 M' a( T6 |/ r$ j, e" Z$ Z
  3.         unsigned int  headPosition;- I4 H+ P1 G" A3 L+ c4 y( j! v
  4.         unsigned int  tailPosition;
    9 B. G) R! N$ s5 D- V$ Y# L+ j
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];2 e: P' T. C0 X3 Y+ Q
  6. }ringbuf;
    , T2 I" ?& M+ z" i+ W7 j, A: g8 x
  7. * U: _: O# m4 G1 V4 D
  8. int main()
    1 p9 V4 P5 Q" G( |
  9. {2 M2 x4 B% Y+ k% T
  10.     ringbuf.headPosition=2;) o6 ~4 G& _& l2 Q
  11. }
复制代码
ok case2:墙裂推荐用法 typedef struct { }ringbuf;     ringbuf Ringbuf;- L; |6 Q# {0 t0 G8 e' Q4 c/ Y
  1. #define Buffer_MAX_SIZE 10- M  e6 \: j, u$ q  ^6 F4 V7 S3 X8 p
  2. typedef struct {9 ~) K  M' u  F: ^, p3 u: k
  3.         unsigned int  headPosition;5 T7 V% e$ N+ y: d# Q) g
  4.         unsigned int  tailPosition;9 I3 s. K* ^3 U; }/ ^$ K
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];/ p- Z7 H( [. u" z# H: Z
  6. }ringbuf;/ q5 i/ y' i( O1 W2 F3 J
  7. 7 u3 c$ B  M9 h0 S+ B
  8. ringbuf Ringbuf;. ^1 j+ d9 x, P; \+ Z5 u
  9. 0 p5 |3 G: z0 S0 `7 F/ ^6 G0 Z
  10. int main()4 w2 U8 W: Z; E; m0 J! K' k# `* x
  11. {
    5 @& q0 U' r. V, o( B
  12.         Ringbuf.headPosition=2;
    - d" _8 r( V* _( q$ w& l9 l
  13. }
复制代码
ok case3:类似于上面 也就是typedef struct _ringbuf{}ringbuf;的 _ringbuf可有可无0 `- f6 E* A' |# u" G) {
  1. <blockquote>#define Buffer_MAX_SIZE 10
复制代码
好了 开始机器风格的第三章,跟第二章一样,但是他更加简洁。第二章用的是case3 本章我们用case20 ~! C$ l: W8 c( g! d9 g+ Y
第一部分:框架4 T9 z8 x8 T7 B- u, ]
  1. typedef struct5 k, a7 ~0 @2 t* L
  2. {
    7 ~+ c$ t* `7 H; o+ D
  3.     KeyParmaType        KeyParma;
    # k' U+ @' q4 s3 ]9 r0 x! R8 _
  4.     DeviceFixedPwsType  DevicePwd;
    ! _# q  y: f. f  J/ L
  5.     PwdSavePosType      PwdSavePos;) M  p$ I3 j3 b6 l* D
  6.     PwdSaveVarType      PwdSaveVar;
    5 N/ Z5 f! }. h. U/ I' O6 c
  7. }_TouchKeyVarType;
    7 F5 T8 V! v# z8 ^
  8. 5 u) R' m9 W+ ?3 o
  9. typedef struct! K- V$ m# ^! P) t  N
  10. {
    & K; J$ _# ^) O4 K+ p
  11.     void                (*AddOpenLog)( void *pL , BYTE *UsePwd);
    ; @. O* y9 ~! O
  12.     void                (*AddTempPwd)( void *pL , BYTE *ucPwd , DWORD dTimeStamp);7 u7 \4 n( z  }" T
  13.     void                (*TouchI2CInit)( void);; u3 r0 Y) H* i' E% r
  14.     void                (*TouchLightInit)( void);. }% L3 S$ b9 B" A
  15.     void                (*LightOn)(void);
    $ G" ?8 R# B" R7 k: _4 d( A) b9 u
  16.     void                (*LightOff)(void);
    , J+ s: A& w5 q, J
  17.     void                (*ParmaClear)(void *pL);4 m, S& h' x: u6 C, j3 x: m
  18.     BYTE                (*InspectPwd)(void *pL , BYTE *UserPwd , BYTE *InputPwd , BYTE len);$ l3 v" X5 C- \/ F
  19.     WORD                (*ReadTouchIc)(void);//Read value form touch ic! s/ P7 d% @: t& L7 d/ r
  20.     TouchKeyValeType    (*ReadKeyVaule )( void *pL); //Read key value% C2 h; t7 \' ?4 i
  21. }_TouchKeyConstType;& g1 V  F! B/ w# \+ f
  22. ( s* u  h# m  d' W1 m
  23. typedef struct
    7 t5 v, N+ {' h8 i& L
  24. {
    + \, i* F% e2 t( o0 ?
  25.     _TouchKeyConstType  *TKConst;
    0 y( ]7 j1 B) ]5 y8 f9 c4 v
  26.     _TouchKeyVarType    *TKVar;  G. O1 v0 @0 Y2 U
  27. }_TouchKeyHandleType , *TouchKeyHandleType;
复制代码
可以看到 它的风格_TouchKeyVarType这种,_ 开头的就直接是名字了。最后封在一起, s7 F, \: s' B$ K3 J  y
                      _TouchKeyHandleType , *TouchKeyHandleType;----------用_     和    名字区分( c0 s. B3 Q: ]' p$ a$ u; Z7 U
前面第二章是 BeeperType,           *PBeeper;--------------------用Type和*p名字区分5 h/ [6 ]! Q5 m6 i$ h, |
: K# l0 o/ `/ c; r( |" W8 p
4 g* j: {- x. F
第二部分:实例化' l, ], V) l, f' f2 p4 _. m, F
  1. _TouchKeyVarType  TouchKeyVar;
复制代码
一样的 数据成员暂时不管
8 q4 |  x9 B2 n" L$ A/ f6 n5 x* c方法成员则实例化 比如下面的实现
6 d( U6 B" Q( zvoid SetTouchLightOpen ( void )
% y7 ?1 A( V7 s' `: R' e{+ H4 M. y3 b2 s/ ?" B4 I$ B0 e
    GPIO_SetBits ( TOUCH_LIGHT_PORT, TOUCH_LIGHT_PIN );
* m, i' @/ U( m  F3 r, R# V}
0 B4 A. V4 d# c# j7 P5 X( j) j8 C: M7 n# f
3 q( Q2 q+ R! X. N+ w- t
第三部:使用) I2 X3 |$ Z4 B  H8 |3 C: Y
现在gTKHandle就是一个全局变量了,它是一个句柄,(不是指针它是实体),它包含password的全部属性,拿去用吧。  t3 I/ S. E8 Q4 f
如果喜欢指针怎么办?
3 m; F& o/ R: v  o9 y+ f
  1. void vKeyInputTask ( void * pvParameters )1 t' X, |! f2 l; y$ t' Q
  2. {3 [6 @& {3 R& P2 v2 T) L3 h
  3.     TouchKeyHandleType pHandle = &gTKHandle;//指针出场
复制代码

1 C. L  K3 s# Z. ]. |- z$ q  B9 H# _- F: F2 s+ F$ X

+ d& Y) F6 O9 }最后详细说一个案例:注意ReadKeyVaule
3 f& X6 W" V8 O1, w, ]% J7 y+ f
void vKeyInputTask ( void * pvParameters )! n3 M: `, ^2 Q% T( \( k8 G0 I
{; u7 x$ H# w8 ]! l, n8 V' u' X
    TouchKeyHandleType pHandle = &gTKHandle;//指针出场
% Z9 S0 r6 [7 P    KeyParmaType *KeyData = &pHandle->TKVar->KeyParma;0 L* F  B1 e6 V1 K
    BYTE ic_door = 0;
; @, q* s6 R* p, H  y
: N! s. }. o; m" U- D9 m- A    pwd_log ( "Into touch key task ,password is init...\r\n" );& l) ^0 s2 O# L% j% I
    PasswordParmaInit ( pHandle );
2 k! T/ ?3 ?6 j
! b" H2 ~: i( B) Z    while ( 1 )
5 {4 C: [9 U; }    {
; t' E  i) M% u+ C8 D        if ( xSemaphoreTake ( xBinarySemaphoreTouchPwd, portMAX_DELAY ) == pdTRUE )2 B2 x. `7 V" O& {7 p( `
        {' R. f0 K$ Y% q7 F/ n
            if ( KeyData->ucInputKeyFlag == INPUT_KEY ), [% M, _1 d; a+ A% C
            {- F1 W% y$ t' t6 {  j
                TouchKeyValeType    KeyValue = KEY_INIT;
+ E9 }( a) Y2 M1 z/ ~+ f1 K
# b8 f; }. V7 H2 u5 h# X& p                KeyData->ucInputKeyFlag = NO_KEY;
; L& H, ]( T2 q, z* V9 v+ c                KeyValue = pHandle->TKConst->ReadKeyVaule ( pHandle );---完成死循环 定时轮训这个函数。
2 a+ H: K2 V- ^# F" Y+ F" z! C% g, l8 a
+ C4 G$ t- C2 ^。。。}7 n5 }& N7 W! p! K% A& C$ f
4 l5 j* `, Q# s6 m- W4 y- ?
2( f+ d: Z5 B  h7 G3 B! A# j
前面已经初始化了. Z3 r* D. D9 m7 q/ Q% p7 Z
_TouchKeyConstType TouchKeyConst =
2 }( H& M, P% C  Z6 l{8 O& m6 Q: N& H- k% f+ L8 L+ |4 P
    .AddTempPwd = GetTempPwd,8 I! s" ]3 x2 @4 N# a4 b
    .ReadKeyVaule = ReadTouchKeyVaule,
. f0 M; z/ J9 C7 O1 }' p。。。};- ]3 d8 h; D7 m/ Y5 O

& M  m8 w; `8 X8 P' z) Z: T, `3
+ V) \6 ~# N$ m8 _7 e5 W我们看ReadTouchKeyVaule的实现(你无法找到它的调用的啦!!)) H% z0 P1 ^" e* y4 V
  1. TouchKeyValeType ReadTouchKeyVaule ( void *pL )
    * |6 v- k. v9 j) ]* J& y* @6 f
  2. {
    7 \6 H& p; m( ?- O: H& q4 {
  3.     TouchKeyHandleType pHandle = ( TouchKeyHandleType ) pL;8 o8 p: g! T. f( ?* E
  4.     WORD ReadVal = 0;  q! }  A* T/ X0 y# s0 A8 X
  5.     TouchKeyValeType ucKey = KEY_INIT;1 d6 e# L  m. N7 G2 K7 `
  6. + c$ H4 t% z7 @7 C. X) {0 ?! \
  7.     ReadVal = pHandle->TKConst->ReadTouchIc();
    , e8 M; i7 D( U; \
  8. ( Y7 T6 z8 i9 s
  9.     switch ( ReadVal )
    5 E; Y  y9 Y6 v& J# x
  10.     {& u9 t3 q, d' A" A# p% T6 I- T# w
  11.     case 0x0001:% U" r$ O( R4 O2 l+ W
  12.         ucKey = KEY_ENTER;/ n3 z0 _3 g3 p, m. ^
  13.         pwd_log ( "Input # key \r\n" );
    4 A1 p8 F' {  I" i3 q3 \3 @
  14.         break;, u. ^- m5 \% }
  15. 7 m- J3 u. E3 T
  16.     case 0x0002:
    * O5 W8 s( Z$ n% p% j
  17.         ucKey = KEY_0;
    / w% X; G4 t9 F4 M
  18.         pwd_log ( "Input 0 key  \r\n" );/ U: X& ~4 w5 k  L
  19.         break;, J* b  E) E, x* u  X  Q
  20. " d) c- l8 p$ M. P
  21.     case 0x0004:
    4 P& }7 T4 u. |
  22.         ucKey = KEY_BACK;$ ~& t/ f9 y4 S" o
  23.         pwd_log ( " Input * key  \r\n" );% g5 {3 q- y& p3 }9 j' t7 x
  24.         break;) I8 p  p/ z9 U- o
  25. - G0 m/ W6 {6 c, N1 D, g9 ?
  26.     case 0x0008:
    / @" T1 H5 b. r& W+ B4 J! I
  27.         ucKey = KEY_9;
    - K: H5 j: C8 F* q
  28.         pwd_log ( " Input 9 key  \r\n" );. x" _6 B- v& n' j& m! A
  29.         break;/ G: ^8 D' i" t

  30. , ?  Q1 |* P' g2 R7 `9 Y$ h- V
  31.     case 0x0010:  I0 e' M5 p8 N3 U* ~3 w; O2 \% B
  32.         ucKey = KEY_8;
    5 O6 d3 T/ u4 o  Q% d# g1 a2 b. T4 @
  33.         pwd_log ( " Input 8 key  \r\n" );) d! [$ {6 w" T0 \! Z
  34.         break;, l' t& x0 D  u: [' G4 x: g" y
  35. ; H" \( S1 Y2 G
  36.     case 0x0020:
    1 [- {; d! V1 ~# \% J; o; s0 ~
  37.         ucKey = KEY_7;  x+ E4 R9 P( W% o. {; H
  38.         pwd_log ( " Input 7 key  \r\n" );
    , C# L) U+ q- P7 R" }
  39.         break;1 q3 t4 L( R. k$ Y) q

  40. : R, `3 y2 j+ `; A2 G
  41.     case 0x0040:
    ; M( k8 H: s# d& R0 m
  42.         ucKey = KEY_6;
    1 m; O/ f7 o1 z- u
  43.         pwd_log ( " Input 6 key  \r\n" );
      w1 E  E% ?( @6 {- p9 M2 f
  44.         break;
    ) i+ W' w: E3 K: P3 u
  45. 9 l: w2 D5 }& }2 p5 P
  46.     case 0x0080:
    3 O' w0 W" M3 G" K' {# d. s; Z: ^
  47.         ucKey = KEY_5;
    * h& Y, L$ a8 \( g+ W: `
  48.         pwd_log ( " Input 5 key  \r\n" );
    - T- y, E9 e- H) W
  49.         break;9 j. g" O# g) z! R5 K9 C3 S

  50. # u; f% P( Y; L5 ?# s7 S# S2 [+ ?
  51.     case 0x0100:8 D/ y( C) O! ~, i3 J' G/ C
  52.         ucKey = KEY_4;; g$ a# L; P+ W2 y' {
  53.         pwd_log ( " Input 4 key  \r\n" );
    5 A! T9 X  o7 C" G  F3 C
  54.         break;
    ; J% ]6 ~' F, k: P

  55. - q1 t$ D! y" H5 x
  56.     case 0x0200:4 l' h7 a' U% R4 P$ C
  57.         ucKey = KEY_3;
    , ^  q; D: M- l6 ?! {( X" @
  58.         pwd_log ( " Input 3 key  \r\n" );, E3 Y' I0 g0 B" |. |7 u
  59.         break;
    " U9 H, H- I0 ^# D" m8 c
  60.   F+ ?6 ~( R% `- A( K0 V
  61.     case 0x0400:9 i( `* q$ O) V$ t
  62.         ucKey = KEY_2;
    & l9 b& _9 P: t
  63.         pwd_log ( " Input 2 key  \r\n" );
    9 U: B* J7 `$ z! g7 i) n8 p/ ?
  64.         break;1 |: t$ Y# ?% k. V
  65. % u- |% U# i7 j$ e
  66.     case 0x0800:+ S4 T' n1 |$ F
  67.         ucKey = KEY_1;
    . {$ F; G2 t3 A8 a! q3 Y
  68.         pwd_log ( " Input 1 key  \r\n" );# u4 ^9 l& e8 R- ~8 y7 K
  69.         break;
    " H6 f" k7 l. t; {- }6 `
  70. ) X$ j) _* \& O1 ^+ F: B; w- P/ b
  71.     default :7 d& W. k* E: J5 a* ]  _
  72.         pwd_log ( "Read error value = %x.\r\n", ReadVal );
    5 K5 E( p) x) H5 ?4 B
  73.         break;
    : V4 g2 Z4 h: F
  74.     }
    9 z( N8 V  L, a/ |2 R

  75. , o5 Q  V' J( n, l' `! O
  76.     BeepRunCycle ( gpBeeper, 1, 50, 10 );
    , W6 Z' U) ]+ r, h
  77.     return ucKey;8 V  s& n+ p* A( V; E
  78. }3 T' P- g& R# s3 q8 X5 X( L
复制代码
隔一段时间就执行一下,知道你按密码了。类似于刷卡板实时轮训,知道你刷卡了。
& p- g! W9 D# }9 |& J  @  k8 }( A, f! O" G2 [. V/ @1 E
是的 上面的函数嵌套了按键板的IIC读函数,同上9 o# m; d/ r1 H* e- p- d
  1. #define DEVICE_ID   0xA0
    % w/ _* x6 P+ w3 g1 S5 ]0 s+ M- M3 v
  2. WORD ReadTouchKey(void)# h' I2 ]- t! _& R; `% r8 f+ h
  3. {
    9 F, O3 R' C; q9 Z) F3 f" i
  4.   BYTE uD[4]={0x00,0x00,0x00,0x00};
    : G6 s3 x3 I$ |) d
  5.   uint16_t touchDataTemp = 0;. B# I+ f7 L% F  v+ x* k
  6.   //LED_Backlight_Out(1);
    $ x/ b+ G& n2 ?! w
  7.   //iic_read_all(DEVICE_ID,8,4,uD);
    1 Q1 u/ p/ T& s6 v
  8.   TouchKeyReadValue(&gTouchKeyI2c,0xA0,8 ,uD , 4);7 g& m' D2 f5 e# z
  9.   touchDataTemp = uD[1];$ _. D6 f& {6 O( v( @' r) c
  10.   touchDataTemp <<= 8;8 ]: b& p, P1 f6 [+ d
  11.   touchDataTemp |= uD[0];/ q# i8 H. ]& y4 y8 E% G
  12. & b* N8 p+ f! N2 y; `5 ?8 }
  13.   return touchDataTemp;1 O5 T/ G$ J5 L: i  M$ T1 l) r9 E
  14. }
复制代码
7 J9 D( H( Q4 v- p5 T
" w+ ~, o6 y1 }! z) F0 `
收藏 评论2 发布时间:2018-5-3 16:45

举报

2个回答
GKoSon 回答时间:2018-5-3 18:03:23
正在看这个虐心的代码
, C5 L% U+ f3 a' `2 y& b老大让我给产品提提建议
/ [7 e; X4 n/ B( }我。。。。。- G6 R& _9 g+ t4 U
我就说我们看到的吧
1 B$ w- s! S1 I+ P# X* }6 g: {编码风格
" j2 T# {- _( y' z: O
2.png
1.png
单片机爱好者 回答时间:2020-6-24 19:41:02
本来三行就搞定的东西,写这么多,看不懂~~~~~

所属标签

相似分享

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