一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2509|回复: 8
收起左侧

C语言封装技术

[复制链接]
发表于 2016-6-20 09:00 | 显示全部楼层 |阅读模式
# @) B) @7 }/ s
typedef signed int rt_int32_t;9 L9 I2 e+ [4 M/ M# {
typedef unsigned int rt_uint32_t;8 L; G1 u, Q( C( @5 y; ]5 Y8 i7 ^3 G7 O3 b

1 T/ ]/ l  L+ R/ U6 l% Vstruct rt_i2c_bit_ops
" h$ \* C; V+ r& t: C{* x* f, s4 L; h0 v
    void *data;            /* private data for lowlevel routines */
$ W1 x3 h- \( J' W; f    void (*set_sda)(void *data, rt_int32_t state);! z$ U1 E5 h/ C2 i
    void (*set_scl)(void *data, rt_int32_t state);
3 K4 b3 U5 @5 R6 U3 p    rt_int32_t (*get_sda)(void *data);
* C2 c- z+ L! D! |0 g    rt_int32_t (*get_scl)(void *data);" q$ h* \% M8 j2 C5 [
. z% k& p" N1 ~+ l1 j7 D
    void (*udelay)(rt_uint32_t us);) E' e3 V7 c- J; A* ~

! u8 s0 J9 z3 l2 w: C; g  Q    rt_uint32_t delay_us;  /* scl and sda line delay */% }& j0 c- I) R0 m4 q! D
    rt_uint32_t timeout;   /* in tick */9 I# d2 r0 e7 o4 j
};
' t" P$ ]% K3 t# `" T2 u; C9 Q
$ O0 @% o3 J* I! l+ p//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来
$ [' Y* E. ?1 X2 U+ o: C, N, W#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)( m9 g' u1 Q3 F
#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)9 M' J% `. t$ X7 P7 D
#define GET_SDA(ops)        ops->get_sda(ops->data)9 T2 Z/ D" S8 [; v
#define GET_SCL(ops)        ops->get_scl(ops->data)
% @! N- x+ C) m: E! `4 V! \//结构体功能函数的使用
: ?- K: w: [9 B% }#define SDA_L(ops)          SET_SDA(ops, 0)$ \  K8 O' I4 |. X( F2 D: |- L* j
#define SDA_H(ops)          SET_SDA(ops, 1)8 w/ s) e  i* S1 j1 ?- Z
#define SCL_L(ops)          SET_SCL(ops, 0)3 D2 a" u6 a, s$ C( N5 R
. {$ P# u. o) q7 C" D
//提供对外使用
3 N/ g( c0 W. G' _3 e! O+ U) Dinline void i2c_delay(struct rt_i2c_bit_ops *ops)' j$ z9 U+ ?$ ~; X
{
9 Q; ]" p1 X; u3 I    ops->udelay((ops->delay_us + 1) >> 1);% v0 K; L9 H# f2 p% d
}
  b7 ~; b. p% a  b% P2 [! l0 E
1 u+ ~6 n( f/ E$ s. Q  ]8 `inline void i2c_delay2(struct rt_i2c_bit_ops *ops)
9 G4 ?# p+ T4 F; J( i" c{) y2 a; B4 |. p9 R
    ops->udelay(ops->delay_us);; a1 C  e0 R: s1 }4 ?
}
! Y8 p* f+ l. T' Q//以下为rt_i2c_bit_ops指针函数
' p9 [0 j; y+ J) p/ [void i2c_set_sda(void *data, rt_int32_t state)6 _8 x: B$ e/ H4 r0 Q
{
  Y6 v1 @! [1 Q* M! H: f        if(state)
: J; X: B# P' P8 I        {  @5 Y( b, X7 h+ e1 Z: q
                printf("sda->H\r\n");
5 }! {+ d: ]( X. _2 N4 u9 \        }else. z9 n0 f0 R# N* [0 Q. j+ e
        {
5 u2 N+ i) t$ [5 U                printf("sda->L\r\n");1 q% q$ z' L6 ~7 U" t3 {
        }! u# H/ W7 R6 Y; j( N8 r
}" Z8 @$ K2 v( A, ?9 r# V8 h5 N
void i2c_set_scl(void *data, rt_int32_t state)
( J9 K/ T6 k3 M9 v{5 Q, L8 s/ N- _- b. L# g# N
        if(state)$ R  T( x+ A: e+ w( x8 s
        {' e& w4 A) [8 ?" L" z
                printf("scl->H\r\n");
  I9 ^6 o" t" g        }else* F  B$ L' k5 X0 D4 n
        {
) C6 ?: m) d! R2 V. N# r6 D                printf("scl->L\r\n");
5 E- e3 B# h0 G* K1 k) O+ L        }
6 ?$ H, C9 O1 R% z}
$ y. u. A, w/ g$ [/ o$ v( [
. z  G  p: l2 O" F6 r1 ?) ~( V8 Xrt_int32_t i2c_get_sda(void *data)
1 h! k: s! t( ?! p+ `{
8 ~; C* n0 l7 L0 _3 x        printf("sda return 1\r\n");) e9 A0 m, W1 f6 }+ m. G
        return 1;
9 B. e& o$ B" m) |}8 }! ^. Y" V' N- a
rt_int32_t i2c_get_scl(void *data)8 O6 O% G0 `6 l6 P; x
{1 @0 L: U" S& G  W+ C( `" F' q3 B) `
        printf("scl return 1\r\n");
% Z6 q% M+ d4 x- @        return 1;& }: V! R1 m: }# e8 |& n, ~( _
}
' D+ \& V4 T, v5 qvoid udelay(rt_uint32_t us). G$ b2 |2 j) i1 @0 i
{! K6 t: b  `  ^2 C
        printf("udelay %d us\r\n",us);
' s: g  X2 ~" q}2 f$ H4 J7 C. v0 u2 A
//以上为rt_i2c_bit_ops指针函数
; v9 u6 T, P) f% R" t
+ o+ K9 l- F6 _% i5 ~; \; u% t: J/ R* {7 o! j( V0 {! P' J
//模拟i2c的其他信号可以类似i2c_restart一样调用
- w. a: W# U$ x  Q/ C* Q5 astatic void i2c_restart(struct rt_i2c_bit_ops *ops)' ?! a0 i. E0 ?  i# ^; O4 p
{; ^  E5 ]2 V" F& a5 _
    SDA_H(ops);) V9 w( N$ t* |  i
    i2c_delay(ops);! P8 g7 f- k# g- w
    SDA_L(ops);; l: U$ i) H: I0 l' I0 b7 M
    i2c_delay(ops);5 J% d3 {/ ^, J  v; Q) Y1 i
    SCL_L(ops);1 T% E3 {$ s$ U
}( B# B7 ^: I& i- l" O% H: |. U
: Y+ ?5 @' c, s9 ^
int main(int argc, char* argv[])
4 t' |) Q6 q* b2 G{! ]* |! T. Q! z4 H) I+ F. X& s
        rt_i2c_bit_ops i2c_ops;
  |, x' l- f( Q0 F1 i, L' h        i2c_ops.data = (void *)0x88;; y. `& n. e9 Q% ?0 v8 S
        i2c_ops.delay_us = 5;
/ ]" m" t) ~1 ~! t7 `5 D, |        i2c_ops.udelay = udelay;
) u) z; h9 B  Y        i2c_ops.get_scl = i2c_get_scl;1 Q) N. s% \; P+ v) R3 v9 j3 Y- j
        i2c_ops.get_sda = i2c_get_sda;
0 E  y6 T3 n" Q        i2c_ops.set_scl = i2c_set_scl;
2 H( n: u4 D, Z8 r1 W- h. q4 L+ t         i2c_ops.set_sda = i2c_set_sda;
4 E6 l, @/ e7 p" Y+ V. C
$ E, f8 w$ O  ~" u# m7 k: [# ~% B; T+ M7 n
        printf("==========TEST===========!\n");
! n3 Y4 p- z& \  a, P) F( \) ^6 U+ V( b% q/ c' d- H# ?
        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。3 |& f1 z5 ?$ v; p* B, U
        i2c_restart(&i2c_ops);) E7 t6 B, X( |/ d( n: l7 K( n9 Q  M
        return 0;0 d- {7 Y& W* r$ s8 g
}
: L' P) G; A# V2 S+ z1 C+ A4 K! Q9 m$ o

' U' M$ X% g/ E  I转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
发表于 2016-6-20 10:29 | 显示全部楼层
看不懂的东西,先记号,希望有一天能看懂
 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:296 r8 S) Z# z, }, |
看不懂的东西,先记号,希望有一天能看懂

, J% N* V; p- ~. T, j2 l这个不是很复杂,现在你也可以看得懂
2 l% v1 S" k! b( N7 c8 P& c
发表于 2016-6-20 11:34 | 显示全部楼层
看不懂的东西,先记号,希望有一天能看懂  绕来绕去  脑袋不够用  
发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下
% o7 y0 h% t6 n, @- A4 E3 o4 d
发表于 2016-6-20 16:33 | 显示全部楼层

' y1 P3 w& p2 k5 q9 F: E1 Z# o( n
' b, p' w( Z+ f, y  P( c- L对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops
# u# p$ Z6 M$ S" A {: O/ |  C; u4 q( Q* D( ?. _( F& y
; @8 {  V. u) |0 b. R8 y6 @
};
( F! v. H, j2 W7 y这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义! F* d5 m4 W, a/ g! Q; I
 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:33. m2 M( J7 Z) H5 T+ w: ]
对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的

) \' j) b/ e. }/ y. d+ w  B5 S如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了) e" ~! T' U3 h6 {# f6 r+ U: F

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 05:08 , Processed in 0.049999 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表