我们给单片机编程时,如果给端口引脚定义的时候。一个LED灯接到P26口,我们需要将其设为推挽输出,其初始电平是0,如果只需像如下这样,是不是要方便很多呢?#define                P_Led0                P26#define                P26Mode                PP#define                P26Init                0 在写单片机程序时给端口定义是个很繁琐的事情。每次修改端口,或者改端口类型(输入还是输出)。都要算一次二进制。以STC单片机为例:通常给端口初始化都会有一个端口初始化程序,比如: ```c//        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的含义。即便如此,每次修改也是很麻烦。  如果改成这样可以能要好一些: ```c/*端口定义*///        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 这样就很方便了。如果能够把初始值也加上就完美了。好,上完整代码: ```c/*--------------*-----------------------------------------------------  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位单片机的朋友做过。..............转载请注明:东莞步控电子彭工.............