打印

大家看看,我这样是不是好笨啊,有没有简单办法啊?

[复制链接]
1994|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nin124|  楼主 | 2008-5-27 00:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//LPC900单片机IO模式设置宏定义
//eg:将P0_7设置成推挽输出模式:SetIOMode_P07_TW();

#ifndef SETIOMODE_H_H
#define SETIOMODE_H_H

//********************* 双向模式 ************************************
#define SetIOMode_P00_SX() P0M1 &= 0xfe;P0M2 &= 0xfe
#define SetIOMode_P01_SX() P0M1 &= 0xfd;P0M2 &= 0xfd
#define SetIOMode_P02_SX() P0M1 &= 0xfb;P0M2 &= 0xfb
#define SetIOMode_P03_SX() P0M1 &= 0xf7;P0M2 &= 0xf7
#define SetIOMode_P04_SX() P0M1 &= 0xef;P0M2 &= 0xef
#define SetIOMode_P05_SX() P0M1 &= 0xdf;P0M2 &= 0xdf
#define SetIOMode_P06_SX() P0M1 &= 0xbf;P0M2 &= 0xbf
#define SetIOMode_P07_SX() P0M1 &= 0x7f;P0M2 &= 0x7f

#define SetIOMode_P10_SX() P1M1 &= 0xfe;P1M2 &= 0xfe
#define SetIOMode_P11_SX() P1M1 &= 0xfd;P1M2 &= 0xfd
#define SetIOMode_P12_SX() P1M1 &= 0xfb;P1M2 &= 0xfb
#define SetIOMode_P13_SX() P1M1 &= 0xf7;P1M2 &= 0xf7
#define SetIOMode_P14_SX() P1M1 &= 0xef;P1M2 &= 0xef
#define SetIOMode_P15_SX() P1M1 &= 0xdf;P1M2 &= 0xdf
#define SetIOMode_P16_SX() P1M1 &= 0xbf;P1M2 &= 0xbf
#define SetIOMode_P17_SX() P1M1 &= 0x7f;P1M2 &= 0x7f

#define SetIOMode_P20_SX() P2M1 &= 0xfe;P2M2 &= 0xfe
#define SetIOMode_P21_SX() P2M1 &= 0xfd;P2M2 &= 0xfd
#define SetIOMode_P22_SX() P2M1 &= 0xfb;P2M2 &= 0xfb
#define SetIOMode_P23_SX() P2M1 &= 0xf7;P2M2 &= 0xf7
#define SetIOMode_P24_SX() P2M1 &= 0xef;P2M2 &= 0xef
#define SetIOMode_P25_SX() P2M1 &= 0xdf;P2M2 &= 0xdf
#define SetIOMode_P26_SX() P2M1 &= 0xbf;P2M2 &= 0xbf
#define SetIOMode_P27_SX() P2M1 &= 0x7f;P2M2 &= 0x7f

#define SetIOMode_P30_SX() P3M1 &= 0xfe;P3M2 &= 0xfe
#define SetIOMode_P31_SX() P3M1 &= 0xfd;P3M2 &= 0xfd
#define SetIOMode_P32_SX() P3M1 &= 0xfb;P3M2 &= 0xfb
#define SetIOMode_P33_SX() P3M1 &= 0xf7;P3M2 &= 0xf7
#define SetIOMode_P34_SX() P3M1 &= 0xef;P3M2 &= 0xef
#define SetIOMode_P35_SX() P3M1 &= 0xdf;P3M2 &= 0xdf
#define SetIOMode_P36_SX() P3M1 &= 0xbf;P3M2 &= 0xbf
#define SetIOMode_P37_SX() P3M1 &= 0x7f;P3M2 &= 0x7f
//*****************************************************************


//******************** 推挽模式 ***********************************
#define SetIOMode_P00_TW() P0M1 &= 0xfe;P0M2 |= 0x01
#define SetIOMode_P01_TW() P0M1 &= 0xfd;P0M2 |= 0x02
#define SetIOMode_P02_TW() P0M1 &= 0xfb;P0M2 |= 0x04
#define SetIOMode_P03_TW() P0M1 &= 0xf7;P0M2 |= 0x08
#define SetIOMode_P04_TW() P0M1 &= 0xef;P0M2 |= 0x10
#define SetIOMode_P05_TW() P0M1 &= 0xdf;P0M2 |= 0x20
#define SetIOMode_P06_TW() P0M1 &= 0xbf;P0M2 |= 0x40
#define SetIOMode_P07_TW() P0M1 &= 0x7f;P0M2 |= 0x80

