我们给单片机编程时,如果给端口引脚定义的时候。一个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位单片机的朋友做过。..............转载请注明:东莞步控电子彭工.............