一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3897|回复: 8

C语言封装技术

[复制链接]
发表于 2016-6-20 09:00 | 显示全部楼层 |阅读模式

( B# T( O2 n2 b( Q' m! }6 H# d" K' H* Wtypedef signed int rt_int32_t;) T3 g  P  Z; W. k/ X
typedef unsigned int rt_uint32_t;
4 r" b3 a& x. a7 A1 H9 i9 p* c7 C+ n- L! q: X* W3 O
struct rt_i2c_bit_ops" q, |+ E4 p. V7 e# S0 [6 X
{
, z$ D) L! M) _9 m; U1 B, f    void *data;            /* private data for lowlevel routines */
- |7 y, Q  V; ?- Z    void (*set_sda)(void *data, rt_int32_t state);
& r% v/ n5 `) U9 p9 }$ p: F" u$ W    void (*set_scl)(void *data, rt_int32_t state);
0 h0 p- d9 H8 J    rt_int32_t (*get_sda)(void *data);
2 y! H6 a* u, ?! ^3 A! X3 a0 |- z    rt_int32_t (*get_scl)(void *data);
& \" t7 f, N) D2 H" \( H
5 f: x% Z! @$ ^    void (*udelay)(rt_uint32_t us);
! h1 M% D$ X% Y, q# k, Z  ~# Q& V" p* d2 l8 C
    rt_uint32_t delay_us;  /* scl and sda line delay */
9 ^4 X! ?  d4 d% z8 J2 h" _2 m. \    rt_uint32_t timeout;   /* in tick */9 ]/ E, ~4 v# u" M4 D8 m
};
7 ^7 o2 U( P7 C. J1 o, O7 i
4 s9 ]3 }. E( S6 m//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来& o' y2 e+ M, J. f
#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)) S! i: N; y* g. b' S, z
#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)
3 L0 ^- K/ L& f- V#define GET_SDA(ops)        ops->get_sda(ops->data)& I$ q. z. w4 x7 g$ G
#define GET_SCL(ops)        ops->get_scl(ops->data)
: A  ?6 \# H$ Z; a" A1 F//结构体功能函数的使用) [2 F/ |4 R& j, r0 K
#define SDA_L(ops)          SET_SDA(ops, 0)  {3 f( E! s* G: ?& i' J. d. o* i! L, b
#define SDA_H(ops)          SET_SDA(ops, 1)
- N( A0 X  ^3 P0 f9 ]$ A#define SCL_L(ops)          SET_SCL(ops, 0)
9 o/ F0 M! }# s$ }# {6 b- u4 m9 g$ R9 F. d
//提供对外使用
0 u7 h! X5 V: }8 K  sinline void i2c_delay(struct rt_i2c_bit_ops *ops)
0 ~1 l, e$ x# @: q9 k* i) I{+ c/ j" V- u) z/ x
    ops->udelay((ops->delay_us + 1) >> 1);6 E- [8 p8 Y% Y* v: F# }6 C6 \
}
2 u% `7 j- g; o' c
. U- c; }8 a7 l/ y! \inline void i2c_delay2(struct rt_i2c_bit_ops *ops)( ^1 d1 A" h1 P5 D, b
{8 k4 ~( @. c7 N, M. M
    ops->udelay(ops->delay_us);8 K3 |' \! b: N) @# Q" t# y8 s
}- R% @$ c( L) S' \/ ~) k! M1 q
//以下为rt_i2c_bit_ops指针函数4 _! G; S0 V% M
void i2c_set_sda(void *data, rt_int32_t state)
, A. ?6 H1 K" @- @5 Y4 n{
/ C' f* V  L& p4 s        if(state)
4 K6 {* S  I2 I7 Z) p) R        {
$ C6 q' x5 G+ z- _2 Y                printf("sda->H\r\n");7 }. S; Q7 D5 i+ ]* n
        }else
' d7 ]6 V) E( [* [, _3 v        {
& L9 D1 h2 m* f% O) M: c) a                printf("sda->L\r\n");
4 G' M6 w$ G; Q        }
! n6 s' @$ U* V8 \1 O4 |! B+ c}
0 s1 j# [5 s/ m' F( ~void i2c_set_scl(void *data, rt_int32_t state)
8 G2 |0 Q7 s0 D% _" b8 H{1 l# Z3 S; |8 E: O3 O2 Z" ]
        if(state)3 @  `+ ?! U, W) ~  @2 a4 U3 c
        {# ^0 b- E( w+ Q! j- j
                printf("scl->H\r\n");5 `3 `- F- U5 v% A
        }else
* P, f/ B6 i! G" {) W8 h        {
- \  \, x: e0 t# l8 `                printf("scl->L\r\n");# ]/ u3 U; c# J( t+ Z9 \0 ?3 I$ u
        }/ G- X' M: s& H% V" S
}
7 t$ y7 f7 `1 @* u" E5 B8 J# H' @1 J  l* }) O
rt_int32_t i2c_get_sda(void *data)# K6 {: O: D. ^  U5 m
{. u; ^4 x, u( p7 _
        printf("sda return 1\r\n");
& K* a, ~/ s8 x1 V        return 1;+ C4 @; Z; |$ A9 @& G* a2 T9 b4 i2 j
}
( \) X9 P  i3 F# |# j/ Rrt_int32_t i2c_get_scl(void *data)2 B+ w" r8 u$ c
{! F9 U2 s7 s& u; }1 m! O
        printf("scl return 1\r\n");
: d1 ?  X! O6 k4 \  v6 h1 O6 @        return 1;2 J% F9 e* H! ?3 `) o0 A/ R. p
}
, o  R" P  ?- y% E5 P' ^" E+ tvoid udelay(rt_uint32_t us)/ r, @& n* c- k
{6 v3 q9 O9 z& d. g7 W; M# {
        printf("udelay %d us\r\n",us);- ~8 |4 r8 M& z& n5 V/ `
}! U% b% U( P, ]  @7 W2 t( q& a
//以上为rt_i2c_bit_ops指针函数, h$ Q5 f" ?1 @( H! P( p1 j( R) c" y, G/ @

4 C# N. z% H* R2 \. S5 \7 A3 q# d: A1 S8 Z6 @% m" u
//模拟i2c的其他信号可以类似i2c_restart一样调用* \/ I# q" \0 K) m
static void i2c_restart(struct rt_i2c_bit_ops *ops)# b3 V: x* @. y
{. \3 J) Q( b$ _; q4 ~4 _; q3 w
    SDA_H(ops);- P$ X6 T+ K9 h0 h; f
    i2c_delay(ops);4 T# z2 V. U- i1 ]  ^. e- c
    SDA_L(ops);
6 n0 V& _; u* c) p- P) J    i2c_delay(ops);+ o; O; g- O9 u; T/ E
    SCL_L(ops);
- N9 Y7 p7 Q' b# k8 k8 d}7 I+ X& V* ~5 n( @- W7 ]

4 n9 P8 t6 z+ K0 hint main(int argc, char* argv[])
' p) z& H" z8 P+ @  z1 |( d$ W, A{
+ V* m- ^/ p9 {: K8 ~/ a        rt_i2c_bit_ops i2c_ops;# @, T# I+ z2 X! n9 S! x- l+ Q
        i2c_ops.data = (void *)0x88;8 a7 W3 r( S- c5 c2 E  c/ f% G* w6 {
        i2c_ops.delay_us = 5;
! K& Z; w% J2 M+ S# p        i2c_ops.udelay = udelay;) a! a' t7 F/ {+ x' j
        i2c_ops.get_scl = i2c_get_scl;  S6 {$ r3 G1 Z
        i2c_ops.get_sda = i2c_get_sda;
- M4 i% z3 |9 K3 C        i2c_ops.set_scl = i2c_set_scl;5 h3 r7 ^) V. h* J+ p- U
         i2c_ops.set_sda = i2c_set_sda;
$ f! M( k3 W7 O2 n' P& z  P: @  `
# g' U3 j# t& `" i( `
( ^$ n- i+ l4 S6 M/ N  i) h- e        printf("==========TEST===========!\n");/ P9 P/ w/ n+ F& v5 p3 r! e8 G( C
8 e# f3 A# U4 r; v# C
        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。* s- C9 M8 g% ?& q
        i2c_restart(&i2c_ops);! ~! |3 H& H$ L
        return 0;3 f6 q% O4 U( J9 P. T  y. ]$ o7 Z" Q! v
}
8 K/ e9 N/ r3 }5 g0 B
! l4 I1 p, d1 j, u" h6 Q2 [7 \6 M$ d
转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
回复

