单片机IO端口定义-STC单片机IO端口属性,IO端口初始值,快捷定义

STC单片机端口定义

我们给单片机编程时,如果给端口引脚定义的时候。一个LED灯接到P26口,我们需要将其设为推挽输出,其初始电平是0,如果只需像如下这样,是不是要方便很多呢?
#define P_Led0 P26
#define P26Mode PP
#define P26Init 0

在写单片机程序时给端口定义是个很繁琐的事情。每次修改端口,或者改端口类型(输入还是输出)。都要算一次二进制。以STC单片机为例:
通常给端口初始化都会有一个端口初始化程序,比如:

//	M1   M0
//	0    0        准双向
//  0    1        推挽输出
//  1    0        高阻输入
//  1    1        开漏输出(断开内部上拉)
void Port_Init(void)    
{                       
  P1=0xFF;				
  P2=0x00;              
  P3=0x9F;              
  P4=0xE1;              
  P7=0x0F;   
  
  P1M0 = 0x3C;           
  P1M1 = 0x3C;            
  P2M0 = 0xFF;            
  P2M1 = 0x00;            
  P0M0 = 0x00;            
  P0M1 = 0x00;            
  P3M0 = 0x60;            
  P3M1 = 0x00;            
  P4M0 = 0x1E;            
  P4M1 = 0x00;            
  P5M0 = 0x00;            
  P5M1 = 0x00;            
  P6M0 = 0x00;            
  P6M1 = 0x00;            
  P7M0 = 0xF0;            
  P7M1 = 0x00;            
}

为了防止忘记,所以会在上面注释好,M0,M1的含义。即便如此,每次修改也是很麻烦。

如果改成这样可以能要好一些:

/*端口定义*/
//	M1   M0
//	0    0        准双向									PU		(Pull-up)
//  0    1        推挽输出								PP		(Push–pull Output)
//  1    0        高阻输入								IF    (IN_FLOATING)
//  1    1        开漏输出(断开内部上拉)	OD		(Open-Drain)
#define PU				0x00
#define PP				0x01
#define IF				0x02
#define OD				0x03


#define 	P27Mode     PU

#define		P_Led0		P26
#define		P26Mode		PP

#define 	P25Mode		PU
#define 	P24Mode		PU
#define 	P23Mode		PU
#define 	P22Mode		PU
#define 	P21Mode		PU
#define 	P20Mode		PU

#define	P2M0Value	((P27Mode&0x01)<<7)+((P26Mode&0x01)<<6)+((P25Mode&0x01)<<5)+((P24Mode&0x01)<<4)+((P23Mode&0x01)<<3)+((P22Mode&0x01)<<2)+((P21Mode&0x01)<<1)+((P20Mode&0x01))
#define	P2M1Value	((P27Mode&0x02)<<6)+((P26Mode&0x02)<<5)+((P25Mode&0x02)<<4)+((P24Mode&0x02)<<3)+((P23Mode&0x02)<<2)+((P22Mode&0x02)<<1)+((P21Mode&0x02))+((P20Mode&0x02)>>1)

void Port_Init(void)    
{                       			
  P2=0xFF;              
           
  P2M0 = P2M0Value;            
  P2M1 = P2M1Value;                  
}

如果要把P26由推挽(PP)改为准双向的话,那么只要把
#define P26Mode PP
改为:
#define P26Mode PU

这样就很方便了。
如果能够把初始值也加上就完美了。好,上完整代码:

/*--------------*-----------------------------------------------------
  Project   :

  Name      :

  Discription   :
	1.把此文件包含进主文件,比如:
	#include "Usr_Host_PortDef.h"
	2.在主程序建立端口初始化程序,如下:
	void Port_Init(void)			
	{		
		P0=P0InitValue;							  
		P1=P1InitValue;							
		P2=P2InitValue;              
		P3=P3InitValue;              
		P4=P4InitValue;              
		P5=P5InitValue;               
		P6=P6InitValue;							
		P7=P7InitValue;              
		
		P0M1 = P0M1Value;          
		P0M0 = P0M0Value;          
		P1M1 = P1M1Value;          
		P1M0 = P1M0Value;          
		P2M1 = P2M1Value;           
		P2M0 = P2M0Value;          
		P3M1 = P3M1Value;          
		P3M0 = P3M0Value;          
		
		P4M1 = P4M1Value;          
		P4M0 = P4M0Value;          
		
		P5M1 = P5M1Value;          
		P5M0 = P5M0Value;              
		P6M1 = P6M1Value;          
		P6M0 = P6M0Value;            
		P7M1 = P7M1Value;          
		P7M0 = P7M0Value;            
	}
	3.在main程序的开始处调用上面的端口初始化程序,不用举例了吧。
	
	4.修改本文件的用户定义部分,比如定义一个LED端口,对应P26,将此端口设为推挽,初始值为0。那么:
	#define		P_Led0		P26
	#define		P26Mode		PU
	#define		P26Init		0
	
	如果不定义,默认为准双向,输出为1(高电平)

  Revision  :
--------------*-----------------------------------------------------*/



