





LED.h, LED.c 헤더파일에 각각 함수와 변수 선언, 함수 정의를 해주었다. 이러면 코드의 가독성이 좋아지면서 여러 사람들과의 협업을 하기에도 좋다. 또한 다른 프로그램에서 같은 동작을 시키려 할 때 헤더파일만 전처리기에서 추가해주면 헤더파일에서 정의한 변수, 함수를 사용할 수 있다.DDRC를 ledInit() 함수를 이용해 출력으로 설정! 이 후 PORTC를 uint8_t ledData = 0x01;로 선언하여 main.c함수에서 ledData의 포인터를 ledLeftShift() 함수의 매개변수로 선언한다. 이러면 ledData의 주소의 값을 쉬프트하여 마치 PORTC 연결된 LED에 불빛이 들어옵니다. 이를 for문으로 반복하여 마치 LED가 왼쪽으로 갔다가 오른쪽으로 가는 반복되는 동작을 수행합니다.


*(led->port - 1) |= (1 << led->pinNumber); *(led->port -1)를 이용해서 PORT에서 DDR로 접근.(데이터시트 참조) >> 다음과 같이 하면 DDR레지스터로 접근해 pinNumber에 해당하는 포트의 핀을 출력으로 설정하는 것이다.main.c에 선언한 LED_S타입의 변수는 LED.h에 선언한 구조체이다. typedef로 선언한 구조체는 사진처럼 끝에 내가 사용할 구조체 타입을 재정의 해주어 struct를 입력하지 않아도 구조체를 사용할 수 있다!volatile 은? >> 메모리와관련된 변수를 연산이나 동작을 수행할 때 최적화를 진행하지 않고 꼭 확인하고 컴파일을 할 수 있게합니다.main.c 를 보면 LED_S m_led라고 선언한 구조체의 멤버들에게 각각 PORTC의 주소와 핀번호를 할당했습니다. 그리고 ledInit() 함수를 사용해 PORTC에서 내가 출력하고 싶은 핀번호를 출력으로 설정합니다. 이 후 ledON(&m_led),ledOFF(&m_led) 함수를 이용해 LED_S 구조체의 주소값을 매개변수로 받아 실행을 시킵니다. 그리고 LED.c에서 *(led->port) 는 매개변수로 받은 구조체 변수 led 의 port의 값에 접근하는 코드입니다. 한마디로 해당 주소의 값과 비트연산을 진행한다는 의미! 이렇게 되면 ledON()을 하면 해당 핀에 연결된 LED가 점등되고 딜레이 시간이 흐른 뒤 ledOFF()가 해당 핀의 LED가 소등됩니다.