一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 3504|回复: 8

C语言封装技术

[复制链接]
发表于 2016-6-20 09:00 | 显示全部楼层 |阅读模式
0 x4 H- V7 I! n4 Q  K
typedef signed int rt_int32_t;: M7 B) a3 |/ ]7 b, k  M
typedef unsigned int rt_uint32_t;) _( H5 F% {6 \( W, N

0 ^: ?/ m* i" ystruct rt_i2c_bit_ops; L* Q6 H, d; ]* v9 ]( ]
{  v# @2 t8 P5 |6 |, w
    void *data;            /* private data for lowlevel routines */
, f; d5 E" k5 `# o* O    void (*set_sda)(void *data, rt_int32_t state);
' W( j  R/ n1 i! y    void (*set_scl)(void *data, rt_int32_t state);% q" I: l6 l/ p0 H( w
    rt_int32_t (*get_sda)(void *data);
6 G, ^0 G& }- P6 E$ `: _    rt_int32_t (*get_scl)(void *data);
, Z  ~5 [* u: S+ C* w$ Y6 w9 ]7 }/ s2 M8 e2 g$ i* L
    void (*udelay)(rt_uint32_t us);
/ Z$ f% L) _$ h1 T# y2 n  ?* K4 A% C/ \0 F5 A
    rt_uint32_t delay_us;  /* scl and sda line delay */
/ g3 H3 Z+ g) _9 S: U, N6 @    rt_uint32_t timeout;   /* in tick */
5 h, i% J0 L+ q7 [- }7 W0 l2 J};2 L/ w" v* p% S* R

4 G. p. V, b  ~$ K0 [//结构体功能函数的使用 它的精妙之处在这里,用宏把结构体函数使用起来- x  a0 }0 t$ H4 _9 N( X" m
#define SET_SDA(ops, val)   ops->set_sda(ops->data, val)
+ l6 B0 e# a! A9 k#define SET_SCL(ops, val)   ops->set_scl(ops->data, val)9 p8 b# O3 Q/ }/ A9 j3 o: q. X
#define GET_SDA(ops)        ops->get_sda(ops->data)  u5 m  q0 Y" {* f3 R
#define GET_SCL(ops)        ops->get_scl(ops->data): t. e' T4 b) i( x: |* e& c
//结构体功能函数的使用  [8 P( L* H. W2 M6 Q+ y  W, P
#define SDA_L(ops)          SET_SDA(ops, 0)4 `5 Z  c3 y1 j
#define SDA_H(ops)          SET_SDA(ops, 1)
3 q# W/ c2 P( x$ Y# ~# @#define SCL_L(ops)          SET_SCL(ops, 0)7 p1 r. t$ J, p" X
/ f9 g$ z. X" P. ]/ X0 ^
//提供对外使用1 k9 v4 f2 {. ?+ ~0 S* p; `% b8 W) n' `# `
inline void i2c_delay(struct rt_i2c_bit_ops *ops)
1 @* W0 X1 G: y{
$ |% {  b- Z3 r    ops->udelay((ops->delay_us + 1) >> 1);
+ _0 B- P; W" p4 K4 a}, d4 y8 S" a$ I( q: ^
4 h& ]* U8 A/ O6 R& x0 m! b' y. W1 ]
inline void i2c_delay2(struct rt_i2c_bit_ops *ops)
* Y, ?. O- Z4 h{
! E. w6 A" \4 s0 i4 X    ops->udelay(ops->delay_us);# E$ [9 ~0 w. K) X
}
* P! E! c! D) P6 l% s/ S//以下为rt_i2c_bit_ops指针函数: Z' ~' b5 c1 U; g" s  L2 y# A8 M
void i2c_set_sda(void *data, rt_int32_t state)) q, K+ N) _( \
{
$ O3 O2 R9 s2 ?% H6 P' e        if(state)
1 y) s; C/ r% o0 P0 N" Z. Q        {
; e6 i3 E3 g; P& K/ a+ c                printf("sda->H\r\n");
3 H3 H. T: _5 J5 e! O6 `: n        }else
. T3 ]2 n3 Q- E0 I        {9 t$ r2 M7 ?/ ^& v  _
                printf("sda->L\r\n");
3 d$ e6 F) A! x9 K, S9 J7 L1 L9 [        }
7 I2 \/ B7 t7 V3 b4 q& f}  s3 y' g! @: s; m
void i2c_set_scl(void *data, rt_int32_t state)+ a, g- t2 t- v& Z
{. n; D+ ]7 t' O# k/ B
        if(state)
+ @0 z$ P5 [% z( u. M% B) H8 F! i        {
8 q4 J0 }2 p# A0 T: F9 V                printf("scl->H\r\n");
( q' b5 h/ y0 r: T3 B: G        }else
( y$ }+ _1 R% Q3 V        {
4 a* n  S9 z: F+ B+ K                printf("scl->L\r\n");
0 d, `, P6 O. \! H% x        }
2 t" L# F+ f3 k* f}- g3 o) X: o  a# ]

4 z4 m7 R& Y% u2 rrt_int32_t i2c_get_sda(void *data); {1 v$ v+ \# z5 w. L
{
( h3 O  u& N1 @8 d        printf("sda return 1\r\n");2 g# R1 e' `+ G; Q' t  S) |
        return 1;
3 W2 V* r7 ~) P4 L* }6 y: H}
+ n: H& B7 e: O# d1 ort_int32_t i2c_get_scl(void *data)1 N( f) q5 X/ ]1 [" ^
{
0 C8 v2 W. X5 H! ]' w% y6 A        printf("scl return 1\r\n");' f$ }) ^4 N/ @: G
        return 1;$ @$ r& q4 V" b9 K0 \/ p9 Y
}  O, ~6 Y. a9 t% l* j& E
void udelay(rt_uint32_t us)5 C" P6 S1 G7 x) h9 y; R
{
* H6 h! {, i4 n8 [3 W        printf("udelay %d us\r\n",us);- f" w, B3 V9 e! ?8 j, @9 J
}: d% U1 a; q# X9 B; }+ O# u; k; O
//以上为rt_i2c_bit_ops指针函数6 M! ~, b, @8 i; D# [3 ~* N9 @' @

) v- `, {# c* z2 f: L
  e- K3 Z4 h1 z//模拟i2c的其他信号可以类似i2c_restart一样调用6 U* y# P; C3 {  Y# S3 L: F* m
static void i2c_restart(struct rt_i2c_bit_ops *ops)
' Z" Q, B3 [- p{9 D% J7 G; U5 w; l
    SDA_H(ops);+ O( i1 H' L0 H: y, A) r2 m
    i2c_delay(ops);# M* {' d4 `% v" i
    SDA_L(ops);
  q# e3 q" \. q# W! }    i2c_delay(ops);
" u! v# L2 n. B1 y5 T    SCL_L(ops);) K  M5 p( [1 L: j
}; J6 ]5 m% i. k

