Để đọc hiểu dễ dàng bài viết này, bạn nên tham khảo qua bài viết Bitwise operation and bitmask

Ưu điểm khi lập trình trực tiếp IO thông qua thanh ghi

Các thư viện và build-in function của Arduino được viết để tương thích với nhiều dòng vi điều khiển khác nhau giúp người dùng phổ thông dễ dàng tiếp cận, tuy nhiên để làm được như vậy thì các hàm viết sẵn này phải xử lý nhiều công đoạn, làm giảm tốc độ xử lý và thiếu linh hoạt.

Việc truy cập/lập trình trực tiếp thanh ghi vi điều khiển giúp giảm thời gian xử lý trong một số trường hợp và linh hoạt hơn khi viết code trong khi vẫn tận dụng được trình biên dịch Arduino IDE.

Các thanh ghi IO trên AVR

Thanh ghi Data Direction (DDRx)

Thanh ghi Data Direction (DDRx) là thanh ghi 8 bits quy định IO tương ứng là ngõ ra (1) hoặc ngõ vào (0). Khi IO là ngõ vào thì bit tương ứng trên thanh ghi PORTx quy định ngõ vào đó là INPUT floating để gắn điện trở treo ngoại hoặc INPUT_PULLUP có điện trở nội kéo lên.

Ví dụ set Pin 4 (PD4) là ngõ ra

void setup() {
   	pinMode(4,OUTPUT);
}
        
void setup(){
    DDRD = DDRD|B00010000;
}
        

Ví dụ set Pin 4 (PD4) là ngõ ra có điện trở kéo lên

void setup() {
   	pinMode(4,OUTPUT_PULLUP);
}
        
void setup(){
    DDRD = DDRD|B00010000;
	PORTD = PORTD|B00010000;
}
        

Thanh ghi Port Data (PORTx)

Trạng thái ngõ ra được ghi vào bit tương ứng trên thanh ghi Port Data (PORTx). Ở chế độ ngõ ra, bit tương ứng trên thanh ghi này cho phép điện trở treo nội.

void setup(){                       
    pinMode(4,OUTPUT);
}
void loop(){
    digitalWrite(4, HIGH);
}
        
void setup(){
    DDRD = DDRD|B00010000;
}
void loop(){
    PORTD = PORTD|B00010000;
}
        

Thanh ghi Port Input Pins (PINx)

Trạng thái ngõ vào được đọc từ thanh ghi Port Inputs Pin (PINx)

void setup(){
	pinMode(8, INPUT);
}
void loop(){
	byte read_b = digitalRead(8);
}
        
void setup(){
	DDRB = DDRB&B11111110;
}
void loop(){
	byte read_b = PINB&B00000001;
}
        

~~~ Updating…