一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3693|回复: 8

C语言封装技术

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

5 x( _0 n; U" Q( N6 K4 u( U$ e3 O3 Otypedef signed int rt_int32_t;- I; }4 q; I- O# T% m- T
typedef unsigned int rt_uint32_t;
  |; b9 T* Q0 i
3 c- J- K+ b+ v+ o) L, v1 b8 C" L6 hstruct rt_i2c_bit_ops
" H+ r1 K' D6 R8 \; r) n& F{
. p8 Z" ]: V' C/ t! w  t, G    void *data;            /* private data for lowlevel routines */
0 a/ \9 w! N: ~. n    void (*set_sda)(void *data, rt_int32_t state);
7 N) U. {; o, d) }1 s    void (*set_scl)(void *data, rt_int32_t state);0 y5 D: W$ O7 F6 l; x9 [& t% q9 B
    rt_int32_t (*get_sda)(void *data);
  C: K& f3 m( w4 w, d    rt_int32_t (*get_scl)(void *data);
9 f; l( x# B$ q
0 ~$ Y3 Y- ?7 @/ I    void (*udelay)(rt_uint32_t us);
; A6 e/ |. `( F1 I  y/ n' N) V  n9 T9 Z5 V
    rt_uint32_t delay_us;  /* scl and sda line delay */6 O% N5 P4 I9 }  w( F: J" V
    rt_uint32_t timeout;   /* in tick */
+ h$ X/ T" y+ X  ~};
) ^& A5 o: g  f5 _! V5 r7 J9 t$ O" S) J) o% @( ?
//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来
: W* D" l3 X3 j! Y#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)
  E6 g  `# ?, n2 c1 a+ c#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)
# o/ n: ^6 f$ k* _9 t#define GET_SDA(ops)        ops->get_sda(ops->data)  z4 r. x# P$ u5 g% ]# I
#define GET_SCL(ops)        ops->get_scl(ops->data)% o$ W9 X  p- u2 A% k
//结构体功能函数的使用2 `/ d! C* G% |: A9 a
#define SDA_L(ops)          SET_SDA(ops, 0)
  f! S- I7 |. x% C#define SDA_H(ops)          SET_SDA(ops, 1)
1 f: P5 P- F6 I#define SCL_L(ops)          SET_SCL(ops, 0)
8 |! l1 V' |, ?* ]1 Z8 M. c4 Z" u1 L3 [
//提供对外使用
7 u5 I+ G8 o9 p# g7 Q( [* @inline void i2c_delay(struct rt_i2c_bit_ops *ops)- x2 e/ K- ^" p0 K( t
{
" D0 D: @8 f6 I    ops->udelay((ops->delay_us + 1) >> 1);
, W! S" T( W- l: i5 L7 F& s' K, e3 o}
" N! v  t3 C! i  a# [( x' ~4 S) _  w4 r6 _4 ]
inline void i2c_delay2(struct rt_i2c_bit_ops *ops)( L; y/ [, A2 J, `
{1 E! \) D8 g& u
    ops->udelay(ops->delay_us);
, p7 m0 E; p8 A5 _4 ]/ F6 l}( [' C6 `4 Z; E
//以下为rt_i2c_bit_ops指针函数
) c1 @& b, O8 w. T2 uvoid i2c_set_sda(void *data, rt_int32_t state)
5 ^5 F" y4 l- e) `* K{) X. x# {( n& e  H2 ?
        if(state)$ Z4 Y; y5 P' L$ B$ S* J
        {5 }$ C0 m+ Z% p
                printf("sda->H\r\n");
2 f$ {* w9 w* B% n4 K; z& I        }else  m/ G6 b4 t; O2 n! s4 x/ v. \8 f
        {
$ b" d+ p" \0 ]  u& Z! `                printf("sda->L\r\n");
! q% N3 v7 x2 ?1 x        }( W: l6 y# @  c
}
: H4 w. }& o+ B8 {8 K( ?8 \9 Xvoid i2c_set_scl(void *data, rt_int32_t state)
  P4 A7 K* _# @' o{
) u( r# U( ]* g( S3 N0 z; C        if(state)4 v$ p; L$ S0 ?' e
        {# W* |' y7 ^3 |* j: _+ m3 |
                printf("scl->H\r\n");
. [7 D7 J/ i0 Z        }else1 ]# J& A+ i0 @) i3 ^5 \' [, K
        {: r1 D! ?* \+ s! }5 U3 b+ ?
                printf("scl->L\r\n");
; ^# A) `- p1 [  `3 Z5 M        }
/ x' X3 e& o+ A; S, v' a% D}
0 U9 J7 b) P) ~' i9 t& J' d" E( n  l
rt_int32_t i2c_get_sda(void *data)- M! H! v. F) ?2 u
{
, }2 b* ?( w& Y        printf("sda return 1\r\n");
9 t* W* _  Q# O- ~' D        return 1;
" J$ e- A8 ]( r, N8 p3 Y0 }}0 P( F/ L2 R, Z2 V
rt_int32_t i2c_get_scl(void *data)6 U6 n/ ~% I  k3 w
{
1 w5 L. X& h# }1 p3 {/ p, `        printf("scl return 1\r\n");
9 W- _; `! u/ d& g/ K, o        return 1;4 x8 c) b2 e, o; {- l+ C  X+ w% H
}
: v9 c8 n9 b) A; Qvoid udelay(rt_uint32_t us)
9 X) t1 r! s1 f+ ?: S{) c  [7 t2 Y. G
        printf("udelay %d us\r\n",us);, b  ~9 Q2 y, _% v) A5 z4 p
}3 ?# @; P6 B+ r/ K( r
//以上为rt_i2c_bit_ops指针函数" y" y/ N& W) E5 z- ^
% Q* P3 ]$ G; j8 `
8 [8 r. N0 k* C5 A$ {. _8 w2 Y
//模拟i2c的其他信号可以类似i2c_restart一样调用# R. X8 R/ H. X2 f- w& q  f* X
static void i2c_restart(struct rt_i2c_bit_ops *ops)
& x( S$ H* I7 z7 W{
3 W( r* M* d. m  D3 M1 v  l/ l    SDA_H(ops);) o+ u; o* H8 J. @& S9 P% L
    i2c_delay(ops);% D4 M2 w. N# p1 m* m2 b! ^. R
    SDA_L(ops);
8 B- Y7 e/ O( g$ s6 u' k4 {8 O. j    i2c_delay(ops);( J% S$ W$ i& x; H5 ^
    SCL_L(ops);& q1 \$ M  a6 p, z7 z
}6 [) q3 T0 P, i
8 ?7 @- D% L6 w4 D& c1 m6 L
int main(int argc, char* argv[])! ?  ^' G. ?/ e
{* j% {: n$ K2 E0 |  D' z( h* I- Z, l
        rt_i2c_bit_ops i2c_ops;6 ?- k6 }8 p3 P$ ^+ G( _  @5 M: H
        i2c_ops.data = (void *)0x88;  p! Y1 h+ L8 x3 i! H
        i2c_ops.delay_us = 5;
/ w4 B/ N7 i) X5 }# ?        i2c_ops.udelay = udelay;
! [5 G9 _# A8 ]( i3 ?1 R+ v        i2c_ops.get_scl = i2c_get_scl;
' Q3 E+ I; j3 J* L5 N        i2c_ops.get_sda = i2c_get_sda;, P; A# R: Q& ]! W
        i2c_ops.set_scl = i2c_set_scl;1 H* R) e2 G! ^' {* P! o. J
         i2c_ops.set_sda = i2c_set_sda;; I+ d8 }8 M$ U' G1 E# M5 S6 V+ _
  Z8 V. V4 _5 u* R, u. H
4 X: Y+ Q  Z8 W  S
        printf("==========TEST===========!\n");4 z" _, Q4 L/ G/ b& I% V4 h

! G* o! \" J6 ^5 N( P$ v        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。
1 o6 {+ a7 l# J        i2c_restart(&i2c_ops);7 g6 ~9 t, u8 c
        return 0;
- ^4 i' L& G! w5 |) @}1 U0 x& C* l( ?  B) y8 _

+ J+ D, N" t1 K) _. [
, |% u) t% {# T) D) m+ }" s6 j- A转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:299 b! q2 X/ B! H/ J& T3 J0 I
看不懂的东西,先记号,希望有一天能看懂
$ G) w4 L" B  Z0 G
这个不是很复杂,现在你也可以看得懂4 B- K* E4 ~- c# \+ R  `
回复

使用道具 举报

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

使用道具 举报

发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下- h: k" P6 s6 V
回复

使用道具 举报

发表于 2016-6-20 16:33 | 显示全部楼层

0 c( [% N' X- _
3 X( J4 Q: A2 N5 S3 M# c对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
回复

使用道具 举报

发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops
) x' @( |/ J6 W9 J: Q2 v9 \. ] {
3 \& T* H& |/ Y; b( X6 {6 ~3 j
4 Q3 f% Y, O% q- M+ W/ k& I' S };
7 M# p' S, |- D# M  R这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义) X1 j# o5 n/ Z, x
回复

使用道具 举报

 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:33
6 r5 y# C4 K3 F' Z+ {7 z" m6 t对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的

( Y; b% D5 ?' F. S, ~$ V. n如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了
  U" F$ Q. J! J+ f
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-10-27 12:57 , Processed in 0.034287 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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