티스토리 뷰
이번에는 앞에서 작성했던 코드를 매크로를 이용하여 좀더 깔끔하게 수정해 보도록 하겠다.
앞에서 어떤 레지스터에 값을 쓰기 위하여 포인터를 사용했는데 다음과 같은 코드를 사용하였다.
*(unsigned char*)DDRB = (GREEN_LED|RED_LED);
위의 코드를 매크로를 사용하면 다음과 같이 수정할 수 있다.
#define write8(addr, val) (*(volatile unsigned char *)(addr) = (val))
전체 코드를 위의 매크로를 이용하여 정리하면 다음과 같은 모양으로 나온다. 훨씬 깔끔하게 보일 것이다.
#define F_CPU 1000000
//#include <avr/io.h>
#include <util/delay.h>
#define IO_REG_OFFSET 0x20
#define PINB (IO_REG_OFFSET+3)
#define DDRB (IO_REG_OFFSET+4)
#define PORTB (IO_REG_OFFSET+5)
#define GREEN_LED 0x01
#define RED_LED 0x02
#define write8(addr, val) (*(volatile unsigned char *)(addr) = (val))
int main(void)
{
write8(DDRB, (GREEN_LED|RED_LED));
write8(PORTB, (GREEN_LED|RED_LED));
while (1)
{
_delay_ms(500);
write8(PINB, (GREEN_LED|RED_LED));
}
}
write8은 1바이트 데이터를 원하는 주소에 기록하는 매크로이다. 만약 2바이트, 4바이트 데이터를 특정 주소에 쓰기 위한 매크로는 다음과 같이 만들면 된다.
#define write8(addr, val) (*(volatile unsigned char *)(addr) = (val))
#define write16(addr, val) (*(volatile unsigned short *)(addr) = (val))
#define write32(addr, val) (*(volatile unsigned int *)(addr) = (val))
댓글