การใช้งานอินพุตและเอาต์พุต
     การใช้งานอินพุตและเอาต์พุตของไมโครคอนโทรลเลอร์ MCS-51 เราสามารถใช้งานขาใดก็ได้ให้่เป็นขาอินพุต
หรือเอาต์พุตแบบดิจิตอล หมายความว่า ถ้าให้ขานั้นเป็นอินพุต จะสามารถตรวจจับสัญญาณได้แค่ลอจิก 0 กับ 1
เท่านั่น และถ้าให้ขานั้นเป็นเอาต์พุต จะสามารถส่งเอาต์พุตได้แค่ลอจิก 0 กับ 1 เช่นกัน (ลอจิก 0 คือแรงดันไฟต่ำ
หรือประมาณ 0 โวลต์ ลอจิก 1 คือแรงดันไฟสูงหรือประมาณ 5 โวลต์)

     ในบทความนี้ ผมจะขอยกตัวอย่างการใช้งานไมโครคอนโทรลเลอร์ MCS-51 เบอร์ AT89C51 ขนาด 40 ขา มี
พอร์ตให้ใช้งานทั้งหมด 4 พอร์ต คือ พอร์ต 0 ถึงพอร์ต 3 นอกจากนี้พอร์ตบางพอร์ตยังสามารถทำหน้่าที่พิเศษอื่น
ได้ ซึ่งจะขอยกไปอธิบายในบทความถัดไปนะครับ
[กลับหน้าบทความ]
ตัวอย่างที่ 1 การใช้งานพอร์ตอินพุตและเอาต์พุต โดยการเข้าถึงพอร์ตระดับไบต์
     การอ่านอินพุตหรือสั่งเอาต์พุต เราสามารถจะอ่านทั้งพอร์ตหรือจะส่งข้อมูลออกทีเดียวทั้งพอร์ตเลยก็ได้ เป็นการ
เข้าถึงพอร์ตในระดับไบต์ จากตัวอย่างด้านล่างเป็นโปรแกรมอ่านค่าอินพุตทั้งพอร์ต 0 แล้วนำค่าที่อ่านได้ออกพอร์ต
1 แสดงผลผ่าน LED

#include <reg51.h>
#include <intrins.h>

void main (void)
{
     while(1){
          P1 = P0; // อ่านค่าจากพอร์ต P0 แล้วนำค่าที่อ่านได้ออกพอร์ต P1
     }
}

ตัวอย่างที่ 2 การใช้งานพอร์ตอินพุตและเอาต์พุต โดยการเข้าถึงระดับบิต
     การอ่านอินพุตและเอาต์พุต เราสามารถอ่านขาใดขาหนึ่งก็ได้ หรือจะส่งเอาต์พุตไปยังขาใดขาหนึ่งก็ได้เช่นกัน
ซึ่งเป็นการกระทำในระดับบิต จากตัวอย่างโปรแกรมด้านล่างการทำงานคือ จะอ่านสวิตซ์แต่ละตัว และแสดงออก LED เมื่อกดสวิตซ์ จะส่งลอจิก 0 และเมื่อปล่อยสวิตซ์จะส่งลอจิก 1 (ลอจิก 0 LED จะติด ลอจิก 1 LED จะดับ)

#include <reg51.h>
#include <intrins.h>

sbit SW1 = P0^0; // สวิตซ์ 1 ต่อเข้าที่ขา P0.0
sbit SW2 = P0^1; // สวิตซ์ 2 ต่อเข้าที่ขา P0.1
sbit SW3 = P0^2; // สวิตซ์ 3 ต่อเข้าที่ขา P0.2
sbit SW4 = P0^3; // สวิตซ์ 4 ต่อเข้าที่ขา P0.3

sbit LED1 = P1^0; // LED1 ต่อเข้าที่ขา P1.0
sbit LED2 = P1^1; // LED2 ต่อเข้าที่ขา P1.1
sbit LED3 = P1^2; // LED3 ต่อเข้าที่ขา P1.2
sbit LED4 = P1^3; // LED4 ต่อเข้าที่ขา P1.3

void main (void)
{
     while(1){

          if(SW1 == 0) { // ถ้า SW1 ถูกกดแรงดันที่อ่านได้จะเป็นลอจิก 0
               LED1 = 0; // ให้ขา LED1 ออกลอจิก 0
          }else{         // ถ้าไม่ใช่
               LED1 = 1; // ให้ขา LED1 ออกลอจิก 1
          }

          if(SW2 == 0) {
               LED2 = 0;
          }else{
               LED2 = 1;
          }

          if(SW3 == 0) {
               LED3 = 0;
          }else{
               LED3 = 1;
          }

          if(SW4 == 0) {
               LED4 = 0;
          }else{
               LED4 = 1;
          }

     }

}

รูป ตำแหน่งขาของ AT89C51