#define SetIOMode_P10_TW() P1M1 &= 0xfe;P1M2 |= 0x01
#define SetIOMode_P11_TW() P1M1 &= 0xfd;P1M2 |= 0x02
#define SetIOMode_P12_TW() P1M1 &= 0xfb;P1M2 |= 0x04
#define SetIOMode_P13_TW() P1M1 &= 0xf7;P1M2 |= 0x08
#define SetIOMode_P14_TW() P1M1 &= 0xef;P1M2 |= 0x10
#define SetIOMode_P15_TW() P1M1 &= 0xdf;P1M2 |= 0x20
#define SetIOMode_P16_TW() P1M1 &= 0xbf;P1M2 |= 0x40
#define SetIOMode_P17_TW() P1M1 &= 0x7f;P1M2 |= 0x80

#define SetIOMode_P20_TW() P2M1 &= 0xfe;P2M2 |= 0x01
#define SetIOMode_P21_TW() P2M1 &= 0xfd;P2M2 |= 0x02
#define SetIOMode_P22_TW() P2M1 &= 0xfb;P2M2 |= 0x04
#define SetIOMode_P23_TW() P2M1 &= 0xf7;P2M2 |= 0x08
#define SetIOMode_P24_TW() P2M1 &= 0xef;P2M2 |= 0x10
#define SetIOMode_P25_TW() P2M1 &= 0xdf;P2M2 |= 0x20
#define SetIOMode_P26_TW() P2M1 &= 0xbf;P2M2 |= 0x40
#define SetIOMode_P27_TW() P2M1 &= 0x7f;P2M2 |= 0x80

#define SetIOMode_P30_TW() P3M1 &= 0xfe;P3M2 |= 0x01
#define SetIOMode_P31_TW() P3M1 &= 0xfd;P3M2 |= 0x02
#define SetIOMode_P32_TW() P3M1 &= 0xfb;P3M2 |= 0x04
#define SetIOMode_P33_TW() P3M1 &= 0xf7;P3M2 |= 0x08
#define SetIOMode_P34_TW() P3M1 &= 0xef;P3M2 |= 0x10
#define SetIOMode_P35_TW() P3M1 &= 0xdf;P3M2 |= 0x20
#define SetIOMode_P36_TW() P3M1 &= 0xbf;P3M2 |= 0x40
#define SetIOMode_P37_TW() P3M1 &= 0x7f;P3M2 |= 0x80
//****************************************************************


//******************* 输入模式 ***********************************
#define SetIOMode_P00_SR() P0M1 |= 0x01;P0M2 &= 0xfe
#define SetIOMode_P01_SR() P0M1 |= 0x02;P0M2 &= 0xfd
#define SetIOMode_P02_SR() P0M1 |= 0x04;P0M2 &= 0xfb
#define SetIOMode_P03_SR() P0M1 |= 0x08;P0M2 &= 0xf7
#define SetIOMode_P04_SR() P0M1 |= 0x10;P0M2 &= 0xef
#define SetIOMode_P05_SR() P0M1 |= 0x20;P0M2 &= 0xdf
#define SetIOMode_P06_SR() P0M1 |= 0x40;P0M2 &= 0xbf
#define SetIOMode_P07_SR() P0M1 |= 0x80;P0M2 &= 0x7f

#define SetIOMode_P10_SR() P1M1 |= 0x01;P1M2 &= 0xfe
#define SetIOMode_P11_SR() P1M1 |= 0x02;P1M2 &= 0xfd
#define SetIOMode_P12_SR() P1M1 |= 0x04;P1M2 &= 0xfb
#define SetIOMode_P13_SR() P1M1 |= 0x08;P1M2 &= 0xf7
#define SetIOMode_P14_SR() P1M1 |= 0x10;P1M2 &= 0xef
#define SetIOMode_P15_SR() P1M1 |= 0x20;P1M2 &= 0xdf
#define SetIOMode_P16_SR() P1M1 |= 0x40;P1M2 &= 0xbf
#define SetIOMode_P17_SR() P1M1 |= 0x80;P1M2 &= 0x7f

