ถาม: สามารถแมปพินแต่ละพอร์ตของไมโครคอนโทรลเลอร์แต่ละตัวเข้ากับรีจิสเตอร์และเปลี่ยนค่าได้หรือไม่เมื่อเปลี่ยนค่ารีจิสเตอร์?
สถานการณ์สมมติ: ฉันใช้พินมากขึ้นจากแต่ละพอร์ต (8 บิต) ของไมโครคอนโทรลเลอร์ ตอนนี้ฉันต้องการเชื่อมต่ออุปกรณ์ที่ต้องการบัส 8 บิต (สมมติว่า D0 ถึง D7 IN SEQUENCE) กล่าวคือฉันต้องการ 8 พินจากคอนโทรลเลอร์เพื่อให้สามารถเชื่อมต่อได้ในแบบหนึ่งต่อหนึ่ง
portx0 -> D0 // x is the name of port followed by bit location on that port
portx1 -> D1
...
portx7 -> D7
แต่ฉันไม่มีพอร์ตทั้งหมด 8 พินซึ่งฉันสามารถเชื่อมต่อกับอุปกรณ์นี้ได้ แต่ฉันมีพินบางตัวจากพอร์ทเอ็กซ์บางตัวมาจากพอร์ทและบางพินจากพอร์ทซ สถานการณ์การเชื่อมต่อใหม่เป็น (การเชื่อมต่อจากไมโครคอนโทรลเลอร์ไปยังอุปกรณ์ตามลำดับ)
portx0 -> D0
portx1 -> D1
portx2 -> D2
porty4 -> D3
porty5 -> D4
porty6 -> D5
porty7 -> D6
portz1 -> D7
ในเงื่อนไขนี้ถ้าฉันต้องการส่งค่าว่า
unsigned char dataReg = 0xFA;
ไปยังอุปกรณ์ของฉันจากคอนโทรลเลอร์ฉันต้องทำการบิตที่ชาญฉลาดเกี่ยวกับค่าที่จะส่งและตั้งค่าแต่ละพินตามค่าในรีจิสเตอร์แต่ละตัว ตัวอย่างเช่น
portx0 = ((dataReg & 0x01) >> 0 ); // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );
ตอนนี้มาถึงคำถามหลักเพื่อหลีกเลี่ยงการคำนวณส่วนบุคคลเหล่านี้ในแต่ละบิตบนพอร์ตที่แตกต่างกันแต่ละพินของพอร์ตที่แตกต่างกันของไมโครคอนโทรลเลอร์สามารถแมปกับรีจิสเตอร์และค่าของมันจะเปลี่ยนไปเมื่อเปลี่ยนค่าลงทะเบียนหรือไม่