使用道具 举报

发表于 2016-6-20 10:29 | 显示全部楼层
看不懂的东西,先记号,希望有一天能看懂
回复

使用道具 举报

 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:29
8 N  L, m. s0 s- r( Y  v% s看不懂的东西,先记号,希望有一天能看懂
& L5 {1 R+ J2 [5 r$ F: e( T/ B" a7 b
这个不是很复杂,现在你也可以看得懂
+ R( c; o, `" r. w2 w) ?
回复

使用道具 举报

发表于 2016-6-20 11:34 | 显示全部楼层
看不懂的东西,先记号,希望有一天能看懂  绕来绕去  脑袋不够用  
回复

使用道具 举报

发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下6 U* J! M9 g- k/ @. u& K+ W" b7 q* B
回复

使用道具 举报

发表于 2016-6-20 16:33 | 显示全部楼层
/ p4 X& K: ~9 `

% n- [, B+ l$ J! W) l对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
回复

使用道具 举报

发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops
. u. s+ l5 l( m7 Q- [/ d7 f( ? {
# Y, y/ z3 W7 h! S5 `8 h) E/ }  X4 O8 @' B
};% K9 i& F1 d: ~: f: C& ^# _
这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义6 t' L5 d7 z# K4 ?
回复

使用道具 举报

 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:338 ]# o: m6 N' B: ?6 ?
对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的

& q1 W# s3 @: k; R4 y. G3 a如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了
* M  Q$ _+ J$ Y5 d
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-1-11 16:57 , Processed in 0.040503 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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