/*端口定义*/
//	M1   M0
//	0    0        准双向									PU		(Pull-up)
//  0    1        推挽输出								PP		(Push–pull Output)
//  1    0        高阻输入								IF    (IN_FLOATING)
//  1    1        开漏输出(断开内部上拉)	OD		(Open-Drain)
#define PU				0x00
#define PP				0x01
#define IF				0x02
#define OD				0x03
/***************************************************************************************************
用户定义
***************************************************************************************************/
#define		P_Uart1Rx	P30
#define		P30Mode		PU

#define		P_Uart1Tx	P31
#define		P31Mode		PU

#define		P_Led0		P26
#define		P26Mode		PP
#define		P26Init		0

#define		P_Key0	  P53
#define		P53Mode		PU

/***************************************************************************************************
自动计算
***************************************************************************************************/
#ifndef P00Mode
#define		P00Mode		PU
#endif
#ifndef P01Mode
#define		P01Mode		PU
#endif
#ifndef P02Mode
#define		P02Mode		PU
#endif
#ifndef P03Mode
#define		P03Mode		PU
#endif
#ifndef P04Mode
#define		P04Mode		PU
#endif
#ifndef P05Mode
#define		P05Mode		PU
#endif
#ifndef P06Mode
#define		P06Mode		PU
#endif
#ifndef P07Mode
#define		P07Mode		PU
#endif

#define	P0M0Value	((P07Mode&0x01)<<7)+((P06Mode&0x01)<<6)+((P05Mode&0x01)<<5)+((P04Mode&0x01)<<4)+((P03Mode&0x01)<<3)+((P02Mode&0x01)<<2)+((P01Mode&0x01)<<1)+((P00Mode&0x01))
#define	P0M1Value	((P07Mode&0x02)<<6)+((P06Mode&0x02)<<5)+((P05Mode&0x02)<<4)+((P04Mode&0x02)<<3)+((P03Mode&0x02)<<2)+((P02Mode&0x02)<<1)+((P01Mode&0x02))+((P00Mode&0x02)>>1)

#ifndef P10Mode
#define		P10Mode		PU
#endif
#ifndef P11Mode
#define		P11Mode		PU
#endif
#ifndef P12Mode
#define		P12Mode		PU
#endif
#ifndef P13Mode
#define		P13Mode		PU
#endif
#ifndef P14Mode
#define		P14Mode		PU
#endif
#ifndef P15Mode
#define		P15Mode		PU
#endif
#ifndef P16Mode
#define		P16Mode		PU
#endif
#ifndef P17Mode
#define		P17Mode		PU
#endif

#define	P1M0Value	((P17Mode&0x01)<<7)+((P16Mode&0x01)<<6)+((P15Mode&0x01)<<5)+((P14Mode&0x01)<<4)+((P13Mode&0x01)<<3)+((P12Mode&0x01)<<2)+((P11Mode&0x01)<<1)+((P10Mode&0x01))
#define	P1M1Value	((P17Mode&0x02)<<6)+((P16Mode&0x02)<<5)+((P15Mode&0x02)<<4)+((P14Mode&0x02)<<3)+((P13Mode&0x02)<<2)+((P12Mode&0x02)<<1)+((P11Mode&0x02))+((P10Mode&0x02)>>1)


#ifndef P20Mode
#define		P20Mode		PU
#endif
#ifndef P21Mode
#define		P21Mode		PU
#endif
#ifndef P22Mode
#define		P22Mode		PU
#endif
#ifndef P23Mode
#define		P23Mode		PU
#endif
#ifndef P24Mode
#define		P24Mode		PU
#endif
#ifndef P25Mode
#define		P25Mode		PU
#endif
#ifndef P26Mode
#define		P26Mode		PU
#endif
#ifndef P27Mode
#define		P27Mode		PU
#endif

