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位单片机的朋友做过。