一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3898|回复: 8

C语言封装技术

[复制链接]
发表于 2016-6-20 09:00 | 显示全部楼层 |阅读模式
0 P% e" C7 z0 {0 }; S
typedef signed int rt_int32_t;  [0 E6 S" _$ D2 Z
typedef unsigned int rt_uint32_t;8 s, P3 i1 [) g+ E

6 x& b  Y8 }' O& Estruct rt_i2c_bit_ops
! u. y: |( u# n& j4 Y" o1 o: ~5 \{
# L$ _+ l* F. Y% j* q    void *data;            /* private data for lowlevel routines */, {+ L# x  H/ D# C8 ]
    void (*set_sda)(void *data, rt_int32_t state);" X: o  Z" z6 y# b0 n8 Y! {5 n
    void (*set_scl)(void *data, rt_int32_t state);
! x0 E; U) g4 i* q% a2 N1 \    rt_int32_t (*get_sda)(void *data);% ^% T# I, o7 I( E; {
    rt_int32_t (*get_scl)(void *data);/ S8 j, }. u( v9 p. X+ e

% B  h" Y4 @5 ~8 N& R    void (*udelay)(rt_uint32_t us);" n6 Q, ]" Y9 P

5 k8 w; f4 y8 W' [( W9 _* J6 K    rt_uint32_t delay_us;  /* scl and sda line delay */) F  N5 F5 ]; R* H" Y
    rt_uint32_t timeout;   /* in tick */
