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

本文介绍了如何通过预定义宏来简化STC单片机端口配置,如LED和按键的推挽输出设置,以及自动计算初始状态,减少繁琐的初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

余额充值