#define	P2M0Value	((P27Mode&0x01)<<7)+((P26Mode&0x01)<<6)+((P25Mode&0x01)<<5)+((P24Mode&0x01)<<4)+((P23Mode&0x01)<<3)+((P22Mode&0x01)<<2)+((P21Mode&0x01)<<1)+((P20Mode&0x01))
#define	P2M1Value	((P27Mode&0x02)<<6)+((P26Mode&0x02)<<5)+((P25Mode&0x02)<<4)+((P24Mode&0x02)<<3)+((P23Mode&0x02)<<2)+((P22Mode&0x02)<<1)+((P21Mode&0x02))+((P20Mode&0x02)>>1)


#ifndef P30Mode
#define		P30Mode		PU
#endif
#ifndef P31Mode
#define		P31Mode		PU
#endif
#ifndef P32Mode
#define		P32Mode		PU
#endif
#ifndef P33Mode
#define		P33Mode		PU
#endif
#ifndef P34Mode
#define		P34Mode		PU
#endif
#ifndef P35Mode
#define		P35Mode		PU
#endif
#ifndef P36Mode
#define		P36Mode		PU
#endif
#ifndef P37Mode
#define		P37Mode		PU
#endif

#define	P3M0Value	((P37Mode&0x01)<<7)+((P36Mode&0x01)<<6)+((P35Mode&0x01)<<5)+((P34Mode&0x01)<<4)+((P33Mode&0x01)<<3)+((P32Mode&0x01)<<2)+((P31Mode&0x01)<<1)+((P30Mode&0x01))
#define	P3M1Value	((P37Mode&0x02)<<6)+((P36Mode&0x02)<<5)+((P35Mode&0x02)<<4)+((P34Mode&0x02)<<3)+((P33Mode&0x02)<<2)+((P32Mode&0x02)<<1)+((P31Mode&0x02))+((P30Mode&0x02)>>1)


#ifndef P40Mode
#define		P40Mode		PU
#endif
#ifndef P41Mode
#define		P41Mode		PU
#endif
#ifndef P42Mode
#define		P42Mode		PU
#endif
#ifndef P43Mode
#define		P43Mode		PU
#endif
#ifndef P44Mode
#define		P44Mode		PU
#endif
#ifndef P45Mode
#define		P45Mode		PU
#endif
#ifndef P46Mode
#define		P46Mode		PU
#endif
#ifndef P47Mode
#define		P47Mode		PU
#endif

#define	P4M0Value	((P47Mode&0x01)<<7)+((P46Mode&0x01)<<6)+((P45Mode&0x01)<<5)+((P44Mode&0x01)<<4)+((P43Mode&0x01)<<3)+((P42Mode&0x01)<<2)+((P41Mode&0x01)<<1)+((P40Mode&0x01))
#define	P4M1Value	((P47Mode&0x02)<<6)+((P46Mode&0x02)<<5)+((P45Mode&0x02)<<4)+((P44Mode&0x02)<<3)+((P43Mode&0x02)<<2)+((P42Mode&0x02)<<1)+((P41Mode&0x02))+((P40Mode&0x02)>>1)

#ifndef P50Mode
#define		P50Mode		PU
#endif
#ifndef P51Mode
#define		P51Mode		PU
#endif
#ifndef P52Mode
#define		P52Mode		PU
#endif
#ifndef P53Mode
#define		P53Mode		PU
#endif
#ifndef P54Mode
#define		P54Mode		PU
#endif
#ifndef P55Mode
#define		P55Mode		PU
#endif
#ifndef P56Mode
#define		P56Mode		PU
#endif
#ifndef P57Mode
#define		P57Mode		PU
#endif

#define	P5M0Value	((P57Mode&0x01)<<7)+((P56Mode&0x01)<<6)+((P55Mode&0x01)<<5)+((P54Mode&0x01)<<4)+((P53Mode&0x01)<<3)+((P52Mode&0x01)<<2)+((P51Mode&0x01)<<1)+((P50Mode&0x01))
#define	P5M1Value	((P57Mode&0x02)<<6)+((P56Mode&0x02)<<5)+((P55Mode&0x02)<<4)+((P54Mode&0x02)<<3)+((P53Mode&0x02)<<2)+((P52Mode&0x02)<<1)+((P51Mode&0x02))+((P50Mode&0x02)>>1)


#ifndef P60Mode
#define		P60Mode		PU
#endif
#ifndef P61Mode
#define		P61Mode		PU
#endif
#ifndef P62Mode
#define		P62Mode		PU
#endif
#ifndef P63Mode
#define		P63Mode		PU
#endif
#ifndef P64Mode
#define		P64Mode		PU
#endif
#ifndef P65Mode
#define		P65Mode		PU
#endif
#ifndef P66Mode
#define		P66Mode		PU
#endif
#ifndef P67Mode
#define		P67Mode		PU
#endif

