티스토리 뷰

입문

LED 제어 5

Just4Fun 2016. 3. 5. 21:11

이번에는 앞에서 작성했던 코드를 매크로를 이용하여 좀더 깔끔하게 수정해 보도록 하겠다.

앞에서 어떤 레지스터에 값을 쓰기 위하여 포인터를 사용했는데 다음과 같은 코드를 사용하였다.

*(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))

 

입문 과정 목차

'입문' 카테고리의 다른 글

LED 제어 7  (13) 2016.03.05
LED 제어 6  (1) 2016.03.05
LED 제어 4  (12) 2016.03.02
LED 제어 3  (7) 2016.02.28
LED 제어 2  (8) 2016.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함