#define SetIOMode_P20_SR() P2M1 |= 0x01;P2M2 &= 0xfe
#define SetIOMode_P21_SR() P2M1 |= 0x02;P2M2 &= 0xfd
#define SetIOMode_P22_SR() P2M1 |= 0x04;P2M2 &= 0xfb
#define SetIOMode_P23_SR() P2M1 |= 0x08;P2M2 &= 0xf7
#define SetIOMode_P24_SR() P2M1 |= 0x10;P2M2 &= 0xef
#define SetIOMode_P25_SR() P2M1 |= 0x20;P2M2 &= 0xdf
#define SetIOMode_P26_SR() P2M1 |= 0x40;P2M2 &= 0xbf
#define SetIOMode_P27_SR() P2M1 |= 0x80;P2M2 &= 0x7f

#define SetIOMode_P30_SR() P3M1 |= 0x01;P3M2 &= 0xfe
#define SetIOMode_P31_SR() P3M1 |= 0x02;P3M2 &= 0xfd
#define SetIOMode_P32_SR() P3M1 |= 0x04;P3M2 &= 0xfb
#define SetIOMode_P33_SR() P3M1 |= 0x08;P3M2 &= 0xf7
#define SetIOMode_P34_SR() P3M1 |= 0x10;P3M2 &= 0xef
#define SetIOMode_P35_SR() P3M1 |= 0x20;P3M2 &= 0xdf
#define SetIOMode_P36_SR() P3M1 |= 0x40;P3M2 &= 0xbf
#define SetIOMode_P37_SR() P3M1 |= 0x80;P3M2 &= 0x7f
//*************************************************************


//*********************** 开漏模式 ****************************
#define SetIOMode_P00_KL() P0M1 |= 0x01;P0M2 |= 0x01
#define SetIOMode_P01_KL() P0M1 |= 0x02;P0M2 |= 0x02
#define SetIOMode_P02_KL() P0M1 |= 0x04;P0M2 |= 0x04
#define SetIOMode_P03_KL() P0M1 |= 0x08;P0M2 |= 0x08
#define SetIOMode_P04_KL() P0M1 |= 0x10;P0M2 |= 0x10
#define SetIOMode_P05_KL() P0M1 |= 0x20;P0M2 |= 0x20
#define SetIOMode_P06_KL() P0M1 |= 0x40;P0M2 |= 0x40
#define SetIOMode_P07_KL() P0M1 |= 0x80;P0M2 |= 0x80

#define SetIOMode_P10_KL() P1M1 |= 0x01;P1M2 |= 0x01
#define SetIOMode_P11_KL() P1M1 |= 0x02;P1M2 |= 0x02
#define SetIOMode_P12_KL() P1M1 |= 0x04;P1M2 |= 0x04
#define SetIOMode_P13_KL() P1M1 |= 0x08;P1M2 |= 0x08
#define SetIOMode_P14_KL() P1M1 |= 0x10;P1M2 |= 0x10
#define SetIOMode_P15_KL() P1M1 |= 0x20;P1M2 |= 0x20
#define SetIOMode_P16_KL() P1M1 |= 0x40;P1M2 |= 0x40
#define SetIOMode_P17_KL() P1M1 |= 0x80;P1M2 |= 0x80

#define SetIOMode_P20_KL() P2M1 |= 0x01;P2M2 |= 0x01
#define SetIOMode_P21_KL() P2M1 |= 0x02;P2M2 |= 0x02
#define SetIOMode_P22_KL() P2M1 |= 0x04;P2M2 |= 0x04
#define SetIOMode_P23_KL() P2M1 |= 0x08;P2M2 |= 0x08
#define SetIOMode_P24_KL() P2M1 |= 0x10;P2M2 |= 0x10
#define SetIOMode_P25_KL() P2M1 |= 0x20;P2M2 |= 0x20
#define SetIOMode_P26_KL() P2M1 |= 0x40;P2M2 |= 0x40
#define SetIOMode_P27_KL() P2M1 |= 0x80;P2M2 |= 0x80

#define SetIOMode_P30_KL() P3M1 |= 0x01;P3M2 |= 0x01
#define SetIOMode_P31_KL() P3M1 |= 0x02;P3M2 |= 0x02
#define SetIOMode_P32_KL() P3M1 |= 0x04;P3M2 |= 0x04
#define SetIOMode_P33_KL() P3M1 |= 0x08;P3M2 |= 0x08
#define SetIOMode_P34_KL() P3M1 |= 0x10;P3M2 |= 0x10
#define SetIOMode_P35_KL() P3M1 |= 0x20;P3M2 |= 0x20
#define SetIOMode_P36_KL() P3M1 |= 0x40;P3M2 |= 0x40
#define SetIOMode_P37_KL() P3M1 |= 0x80;P3M2 |= 0x80
//************************************************************

