共用体封装C51端口

 C 语言中的匿名联合体和匿名结构体_EmbededCoder的博客-CSDN博客_匿名联合体

 EA:External Access

 ALE:Address Latch Enable

PSEN:Program Store Enable

CPL:Converse Position Logical

#include <iostream>
using namespace std;

union Port {
    struct {
        unsigned char bit0: 1;
        unsigned char bit1: 1;
        unsigned char bit2: 1;
        unsigned char bit3: 1;
        unsigned char bit4: 1;
        unsigned char bit5: 1;
        unsigned char bit6: 1;
        unsigned char bit7: 1;
    };
    unsigned char ch;
} P0;

int main()
{
    P0.bit0 = 1;
    P0.bit1 = 1;
    P0.bit2 = 1;
    P0.bit3 = 1;
    P0.bit4 = 1;
    P0.bit5 = 1;
    P0.bit6 = 1;
    P0.bit7 = 1;
    cout << int(P0.ch) << endl;
    return 0;
}

#include <iostream>
#include <bitset>
using namespace std;

union Port {
    struct {
        unsigned char bit0: 1;
        unsigned char bit1: 1;
        unsigned char bit2: 1;
        unsigned char bit3: 1;
        unsigned char bit4: 1;
        unsigned char bit5: 1;
        unsigned char bit6: 1;
        unsigned char bit7: 1;
    };
    unsigned char allBits;
};

union MCU {
    union Port P[4];
    unsigned int allPorts;
};

int main(int argc, char* argv[]) {

    MCU C51;
    C51.allPorts = 0x00000000;

    C51.P[0].bit0 = 1;
    C51.P[1].bit0 = 1;
    C51.P[2].bit0 = 1;
    C51.P[3].bit0 = 1;
    cout << bitset<32>(C51.allPorts) << endl;

    C51.P[0].allBits = 0xff;
    cout << bitset<32>(C51.allPorts) << endl;

    return 0;
}
#include <iostream>
#include <bitset>
using namespace std;

enum operation {
    pin_on = 1,
    pin_off = 0,
    port_on = 0xff,
    port_off = 0x00,
    all_port_on = 0xffffffff,
    all_port_off = 0x00000000
};

union Port {
    struct {
        unsigned char Pin0: 1;
        unsigned char Pin1: 1;
        unsigned char Pin2: 1;
        unsigned char Pin3: 1;
        unsigned char Pin4: 1;
        unsigned char Pin5: 1;
        unsigned char Pin6: 1;
        unsigned char Pin7: 1;
    };
    unsigned char allPins;
};

union CPU {
    struct{
        union Port Port0;
        union Port Port1;
        union Port Port2;
        union Port Port3;
    };
    unsigned int allPorts;
};

int main(int argc, char* argv[]) {

    CPU MCU_8051;

    MCU_8051.allPorts = all_port_off;
    MCU_8051.Port0.Pin0 = pin_on;
    MCU_8051.Port1.Pin1 = pin_on;
    MCU_8051.Port2.Pin2 = pin_on;
    MCU_8051.Port3.Pin3 = pin_on;
    cout << bitset<8>(MCU_8051.Port0.allPins) <<" "
         << bitset<8>(MCU_8051.Port1.allPins) <<" "
         << bitset<8>(MCU_8051.Port2.allPins) <<" "
         << bitset<8>(MCU_8051.Port3.allPins) << endl;

    MCU_8051.Port0.allPins = port_on;
    MCU_8051.Port1.allPins = port_off;
    MCU_8051.Port2.allPins = port_on;
    MCU_8051.Port3.allPins = port_off;
    cout << bitset<8>(MCU_8051.Port0.allPins) <<" "
         << bitset<8>(MCU_8051.Port1.allPins) <<" "
         << bitset<8>(MCU_8051.Port2.allPins) <<" "
         << bitset<8>(MCU_8051.Port3.allPins) << endl;

    MCU_8051.allPorts = all_port_on;
    cout << bitset<8>(MCU_8051.Port0.allPins) <<" "
         << bitset<8>(MCU_8051.Port1.allPins) <<" "
         << bitset<8>(MCU_8051.Port2.allPins) <<" "
         << bitset<8>(MCU_8051.Port3.allPins) << endl;
    return 0;
}

