一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

C语言封装技术

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

2 V! K3 D  h0 d: d) Etypedef signed int rt_int32_t;
. u( k* E% B& `/ I1 D9 v7 d  O# [) Y) Utypedef unsigned int rt_uint32_t;$ x0 r' m! c" N  I' a, w

7 k1 N$ S8 G! L1 kstruct rt_i2c_bit_ops
* u  D9 k1 a/ `- [3 P: d{5 t/ N1 J4 n' H5 O! N8 l
    void *data;            /* private data for lowlevel routines */
6 ]# S7 E  j  e    void (*set_sda)(void *data, rt_int32_t state);' @" F5 g6 N) ^0 P& Y: q* }
    void (*set_scl)(void *data, rt_int32_t state);
7 c9 L8 M$ H8 Y, w* I0 I( {    rt_int32_t (*get_sda)(void *data);; V8 b5 l0 @& D) `
    rt_int32_t (*get_scl)(void *data);: P5 I/ L  o: p5 d# \

9 V, |: t4 a# \    void (*udelay)(rt_uint32_t us);( U* N+ r+ g4 Y/ q
+ e' S  U: R, K. N4 h) }8 c7 G
    rt_uint32_t delay_us;  /* scl and sda line delay */2 c2 s8 E3 D7 K# }( Y
    rt_uint32_t timeout;   /* in tick */
: C& v3 k  z0 q0 V, d" f2 |};
1 G9 Y/ r3 g" c% T3 u* n' `- d6 R3 y% u
//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来) @- |) l$ y# B) x
#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)
+ H5 {2 a" a0 n#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)( X1 Z$ ^/ N; [3 k7 H: ~
#define GET_SDA(ops)        ops->get_sda(ops->data)8 _5 A7 {3 a. W' s4 E4 x, n
#define GET_SCL(ops)        ops->get_scl(ops->data)- o5 L! M- i# L. y
//结构体功能函数的使用8 s" s7 [) i% h$ D) e; C& S
#define SDA_L(ops)          SET_SDA(ops, 0); H5 X; B0 @4 ]: s
#define SDA_H(ops)          SET_SDA(ops, 1)8 ?8 J. E/ P3 y* A  ]( s; m
#define SCL_L(ops)          SET_SCL(ops, 0)0 y6 G0 }2 p/ t) Q$ ^! x, k
6 r" U5 e3 f  J7 ~) o
//提供对外使用5 W7 x9 ~* w$ Z/ a
inline void i2c_delay(struct rt_i2c_bit_ops *ops)- E$ f$ e2 |' J+ c  ?/ `
{) x/ ^8 J9 Y$ i
    ops->udelay((ops->delay_us + 1) >> 1);  W8 `% [  g4 x
}
; W# F" o6 e( }% `
' O& `# }" s" H+ f* F7 A% cinline void i2c_delay2(struct rt_i2c_bit_ops *ops)
; ?+ ^" c+ @7 j- W% C  |{
! n) @) Y, J+ L5 e# }, ]    ops->udelay(ops->delay_us);9 \& N1 P* d7 R
}
+ m+ a4 ~0 ~# h9 {& i+ A//以下为rt_i2c_bit_ops指针函数
9 U0 n+ f! h+ D* j+ ]& ]/ ~void i2c_set_sda(void *data, rt_int32_t state)
. c& A7 v. b$ n; ]5 o{/ e8 q" g+ z% Z. ^
        if(state)# X" ~' ?& p" l
        {1 p4 P4 w7 d: A9 e+ d$ `$ G; \" A
                printf("sda->H\r\n");
# a; Z( E# S; O- d        }else
' s8 t; S8 M% K* x+ Q6 E: d        {
& i: x$ d4 L( e                printf("sda->L\r\n");
' F- A. k, m" X  t        }
3 `9 q, P7 a" q3 d. @5 R' \, H7 w}, \$ m% b  p8 p' K3 f  j$ _2 ^
void i2c_set_scl(void *data, rt_int32_t state)' O- x) c3 P" ~
{. Y0 X& [1 v* [9 T8 I2 u2 g& i# @
        if(state)
4 W7 I, U8 u# v( B6 p8 O6 f        {$ x% \/ ^1 `( L) K9 Q
                printf("scl->H\r\n");
3 z/ Q# p, Y# f' _- j! i; {        }else
( p) A& L( |, t( I1 Y5 g        {
# P" N' H, {( v. M0 I                printf("scl->L\r\n");
) U8 A7 r8 Y6 G$ v/ m        }2 ^3 }0 [8 E& R2 D
}
& ~( g* e. F. u2 [# S0 Y+ A& e
8 I5 _' ]- H* a5 b" srt_int32_t i2c_get_sda(void *data)
* V5 p: I$ K8 d- l2 {{
4 c# x2 M; n5 j1 G        printf("sda return 1\r\n");& j; l3 H, P) \8 N
        return 1;
- ~* ^$ I4 U: w( x9 n8 q! c}
9 C1 B$ e$ o- Q+ g" \$ s( Mrt_int32_t i2c_get_scl(void *data)
2 e' H2 T. |$ S, ~6 b% B{
2 }4 ]1 q. N" L% v' D: ~        printf("scl return 1\r\n");
; o" r* m: V- R( I3 i        return 1;- {( K; i7 J" Z* ?
}
+ a* x& A1 L- Y  bvoid udelay(rt_uint32_t us)
( j* {1 y+ Z% F& d{4 |- @! |' O2 a3 v2 X
        printf("udelay %d us\r\n",us);
% O2 v: n/ r* m5 l" A}
, M0 r" ^$ Y. i! l) P7 M' l//以上为rt_i2c_bit_ops指针函数
" B9 }& V- ~$ o: {8 ]; r+ e
$ [2 M! f2 T: L+ H8 X
7 l4 R& x* T5 `7 d//模拟i2c的其他信号可以类似i2c_restart一样调用
# N( j, o. l# z) q7 A2 q( O$ y7 x0 Nstatic void i2c_restart(struct rt_i2c_bit_ops *ops)
, G1 x( Y- {* b' W0 Z{
% ], ^7 U2 v- b0 Y: a9 B/ i- f    SDA_H(ops);
9 N/ \7 ^, W6 l' h+ c- v" a    i2c_delay(ops);
/ B* s# A* S- C7 U. N) w: K    SDA_L(ops);, B' w: i' b( y. N$ `6 V) i4 U, v
    i2c_delay(ops);
  ~% [9 h! i: s  l    SCL_L(ops);
7 W$ W, @0 F2 t- i7 G7 U  {; H}
- c4 W1 s: b" n! |* o9 C8 a) B5 o
( Z7 \4 g* N: l7 K8 U: Cint main(int argc, char* argv[])
1 _: Y3 Z: Z; }6 h{
2 T5 J/ g# Q0 Z/ y: T5 @        rt_i2c_bit_ops i2c_ops;
( B) [$ s* t" h6 y( k        i2c_ops.data = (void *)0x88;2 K" f# T5 d0 e- ~8 ^5 S- h# `
        i2c_ops.delay_us = 5;
! |5 @4 J- G  E! P' `        i2c_ops.udelay = udelay;5 P/ S3 F2 ]9 Y) \. h0 q
        i2c_ops.get_scl = i2c_get_scl;9 e0 o# L2 n, j6 o; ~  a0 |5 y
        i2c_ops.get_sda = i2c_get_sda;
3 V! N/ m; @4 J3 o4 L; P/ C& r0 d        i2c_ops.set_scl = i2c_set_scl;
, f) l9 l: r2 O% {% [# }0 i% V         i2c_ops.set_sda = i2c_set_sda;1 q2 z! ~- T* F* ~/ R) ~
+ a$ _' B  m0 e" i2 V+ v3 A

4 G, w8 b4 i" [; }+ `        printf("==========TEST===========!\n");
9 C1 j2 o- x1 f$ k6 M
1 t2 Z, }* N# Y+ I0 {' ~% X5 O        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。6 X; q, E: x$ e0 q, i
        i2c_restart(&i2c_ops);
% S( J( Q1 ~2 P        return 0;- J! n6 n) u* ~. A9 N* [
}
/ g% s2 l# E6 u7 j
/ y& F4 D0 i% Y7 d5 q. G; A/ T: t- E- A* E/ m- t
转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
发表于 2016-6-20 10:29 | 显示全部楼层
看不懂的东西,先记号,希望有一天能看懂
 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:29
1 Q& h/ v' s9 w看不懂的东西,先记号,希望有一天能看懂
8 J. ^* ~. B7 ?0 _5 v
这个不是很复杂,现在你也可以看得懂3 T* s3 V' y0 y& `
发表于 2016-6-20 11:34 | 显示全部楼层
看不懂的东西,先记号,希望有一天能看懂  绕来绕去  脑袋不够用  
发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下0 _( [* k" h- G1 Z0 Z0 q
发表于 2016-6-20 16:33 | 显示全部楼层

1 W# S" j; W7 O3 T
  ~" v& j: T2 L4 w( Y0 E3 i对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops
' O" S+ z' l  a* F+ R" _ {8 u, W8 y, U& X1 }: F$ Q2 h
4 e( f4 k; n$ j5 ~4 t
};8 D* @" A+ t9 S3 j; B' O7 e
这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义3 M, t" t4 W- R' K$ m# T
 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:33) D* E# J' ^" ?" c' f5 m4 V5 {
对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
' S* @1 a/ p- v  e' `+ o; a( q
如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了
  B3 Y# _1 K4 k: T2 C

本版积分规则

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

GMT+8, 2024-5-3 11:04 , Processed in 0.062745 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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