#endif







相关帖子

沙发
ayb_ice| | 2008-5-27 09:02 | 只看该作者

多句宏定义要加括号

使用特权

评论回复
板凳
农民讲习所| | 2008-5-27 09:56 | 只看该作者

用带参数的宏

enum PORT{
  eP00,
  eP01,
  eP02,
  eP03,
  eP04,
  eP05,
  eP06,
  eP07,
};

#define SetIOMode_P00_SX() P0M1 &= 0xfe;P0M2 &= 0xfe
改为:

#define SetIOMode_SX(x)   do{ P0M1 &= ~(1<<x);P0M2 &= ~(1<<x);}while(0)

SetIOMode_SX( eP00 );

使用特权

评论回复
地板
原野之狼| | 2008-5-27 11:41 | 只看该作者

带参数宏是个不错的方法。。。

使用特权

评论回复
5
nin124|  楼主 | 2008-5-27 13:52 | 只看该作者

谢谢所长

为什么写成do{ P0M1 &= ~(1<<x);P0M2 &= ~(1<<x);}while(0)啊
P0M1 &= ~(1<<x);P0M2 &= ~(1<<x)不行吗?

使用特权

评论回复
6
ayb_ice| | 2008-5-27 14:03 | 只看该作者

多句宏定义要加大括号

#define SetIOMode(p,b)  
{                       
    p##M1 &= (0xFF-1<<b); 
    p##M2 &= (0xFF-1<<b); 
}

//----------------------------------
// 将P01设为IO口
    SetIOMode(P0,1)

使用特权

评论回复
7
ayb_ice| | 2008-5-27 14:58 | 只看该作者

随便说说

#define sP0 0
#define sP1 1
#define sP2 2

#define SetIOMode(p,b)       
{                            
  if(p == sP0){              
    P0M1 &= (0xFF - 1<<b);   
    P0M2 &= (0xFF - 1<<b);   
  }                          
                             
  if(p == sP1){              
    P1M1 &= (0xFF - 1<<b);   
    P1M2 &= (0xFF - 1<<b);   
  }                          
                             
  if(p == sP0){              
    P2M1 &= (0xFF - 1<<b);   
    P2M2 &= (0xFF - 1<<b);   
  }                          
}

//----------------------------------
// 将P01设为IO口
    SetIOMode(sP0,1)
    SetIOMode(sP1,4)
    SetIOMode(sP2,6)

使用特权

评论回复
8
nin124|  楼主 | 2008-5-27 16:21 | 只看该作者

谢谢ayb_ice啊,不加括号好像也可以啊,我试了的.

最上面的那种没有加括号,但是编译运行是正确的啊,查看编译出来的汇编代码也是正确的.好像不用加括号也可以啊.

也有人这样写,把两条语句中间的分号换成了逗号:
比如,#define SetIOMode_P00_SX() P0M1 &= 0xfe,P0M2 &= 0xfe






使用特权

评论回复
9
walnutcy| | 2008-5-27 20:52 | 只看该作者

加不加括号是防错能力的问题,出了错得找半天,呵呵,



使用特权

评论回复
10
ayb_ice| | 2008-5-27 20:53 | 只看该作者

加括号是最安全的做法

没有出错不代表不会出错。

使用特权

评论回复
11
nin124|  楼主 | 2008-6-3 02:04 | 只看该作者

终于明白了!

所长和ayb_ice都是正确的.

今天在网上不小心看到的**,正好讲了这个问题.

所长的do{}while(0),ayb_ice的加大括号,还有用逗号分开都是正确的.

宏定义多条语句,如果不用上面三种方法的话,在和if一起使用的时候可能会出问题.

好像高手话都说一半的样子哦!!!还好俺运气好,哈哈.

使用特权

评论回复
12
simon21ic| | 2008-6-3 06:28 | 只看该作者

宏有很多需要注意的地方

do{}while(0)接口在有些时候会费一些代码空间,因为宏只是替代,如果调用的地方比较多的话,设置成函数调用比较节约空间

to 7楼的宏:
建议给p和b都加上(),以防复杂的表达式,由于优先级的关系而"乱搞"

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

275

帖子

1

粉丝