#define	P6M0Value	((P67Mode&0x01)<<7)+((P66Mode&0x01)<<6)+((P65Mode&0x01)<<5)+((P64Mode&0x01)<<4)+((P63Mode&0x01)<<3)+((P62Mode&0x01)<<2)+((P61Mode&0x01)<<1)+((P60Mode&0x01))
#define	P6M1Value	((P67Mode&0x02)<<6)+((P66Mode&0x02)<<5)+((P65Mode&0x02)<<4)+((P64Mode&0x02)<<3)+((P63Mode&0x02)<<2)+((P62Mode&0x02)<<1)+((P61Mode&0x02))+((P60Mode&0x02)>>1)

#ifndef P70Mode
#define		P70Mode		PU
#endif
#ifndef P71Mode
#define		P71Mode		PU
#endif
#ifndef P72Mode
#define		P72Mode		PU
#endif
#ifndef P73Mode
#define		P73Mode		PU
#endif
#ifndef P74Mode
#define		P74Mode		PU
#endif
#ifndef P75Mode
#define		P75Mode		PU
#endif
#ifndef P76Mode
#define		P76Mode		PU
#endif
#ifndef P77Mode
#define		P77Mode		PU
#endif

#define	P7M0Value	((P77Mode&0x01)<<7)+((P76Mode&0x01)<<6)+((P75Mode&0x01)<<5)+((P74Mode&0x01)<<4)+((P73Mode&0x01)<<3)+((P72Mode&0x01)<<2)+((P71Mode&0x01)<<1)+((P70Mode&0x01))
#define	P7M1Value	((P77Mode&0x02)<<6)+((P76Mode&0x02)<<5)+((P75Mode&0x02)<<4)+((P74Mode&0x02)<<3)+((P73Mode&0x02)<<2)+((P72Mode&0x02)<<1)+((P71Mode&0x02))+((P70Mode&0x02)>>1)


#ifndef P00Init
#define	P00Init		1
#endif
#ifndef P01Init
#define	P01Init		1
#endif
#ifndef P02Init
#define	P02Init		1
#endif
#ifndef P03Init
#define	P03Init		1
#endif
#ifndef P04Init
#define	P04Init		1
#endif
#ifndef P05Init
#define	P05Init		1
#endif
#ifndef P06Init
#define	P06Init		1
#endif
#ifndef P07Init
#define	P07Init		1
#endif
#define	P0InitValue	((P07Init&0x01)<<7)+((P06Init&0x01)<<6)+((P05Init&0x01)<<5)+((P04Init&0x01)<<4)+((P03Init&0x01)<<3)+((P02Init&0x01)<<2)+((P01Init&0x01)<<1)+((P00Init&0x01))



#ifndef P10Init
#define	P10Init		1
#endif
#ifndef P11Init
#define	P11Init		1
#endif
#ifndef P12Init
#define	P12Init		1
#endif
#ifndef P13Init
#define	P13Init		1
#endif
#ifndef P14Init
#define	P14Init		1
#endif
#ifndef P15Init
#define	P15Init		1
#endif
#ifndef P16Init
#define	P16Init		1
#endif
#ifndef P17Init
#define	P17Init		1
#endif
#define	P1InitValue	((P17Init&0x01)<<7)+((P16Init&0x01)<<6)+((P15Init&0x01)<<5)+((P14Init&0x01)<<4)+((P13Init&0x01)<<3)+((P12Init&0x01)<<2)+((P11Init&0x01)<<1)+((P10Init&0x01))

#ifndef P20Init
#define	P20Init		1
#endif
#ifndef P21Init
#define	P21Init		1
#endif
#ifndef P22Init
#define	P22Init		1
#endif
#ifndef P23Init
#define	P23Init		1
#endif
#ifndef P24Init
#define	P24Init		1
#endif
#ifndef P25Init
#define	P25Init		1
#endif
#ifndef P26Init
#define	P26Init		1
#endif
#ifndef P27Init
#define	P27Init		1
#endif
#define	P2InitValue	((P27Init&0x01)<<7)+((P26Init&0x01)<<6)+((P25Init&0x01)<<5)+((P24Init&0x01)<<4)+((P23Init&0x01)<<3)+((P22Init&0x01)<<2)+((P21Init&0x01)<<1)+((P20Init&0x01))

