一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 3503|回复: 8

C语言封装技术

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

8 T$ Q$ M8 p6 X1 x- I1 t8 n* Gtypedef signed int rt_int32_t;: z* V2 T+ P+ u6 k
typedef unsigned int rt_uint32_t;: _8 R- n2 L! q1 }8 x7 e& a

( X1 Y( j/ `! @( b6 @$ U; sstruct rt_i2c_bit_ops
+ r) E+ E3 v6 [& z{( |4 f# S; v2 G
    void *data;            /* private data for lowlevel routines */& o1 C+ Y+ G& {' Y: s
    void (*set_sda)(void *data, rt_int32_t state);
& F9 K' t# M+ p2 R    void (*set_scl)(void *data, rt_int32_t state);
+ }2 n, ?! O! E( e    rt_int32_t (*get_sda)(void *data);0 ~' N1 z; A6 R8 k0 |+ `
    rt_int32_t (*get_scl)(void *data);
6 b2 `- I9 d3 n+ T8 b5 X+ E4 Q# n9 J* T; O1 r5 U8 c  L
    void (*udelay)(rt_uint32_t us);1 P& b5 G& Z- A/ r! ^
$ I2 b" o1 Y/ x: R
    rt_uint32_t delay_us;  /* scl and sda line delay */1 B" Z. h: @" G& Y6 A# r
    rt_uint32_t timeout;   /* in tick */8 o6 ^+ u- B( A. l) C' O5 H
};$ X' t# k( ^; P
" H# H5 Z- x- x3 B% P5 P8 c
//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来! b+ O% ~: I5 m- @# }
#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)
. }, w0 s  ]; `2 i7 |' k8 O#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)
  G* ?! t6 E5 {9 K1 O8 @9 w#define GET_SDA(ops)        ops->get_sda(ops->data)
/ ^' M! W: |/ L. y- P#define GET_SCL(ops)        ops->get_scl(ops->data)2 u* r% _" H* U/ F" Z7 ?9 H4 R, r9 G
//结构体功能函数的使用( m! S6 v+ F( D; Q
#define SDA_L(ops)          SET_SDA(ops, 0)
% `0 C3 F+ P: ^' Z, F  V; ^#define SDA_H(ops)          SET_SDA(ops, 1)6 b1 y# }1 h: e; M; O. G! ]6 P
#define SCL_L(ops)          SET_SCL(ops, 0)
" U4 f* I. l' p. F5 z" A8 U, k: x' W* k: P
//提供对外使用
; t% j5 b* N' |inline void i2c_delay(struct rt_i2c_bit_ops *ops)
4 j& G% l3 N$ g% }9 B# l{
9 k7 J5 G2 L. M2 F2 n' N$ I    ops->udelay((ops->delay_us + 1) >> 1);% Y* ?- L6 b! O
}
. `6 x. r% I  r- ~5 r% _. V/ t
  G0 }2 R3 `  @2 T; z: einline void i2c_delay2(struct rt_i2c_bit_ops *ops)7 r- r% A5 [3 _, e; J. y' Y( I
{
2 G  N% K% y8 o: n/ R5 |4 `  _    ops->udelay(ops->delay_us);1 ?  L* Q6 [# o5 @5 Z, L1 T' o
}
4 O/ ]2 I3 c- x3 p" q! Z//以下为rt_i2c_bit_ops指针函数- J# x# p( X0 c) q$ w
void i2c_set_sda(void *data, rt_int32_t state). l' h9 T9 N8 J* x# W/ @0 W. z
{
) _9 w4 V4 B* G        if(state)
) i5 y" G3 ^  y! G8 Z& ~0 A9 r        {. i/ L) g/ ?3 j8 X
                printf("sda->H\r\n");$ R8 V# M5 u! L6 I# Q: [
        }else: q! S9 K+ Q% t' Y4 u, p2 p# U
        {
2 J) |, z( T" X+ `, o                printf("sda->L\r\n");
0 w7 n9 @" b; S& k$ U# K        }8 j0 ^+ m+ c8 k# c' L. s1 j( V
}
( k0 p( {) G* j  D6 ]void i2c_set_scl(void *data, rt_int32_t state)$ H& F( H5 [% I
{
$ H. J9 C# N8 t        if(state)8 d, D5 l2 `$ b: |) Z7 B# |8 t1 }6 S
        {$ l9 J4 k' ^) c6 a/ z6 g% r6 Z1 m: R/ x
                printf("scl->H\r\n");; M" v6 H2 w/ v6 H- K8 m0 R& d. T
        }else
0 h% E) ?0 e: X1 [! V9 j; x        {
) N- e( Q' u! A" v$ |1 r- @                printf("scl->L\r\n");
& M% a2 O. x0 T% V0 F        }
( H$ r3 w3 x+ [/ l}
% i; Z2 {: K, y. y( F/ H, H1 q- Z( N$ z% S
rt_int32_t i2c_get_sda(void *data)
# B- I+ ?+ _5 R. M, q6 G" X{1 K( y. R0 L: _4 `# i; l* f" X
        printf("sda return 1\r\n");
' p% J3 l! {7 ~9 d        return 1;
' h" P' _1 w+ q% R8 ]% Z: n% D5 j}# h) M8 ^! O" c9 m
rt_int32_t i2c_get_scl(void *data)
8 i" T* K- ?& A% a0 q, h7 J/ J{
5 A6 Y" m9 ]. ]8 J  R        printf("scl return 1\r\n");
9 V; F- {8 x9 P        return 1;
% N& j3 n9 ]  o2 a* k2 E+ K}7 R+ M1 h6 z( |  h# t4 E- P$ Y
void udelay(rt_uint32_t us)' Q) _; T2 {# _* p
{/ }2 k/ w8 [( n3 i: D5 X& I
        printf("udelay %d us\r\n",us);
/ e/ I2 N/ c# F) O) F}
2 A7 Q# w8 b( n//以上为rt_i2c_bit_ops指针函数- G* T7 e) W/ n4 ]0 s
7 s: m$ n0 V3 P4 B7 S
$ C3 j: U# w; {3 ?$ Y' O. Q* Z
//模拟i2c的其他信号可以类似i2c_restart一样调用
9 R( U- R* c% O- Z  J: dstatic void i2c_restart(struct rt_i2c_bit_ops *ops)8 _3 @% C# [5 f7 U$ }% P
{; l3 F% a: t- P" O) K7 p' n( A
    SDA_H(ops);5 x0 G( y! `% t! p' ]3 U& p2 ]- ]
    i2c_delay(ops);
' B+ S* t0 f- z7 X    SDA_L(ops);# n$ j) v) U& G$ E: B) d
    i2c_delay(ops);# S+ U% |- {( G. _7 s& B; k
    SCL_L(ops);/ a8 q( Y2 y% k) z
}% j  }/ a* R$ R; S
# @: P' ^: e! `1 y7 ^
int main(int argc, char* argv[])
6 v8 |/ v! F# u{) J; [, k" Q; z8 P( y
        rt_i2c_bit_ops i2c_ops;3 Y' M$ c, o2 ]8 j0 I8 v8 G
        i2c_ops.data = (void *)0x88;$ p7 u, r- T) M% M4 e
        i2c_ops.delay_us = 5;
* v2 m! @; L0 {* S# F! c        i2c_ops.udelay = udelay;' g$ T2 Q9 ?' X6 a1 ^8 x
        i2c_ops.get_scl = i2c_get_scl;
, F9 Y6 e& |& K+ w        i2c_ops.get_sda = i2c_get_sda;5 A# J6 E, Z- d1 a3 F; j# D2 f
        i2c_ops.set_scl = i2c_set_scl;
$ w' s1 I/ u- D- d1 \3 L7 t- E         i2c_ops.set_sda = i2c_set_sda;
& n) }7 v+ R/ y2 d
7 G) w  Y7 R) k6 T" A9 E9 Q2 a
        printf("==========TEST===========!\n");
* g# Z& z9 G- n( ^/ r. s
2 P; l& v) x  u4 \+ }: G; j/ `        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。% E* E* e* x, u/ A* b  v
        i2c_restart(&i2c_ops);6 g. X) e7 L0 ^6 p3 K' k2 [
        return 0;, u! p% |/ B5 N2 O) z
}
9 `' f5 Q  y; L4 V* B3 r# }! E
7 w2 s4 Q, M1 G2 \& w
8 U! }* p; h# N  M5 k# O转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:293 R* l# s1 r4 W- N) H
看不懂的东西,先记号,希望有一天能看懂

5 g5 C1 L' I: u: T; S4 ~这个不是很复杂,现在你也可以看得懂
+ m2 e- W9 j, l& K5 z
回复

使用道具 举报

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

使用道具 举报

发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下
4 Y3 r- h% i, V" z; g/ p
回复

使用道具 举报

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

* U0 N# ?: h6 F  ]0 f' u, `/ ]# y+ i6 w
. @( N2 s5 F1 H2 k3 |& h对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
回复

使用道具 举报

发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops
$ |5 |' ~7 u: Z# | {& S5 o. W/ U$ z# D# @4 Z

( u" H0 B4 ?% K7 u1 Z0 \% \ };
6 `8 Q7 g9 K' U; W这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义
1 G* ], M& y; L4 Z) ?! W1 C2 _" c
回复

使用道具 举报

 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:33
) U. I: {  L! j0 Y, H- |对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的

: \) }; X% S% y) o' e8 g! }- q如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了
- i8 u4 L, q7 U: o: z/ d
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-20 09:00 , Processed in 0.039206 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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