데이터의 입출력을 위해 PORTx(x=A, ..., G) 레지스터를 사용하는데 이 PORT 레지스터는 8개의 핀으로 이루어져 있다. 왜 8개의 핀을 묶어서 PORT로 관리하는지가 중요하다. CPU가 데이터를 처리할 땐 워드 단위로 처리하는데 워드는 바이트의 정수배이다. 32-bit 컴퓨터는 4bytes, 64-bit 컴퓨터는 8bytes가 1 워드이고, 수업에서 사용한 Atmega128은 1byte가 CPU가 처리할 수 있는 데이터의 최소 단위이다. 정리하면 데이터의 입출력은 1bit 크기로 핀을 통해서 이루어지고 이 핀이 8개가 모여 1byte를 이루는 이유는 Atmega128가 처리하는 데이터의 최소 단위가 1byte이기 때문이다.
DDRx(x=A, ..., G) 레지스터는 데이터의 입출력 방향을 결정하는 레지스터이다. DDRxn 비트를 1로 설정하면 PORTx의 n번 핀을 출력하겠다는 의미이고, 0으로 설정하면 데이터를 입력받겠다는 의미이다. 다만 이는 데이터를 입력받거나 출력하겠다고 방향만 설정하는 것뿐, 실제로 데이터를 출력하여 LED를 켜는 행위를 하려면 DDRxn 비트가 1인 상태에서 PORTx의 n번 핀을 1로 설정해야지만 데이터가 출력되어 LED가 켜지게 된다.
버튼의 양쪽에 VCC와 마이크로컨트롤러의 범용 입출력(GPIO) 핀을 연결하여 버튼을 누르면 VCC를 통해 1이, 버튼을 누르지 않으면 0이 가해지도록 설정한다. 버튼을 누르면 1이 가해지지만, 버튼을 누르지 않으면 GPIO 핀에는 어떤 값이 가해질 수 있는지 알 수 없다. 버튼을 누르지 않으면 GPIO 핀이 아무 회로와 연결되지 않은, 즉 개방(open)된 상태가 되는데 이를 플로팅(floating) 상태라고 한다. 이러한 상태에서는 주위 환경에 영향을 받아 우리가 예상하지 못한 임의의 값이 가해져 마치 버튼을 누르지 않아도 누른것과 같은 결과를 얻을 수 있기 때문에 이러한 플로팅 상태를 제거해야 한다.
버튼을 누르지 않으면 GPIO 핀에 VCC가 가해진다. 풀업 저항으로 LED 회로를 구성하면 버튼을 누르지 않아도 LED에 불이 들어오고 버튼을 누르면 불이 꺼진다. 저항은 스위치가 개방된 상태에서 GPIO 핀에 가해지는 값이 VCC가 되도록 끌어올리는 역할을 하기 때문에 이를 pull up(끌어올리다) 저항이라고 한다.
버튼을 누르지 않으면 GPIO 핀에는 저항을 통해 GND가 가해진다. 그리고 버튼을 누르는 순간 GPIO 핀에는 VCC가 가해진다. 풀다운 저항으로 LED 회로를 구성하면 버튼을 눌러야 불이 켜지고, 버튼을 누르지 않으면 불이 꺼진다. 저항은 스위치가 개방된 상태에서 GPIO 핀에 가해지는 값이 GND가 되도록 끌어내리는 역할을 하기 때문에 이를 pull down(끌어내리다) 저항이라고 한다.