C 语言中的匿名联合体和匿名结构体_EmbededCoder的博客-CSDN博客_匿名联合体
EA:External Access
ALE:Address Latch Enable
#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;
}