搜索
bottom↓
回复: 11

问下如何实现这种IO操作

[复制链接]

出0入4汤圆

发表于 2013-6-17 17:36:53 | 显示全部楼层 |阅读模式
****************IIC通信低层 **************************   
void I2C_IO_Init(void)
{        
        SetIoHi(bma_sda);
        SetIoHi(bma_scl);
        SetIoOut(bma_scl);
        SetIoOut(bma_sda);
}

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-6-17 18:11:14 | 显示全部楼层
应该是一些宏定义,自己看看资料就知道了

出20入22汤圆

发表于 2013-6-17 18:13:33 | 显示全部楼层
有人喜欢用这个样子的宏定义,说是好看

出70入0汤圆

发表于 2013-6-17 18:17:28 | 显示全部楼层
gyzzg2030 发表于 2013-6-17 18:13
有人喜欢用这个样子的宏定义,说是好看

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

出0入0汤圆

发表于 2013-6-17 18:20:33 | 显示全部楼层
如果这是51,宏定义使用sbit很好定义吧?

出0入0汤圆

发表于 2013-6-17 18:23:42 | 显示全部楼层
还像是定义SCL和SDA引脚的输入和输出吧

出0入4汤圆

 楼主| 发表于 2013-6-18 10:04:24 | 显示全部楼层
绿茶山人 发表于 2013-6-17 18:17
不仅仅是好看,函数需要入栈出栈,用宏可以节省一些时间。

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

出70入0汤圆

发表于 2013-6-18 10:32:44 | 显示全部楼层
huarana 发表于 2013-6-18 10:04
你好,能举个实例吗?  具体怎么定义的

这只是一个例子,没多少实际意义,比如你要用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是比较困难的。你可以看反汇编,就能看出用宏和函数的区别。
本人也不是什么高手,说得不好的还请见谅!

出0入4汤圆

 楼主| 发表于 2013-6-18 10:53:43 | 显示全部楼层
绿茶山人 发表于 2013-6-18 10:32
这只是一个例子,没多少实际意义,比如你要用100个nop用于时序延时,你可以写成宏和函数两种。
宏:
#def ...

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

出70入0汤圆

发表于 2013-6-18 11:07:58 | 显示全部楼层
huarana 发表于 2013-6-18 10:53
这个我能理解。其实我想知道的是 如我主楼说的那种,通过一个子函数来实现对不同IO口的拉高拉底或者其他 ...

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

出0入4汤圆

 楼主| 发表于 2013-6-18 13:16:06 | 显示全部楼层
绿茶山人 发表于 2013-6-18 11:07
其实在51中对于某个引脚输出高或者低封装成函数形式或者宏的形式还是有必要的。方便不同单片机平台的移植 ...

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

出0入0汤圆

发表于 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));
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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