#ifndef P30Init
#define	P30Init		1
#endif
#ifndef P31Init
#define	P31Init		1
#endif
#ifndef P32Init
#define	P32Init		1
#endif
#ifndef P33Init
#define	P33Init		1
#endif
#ifndef P34Init
#define	P34Init		1
#endif
#ifndef P35Init
#define	P35Init		1
#endif
#ifndef P36Init
#define	P36Init		1
#endif
#ifndef P37Init
#define	P37Init		1
#endif
#define	P3InitValue	((P37Init&0x01)<<7)+((P36Init&0x01)<<6)+((P35Init&0x01)<<5)+((P34Init&0x01)<<4)+((P33Init&0x01)<<3)+((P32Init&0x01)<<2)+((P31Init&0x01)<<1)+((P30Init&0x01))

#ifndef P40Init
#define	P40Init		1
#endif
#ifndef P41Init
#define	P41Init		1
#endif
#ifndef P42Init
#define	P42Init		1
#endif
#ifndef P43Init
#define	P43Init		1
#endif
#ifndef P44Init
#define	P44Init		1
#endif
#ifndef P45Init
#define	P45Init		1
#endif
#ifndef P46Init
#define	P46Init		1
#endif
#ifndef P47Init
#define	P47Init		1
#endif
#define	P4InitValue	((P47Init&0x01)<<7)+((P46Init&0x01)<<6)+((P45Init&0x01)<<5)+((P44Init&0x01)<<4)+((P43Init&0x01)<<3)+((P42Init&0x01)<<2)+((P41Init&0x01)<<1)+((P40Init&0x01))

#ifndef P50Init
#define	P50Init		1
#endif
#ifndef P51Init
#define	P51Init		1
#endif
#ifndef P52Init
#define	P52Init		1
#endif
#ifndef P53Init
#define	P53Init		1
#endif
#ifndef P54Init
#define	P54Init		1
#endif
#ifndef P55Init
#define	P55Init		1
#endif
#ifndef P56Init
#define	P56Init		1
#endif
#ifndef P57Init
#define	P57Init		1
#endif
#define	P5InitValue	((P57Init&0x01)<<7)+((P56Init&0x01)<<6)+((P55Init&0x01)<<5)+((P54Init&0x01)<<4)+((P53Init&0x01)<<3)+((P52Init&0x01)<<2)+((P51Init&0x01)<<1)+((P50Init&0x01))

#ifndef P60Init
#define	P60Init		1
#endif
#ifndef P61Init
#define	P61Init		1
#endif
#ifndef P62Init
#define	P62Init		1
#endif
#ifndef P63Init
#define	P63Init		1
#endif
#ifndef P64Init
#define	P64Init		1
#endif
#ifndef P65Init
#define	P65Init		1
#endif
#ifndef P66Init
#define	P66Init		1
#endif
#ifndef P67Init
#define	P67Init		1
#endif
#define	P6InitValue	((P67Init&0x01)<<7)+((P66Init&0x01)<<6)+((P65Init&0x01)<<5)+((P64Init&0x01)<<4)+((P63Init&0x01)<<3)+((P62Init&0x01)<<2)+((P61Init&0x01)<<1)+((P60Init&0x01))

#ifndef P70Init
#define	P70Init		1
#endif
#ifndef P71Init
#define	P71Init		1
#endif
#ifndef P72Init
#define	P72Init		1
#endif
#ifndef P73Init
#define	P73Init		1
#endif
#ifndef P74Init
#define	P74Init		1
#endif
#ifndef P75Init
#define	P75Init		1
#endif
#ifndef P76Init
#define	P76Init		1
#endif
#ifndef P77Init
#define	P77Init		1
#endif
#define	P7InitValue	((P77Init&0x01)<<7)+((P76Init&0x01)<<6)+((P75Init&0x01)<<5)+((P74Init&0x01)<<4)+((P73Init&0x01)<<3)+((P72Init&0x01)<<2)+((P71Init&0x01)<<1)+((P70Init&0x01))

在以上的代码里:

#define P_Uart1Rx P30
#define P30Mode PU

#define P_Uart1Tx P31
#define P31Mode PU

#define P_Led0 P26
#define P26Mode PP
#define P26Init 0

#define P_Key0 P53
#define P53Mode PU

以上代码:定义了:
串口接收,到P30,准双向
串口发送,到P31,准双向

LED ,到P26,推挽输出。
按键,P53,准双向

这样,以后对端口进行定义修改的时候,只需要对想要的端口进行定义即可。不定义的端口会自动默认为准双向,输出1(高电平)。

当然,STC单片机只有做个例子而已。如果你看懂其中原理,也可用在其他单片机的编程。
我以前也给一个做8位单片机的朋友做过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值