4 j6 w8 N9 T) ]4 g( W" X% X};" P7 W! N6 t4 q, F

, ?6 A9 F; }4 U! J- l& o//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来
; P+ n* h% @0 ^9 s. t: O$ H#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)
5 ]& W$ f9 Z3 F* U8 }- z) @#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)
9 w* }' x/ w" N& ~2 `2 b#define GET_SDA(ops)        ops->get_sda(ops->data)+ [. Q  H/ ~2 D+ X& T6 _. j% e
#define GET_SCL(ops)        ops->get_scl(ops->data)
, z' z, w0 [! O/ T, ]' m9 ?//结构体功能函数的使用' T+ G( ]7 D; p: s9 X1 ?& @
#define SDA_L(ops)          SET_SDA(ops, 0)
* z6 e  t. _; {" |/ Q; @#define SDA_H(ops)          SET_SDA(ops, 1)
' Q: b$ B' h2 Q* `#define SCL_L(ops)          SET_SCL(ops, 0)
+ M2 G; ?& `; R. Z! K, D& }" g7 L. \
//提供对外使用
0 O7 X" m3 Y# W2 _5 f. |$ L; V, Xinline void i2c_delay(struct rt_i2c_bit_ops *ops)
6 j$ S5 V3 ?3 ^! F* {8 ?8 x{7 x8 {0 d' @5 Q
    ops->udelay((ops->delay_us + 1) >> 1);7 I2 g0 @" E/ A& C% x! D' v% Q
}
6 m0 [% ^9 F% b% C  n$ m0 n6 a  Z% k2 s0 v4 g3 J
inline void i2c_delay2(struct rt_i2c_bit_ops *ops)
0 b" g9 g; O* v: p' \& r{  P; N$ R6 V9 U3 _" y& o1 T9 r( j! D3 u
    ops->udelay(ops->delay_us);) R9 F1 p3 t4 K+ c: u5 I+ v
}* J7 ~; T6 K6 M$ |
//以下为rt_i2c_bit_ops指针函数5 @  {/ [3 ^+ d' d) [" M
void i2c_set_sda(void *data, rt_int32_t state)1 l2 V/ V1 l/ H: _) s0 X
{
; [. h  L: B1 q        if(state). \$ j  b, \! p1 A! X! v
        {7 j* l3 }# f$ ?+ q& S' w0 K: k8 ?
                printf("sda->H\r\n");
0 C. }; z# _" d0 Y5 i        }else
* ^. L# @- M) Y- N% Y8 Z: g+ ]+ a4 i        {
' ^9 u7 {( y3 B+ u+ N) M0 g                printf("sda->L\r\n");
+ w9 f0 a7 x; S9 a3 T        }
* ?; g* \9 r5 Q* v8 k}! Y6 w3 ]3 O' v5 q
void i2c_set_scl(void *data, rt_int32_t state)7 v: p8 s7 \8 f4 e
{4 a3 [* j: J0 V& k6 ~0 q
        if(state)" o4 G" d9 B6 W  M# d/ C+ U4 b
        {
, P2 h. a5 i+ D8 B& w1 j                printf("scl->H\r\n");
5 ?* {. q% m& W6 k        }else
3 `  j1 T. |; W) I        {
0 f* }1 n2 i, i% R. Y8 H) O4 S7 O% `  v. E                printf("scl->L\r\n");
# h8 V8 I" X. \3 ?0 p: k        }
3 F- D+ n" X! L}9 Z- A* H3 {1 `3 I
# o! l2 K2 D" Q% u9 X
rt_int32_t i2c_get_sda(void *data)
' T* F( E$ q! M- d{/ v+ ]  Z" M# v: U2 |/ i
        printf("sda return 1\r\n");# k7 i; J+ m; L
        return 1;1 H7 z1 O; k0 e1 L
}
- ?2 p. S* m% m: M& W( Z# U7 grt_int32_t i2c_get_scl(void *data)5 z. Y: i; @9 @
{
: _- t8 a" L9 o& t5 t: I% \        printf("scl return 1\r\n");: |. G( N9 K% m9 H, T
        return 1;
7 G; c* ^7 ]- P6 P  `% ?; }/ U2 V}7 {. {  T; c; ^& v: F5 s6 Y
void udelay(rt_uint32_t us)
$ q! _4 S1 S- \, f{
- F+ a' K$ V& k. \/ s* x; k        printf("udelay %d us\r\n",us);4 ?, u1 f$ s# ?- G* ~* {) ?
}: t5 d/ V/ g+ q& K: Z' [. k
//以上为rt_i2c_bit_ops指针函数5 C1 p# Y" L. ?- x* f- N# M
  D4 ]. X& Y' a, C+ C8 S
% a& T6 U( {0 f; a- t/ E
//模拟i2c的其他信号可以类似i2c_restart一样调用
' z) D6 N+ l1 G- n9 I! T# Pstatic void i2c_restart(struct rt_i2c_bit_ops *ops)+ A+ I% W4 M1 A: P; {( f
{
/ A/ [9 U8 r2 I/ _/ a    SDA_H(ops);
; u. t% t1 b; W8 M' c* o! _! s: o    i2c_delay(ops);
0 r# T% \% g8 T% s* [  \    SDA_L(ops);
4 ~( X1 P# R9 n1 M9 [+ U    i2c_delay(ops);
9 m9 j+ Y, i' n& M/ D    SCL_L(ops);
8 [+ j4 `7 z8 o+ g3 p2 N}. n! @! H/ h& O2 f- u

) M: K( d4 F, e# l  T$ Iint main(int argc, char* argv[])& ^& I$ b9 f5 _  X. V* x  P$ w: ]; W
{8 u5 W2 j- p4 u% @- j( A( f0 t
        rt_i2c_bit_ops i2c_ops;
) |- m( m+ D' d3 B        i2c_ops.data = (void *)0x88;
9 ]# \% e( Y. W        i2c_ops.delay_us = 5;
7 z) [. p7 ]# q" H! d/ h        i2c_ops.udelay = udelay;
/ H0 X( j1 `( g( {        i2c_ops.get_scl = i2c_get_scl;( Z# N$ n6 _! Y) X! W- e
        i2c_ops.get_sda = i2c_get_sda;! H* M, I0 l3 b
        i2c_ops.set_scl = i2c_set_scl;+ j8 `7 l' M; C6 H6 Z5 j
         i2c_ops.set_sda = i2c_set_sda;
! p: d+ F% B  S6 |4 t; w
  j* x& S8 E& d# d& Q7 B. r
  ~3 y/ g. y4 r        printf("==========TEST===========!\n");) l7 ^. O( z2 c! Z  W& t" k

  a) K+ l% O; q) l        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。- ^) F: v& o* @
        i2c_restart(&i2c_ops);6 J# W( [& r4 u" K) e& d3 M9 ]
        return 0;6 i( v9 K% ]# e5 N
}
( L1 s# k# S5 ]2 F- D! V
" a# z% B2 Q% z* u3 r& p! T+ n/ s9 X- C- ]5 E. [; c1 Q8 M8 ^
转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:29
% d, n& r3 a; L5 X: O8 `9 J# ^看不懂的东西,先记号,希望有一天能看懂
( m# y) A( v; S1 l% R
这个不是很复杂,现在你也可以看得懂
3 {& P* H+ S( v0 F( M1 s
回复

使用道具 举报

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

使用道具 举报

发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下# t$ s! j2 g' ^
回复

使用道具 举报

发表于 2016-6-20 16:33 | 显示全部楼层
1 E7 E; y2 X* X. g& h
+ [8 `/ g: ]5 G( e4 b" T' {
对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
回复

使用道具 举报

发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops
5 _5 {8 @  u1 {2 l' \! | {. s2 M6 l* i) Z
, r! x1 q/ I3 a- b: m5 ]  T
};
. ~7 o: |! S" H/ w这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义
- ]' P2 N1 {: n5 i" r
回复

使用道具 举报

 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:33
$ G# m. j" ^$ `* S$ U, e# ~: O$ n9 M对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的

1 T% K6 D2 G8 U, o1 X/ a) X) A/ ?如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了
1 g/ ~$ d1 {1 D% S' \! V' o6 E" T
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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