huarana 发表于 2013-6-17 17:36:53

问下如何实现这种IO操作

****************IIC通信低层 **************************   
void I2C_IO_Init(void)
{        
        SetIoHi(bma_sda);
        SetIoHi(bma_scl);
        SetIoOut(bma_scl);
        SetIoOut(bma_sda);
}

这是在一个代码例子里看到的,但是例子应该不全,找不到SetIoHi();子函数或者声明啥的 。
bma_sda 和 bma_scl是映射到某个IO口的,想问下如何实现这样的操作。

苦行僧 发表于 2013-6-17 18:11:14

应该是一些宏定义,自己看看资料就知道了

gyzzg2030 发表于 2013-6-17 18:13:33

有人喜欢用这个样子的宏定义,说是好看

绿茶山人 发表于 2013-6-17 18:17:28

gyzzg2030 发表于 2013-6-17 18:13 static/image/common/back.gif
有人喜欢用这个样子的宏定义,说是好看

不仅仅是好看,函数需要入栈出栈,用宏可以节省一些时间。

kyughanum 发表于 2013-6-17 18:20:33

如果这是51,宏定义使用sbit很好定义吧?

WANG_JINLONG 发表于 2013-6-17 18:23:42

还像是定义SCL和SDA引脚的输入和输出吧

huarana 发表于 2013-6-18 10:04:24

绿茶山人 发表于 2013-6-17 18:17 static/image/common/back.gif
不仅仅是好看,函数需要入栈出栈,用宏可以节省一些时间。

你好,能举个实例吗?具体怎么定义的

绿茶山人 发表于 2013-6-18 10:32:44

huarana 发表于 2013-6-18 10:04 static/image/common/back.gif
你好,能举个实例吗?具体怎么定义的

这只是一个例子,没多少实际意义,比如你要用100个nop用于时序延时,你可以写成宏和函数两种。
宏:
#define 10NOP (_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();)
#define 100NOP (10NOP;10NOP;10NOP;10NOP;10NOP;10NOP;10NOP;10NOP;10NOP;10NOP;)

用的时候直接 100NOP;

函数:

void delay100nop(void){
       unsigned char i = 100;
       while(i--) _nop_();
}

用函数其实实际延时是大于100个nop的,你要得到精确的100个nop是比较困难的。你可以看反汇编,就能看出用宏和函数的区别。
本人也不是什么高手,说得不好的还请见谅!

huarana 发表于 2013-6-18 10:53:43

绿茶山人 发表于 2013-6-18 10:32 static/image/common/back.gif
这只是一个例子,没多少实际意义,比如你要用100个nop用于时序延时,你可以写成宏和函数两种。
宏:
#def ...

这个我能理解。其实我想知道的是 如我主楼说的那种,通过一个子函数来实现对不同IO口的拉高拉底或者其他配置。例如 SetIoHI(x) ,是一个将IO口x拉高的功能,这个x在后面函数里直接配给。其实这在51里面是没必要的,因为可以通过 p1^0=1 ,来实现。

绿茶山人 发表于 2013-6-18 11:07:58

huarana 发表于 2013-6-18 10:53 static/image/common/back.gif
这个我能理解。其实我想知道的是 如我主楼说的那种,通过一个子函数来实现对不同IO口的拉高拉底或者其他 ...

其实在51中对于某个引脚输出高或者低封装成函数形式或者宏的形式还是有必要的。方便不同单片机平台的移植,封装后只需要改最底层的实现,即使是51变种也太多了。

huarana 发表于 2013-6-18 13:16:06

绿茶山人 发表于 2013-6-18 11:07 static/image/common/back.gif
其实在51中对于某个引脚输出高或者低封装成函数形式或者宏的形式还是有必要的。方便不同单片机平台的移植 ...

恩,我很赞同这点。这样做的好处很明显,就是不同单片机的移植。但是一直没找到具体的这种用法的完整例程。所以具体操作有点疑惑,不知道如何来写那个宏或者子函数。

lcw_swust 发表于 2013-6-18 16:19:18

#define BIT(x)    (1<<(x))
#define IOSET(port,x)(port)|=(x)
#define SetIoHi(px) IOSET(px)
#define bma_sda P0,BIT(0)

SetIoHi(bma_sda);
或 IOSET(P0,BIT(0));
页: [1]
查看完整版本: 问下如何实现这种IO操作