思考的最终代码 

#include <iostream>
#include <bitset>
using namespace std;

enum operation {
    pin_on = 1,
    pin_off = 0,
    port_on = 0xff,
    port_off = 0x00,
    all_port_on = 0xffffffff,
    all_port_off = 0x00000000
};

union CPU {//让所有引脚和Port复用一个32位内存空间
    struct{//P0,P1,P2,P3的内存空间
        union {//让P0的每个引脚和复用引脚,以及Port0复用一个8位内存空间
            struct {//P0的每一个引脚
                unsigned char Port0_0: 1;
                unsigned char Port0_1: 1;
                unsigned char Port0_2: 1;
                unsigned char Port0_3: 1;
                unsigned char Port0_4: 1;
                unsigned char Port0_5: 1;
                unsigned char Port0_6: 1;
                unsigned char Port0_7: 1;
            };
            struct {//P0的引脚复用,地址低8位
                unsigned char AD_0: 1;
                unsigned char AD_1: 1;
                unsigned char AD_2: 1;
                unsigned char AD_3: 1;
                unsigned char AD_4: 1;
                unsigned char AD_5: 1;
                unsigned char AD_6: 1;
                unsigned char AD_7: 1;
            };
            unsigned char Port0;//控制P0端口
        };

        union {
            struct {//P1的每一个引脚
                unsigned char Port1_0: 1;
                unsigned char Port1_1: 1;
                unsigned char Port1_2: 1;
                unsigned char Port1_3: 1;
                unsigned char Port1_4: 1;
                unsigned char Port1_5: 1;
                unsigned char Port1_6: 1;
                unsigned char Port1_7: 1;
            };
            unsigned char Port1;//控制P1端口
        };

        union {
            struct {//P2的每一个引脚
                unsigned char Port2_0: 1;
                unsigned char Port2_1: 1;
                unsigned char Port2_2: 1;
                unsigned char Port2_3: 1;
                unsigned char Port2_4: 1;
                unsigned char Port2_5: 1;
                unsigned char Port2_6: 1;
                unsigned char Port2_7: 1;
            };
            struct {//P2的引脚复用,地址高8位
                unsigned char AD_8: 1;
                unsigned char AD_9: 1;
                unsigned char AD_10: 1;
                unsigned char AD_11: 1;
                unsigned char AD_12: 1;
                unsigned char AD_13: 1;
                unsigned char AD_14: 1;
                unsigned char AD_15: 1;
            };
            unsigned char Port2;//控制P2端口
        };

        union {
            struct {//P3的每一个引脚
                unsigned char Port3_0: 1;
                unsigned char Port3_1: 1;
                unsigned char Port3_2: 1;
                unsigned char Port3_3: 1;
                unsigned char Port3_4: 1;
                unsigned char Port3_5: 1;
                unsigned char Port3_6: 1;
                unsigned char Port3_7: 1;
            };
            struct {//P3的引脚复用
                unsigned char RxD: 1;
                unsigned char TxD: 1;
                unsigned char INT0: 1;
                unsigned char INT1: 1;
                unsigned char T0: 1;
                unsigned char T1: 1;
                unsigned char WR: 1;
                unsigned char RD: 1;
            };
            unsigned char Port3;//控制P3端口
        };

    };
    unsigned int allPorts;//控制所有端口
};

int main(int argc, char* argv[]) {

    CPU MCU;
    MCU.allPorts = all_port_off;
    MCU.Port0_0 = pin_on;

    cout << bitset<8>(MCU.Port0) <<" "
         << bitset<8>(MCU.Port1) <<" "
         << bitset<8>(MCU.Port2) <<" "
         << bitset<8>(MCU.Port3) << endl;
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值