% D/ t/ \3 D3 s2 ^5 q6 W# ]4 a  rint main(int argc, char* argv[])
. ]" _: B/ h7 {' q9 _6 ~{
0 `7 c* V* W0 p        rt_i2c_bit_ops i2c_ops;% R1 L4 |; B% j: c( p  z
        i2c_ops.data = (void *)0x88;
2 d6 ~2 W% c6 ^& Z        i2c_ops.delay_us = 5;
/ l8 L) S7 U3 F) E        i2c_ops.udelay = udelay;9 _3 ?$ O/ B7 @9 B, m6 f7 I0 D; J4 u
        i2c_ops.get_scl = i2c_get_scl;
+ f6 s; L2 g: I4 F" m( p        i2c_ops.get_sda = i2c_get_sda;; P3 a2 H( X( ]; e0 j- O& O4 P
        i2c_ops.set_scl = i2c_set_scl;
1 N+ {& h- y- \1 B+ v/ D& Q         i2c_ops.set_sda = i2c_set_sda;! a- A2 E( _. ]3 V4 v0 o2 H

2 }; s4 B, Z: Y: T+ L
0 i0 F" ]- v4 f5 _! U- Q8 j5 `        printf("==========TEST===========!\n");
! v; P( L3 H- @2 ~7 d
8 ?. }2 A. L9 `4 g# K, C" Y0 ~        以上设置完专门的i2c接口后,类似与i2c_restart这样的i2c发送和接收的业务逻辑函数基本上不用修改了,直接按不同的i2c接口传参即可完成i2c的功能。
+ W# _1 X9 |# M6 C  L        i2c_restart(&i2c_ops);7 M$ w4 Q  X. T$ Q/ \- ?- z. V
        return 0;& ]# o: u/ @. @/ ?. y7 D8 G
}
  z2 P2 {/ ]# l- H' q$ O% ?! Z. Y3 z) n$ S& K

: k7 V) a  `# h! _9 y' F/ \- u/ f% V转载别人的作为备份
 楼主| 发表于 2016-6-20 09:05 | 显示全部楼层
这个果然有意思,学了一大招。
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2016-6-20 10:48 | 显示全部楼层
duanyz 发表于 2016-6-20 10:29
+ N5 _) z; j# T+ t! r) k/ r! _看不懂的东西,先记号,希望有一天能看懂

  X! e( F* O+ g" Y这个不是很复杂,现在你也可以看得懂3 ]: w% V; o- o4 J* P
回复

使用道具 举报

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

使用道具 举报

发表于 2016-6-20 13:01 | 显示全部楼层
学习,记号一下9 ]" r$ Q9 A2 k( Q" n! f- H
回复

使用道具 举报

发表于 2016-6-20 16:33 | 显示全部楼层
3 J3 w7 U9 C& L% u$ a, X

  p! z" c1 R; w9 t对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的
回复

使用道具 举报

发表于 2016-6-20 22:47 | 显示全部楼层
struct rt_i2c_bit_ops6 |+ g1 H3 O4 a6 f$ }% {+ W8 X
{
+ A9 N2 t0 `! T) R3 ^
6 F' r+ @3 W. U" D3 J };/ u& d5 W; p% H; e' ^) T4 D
这种结构体声明的时候需要占用ram,然后通过修改结构体的变量,很方便修改定义
0 d, R, Q  z, Q- V% k  J
回复

使用道具 举报

 楼主| 发表于 2016-6-20 22:51 | 显示全部楼层
devcang 发表于 2016-6-20 16:33
- K/ m1 t$ c/ l" N% P对于单片机,不喜欢这样,,,,,,,单片机的语句、语法,就喜欢简单、直接的

3 f& V: g3 t+ a. s& h2 y  y& ?如果你写比较简单的程序当然没问题,一但复杂的就要想其它办法来解决了- s: P4 u* p' g$ Q
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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