2016. 3. 7. 00:17 avr 기초

atmega led switch

안녕하세요 쭌지 입니다.

오늘은 avr로 스위치 명령을 줘서 led를 켜보도록 하겠습니다.






기본 led회로도와 스위치 회로도 입니다.

이렇게 보드를 만들어주세요(핀이 달라지면 소스도 달라져야 하니 참고 하세요)


먼저 헤더파일이 필요합니다.

delay.h(딜레이) >   delay.h



#include <avr/io.h>



void delay_us(unsigned char time_us)

{

register unsigned char i;

for(i = 0; i< time_us; i++)

{

asm volatile("PUSH R0");

asm volatile("POP R0");

asm volatile("PUSH R0");

asm volatile("POP R0");

asm volatile("PUSH R0");

asm volatile("POP R0");

}

}


void delay_ms(unsigned int time_ms)

{

register unsigned int i;

for(i = 0; i < time_ms; i++)

{

delay_us(250);

delay_us(250);

delay_us(250);

delay_us(250);

}

}

설명은 링크를 참고해주세요

delay.h 헤더파일 소스 설명



led.h>>>

delay.h




#include <avr/io.h>


#define LED1_ON 0b00001110; //양극 방식으로 해놓았기에 0을 주면 켜진다 

#define LED1_OFF 0b0001111;

#define LED2_ON 0b00001101;

#define LED2_OFF 0b00001111;

#define LED3_ON 0b00001011;

#define LED3_OFF 0b00001111;

#define LED4_ON 0b00000111;

#define LED4_OFF 0b00001111;

#define LED_ON 0b00000000;

#define LED_OFF 0b00001111;


//양극방식(anode) : vcc를 인가함
//음극방식(cathode) : gnd로 연결



key.h>> 

key.h



#define key_1 0b01110000

#define key_2 0b01101000

#define key_3 0b01011000

#define key_4 0b00111000



헤더파일이 준비 되었다면 

이제 소스를 짜봅시다


기본 함수






#include <avr/io.h>



int main(void)

{

   DDRB=0x0f; //led 연결포트를 출력으로 사용

   DDRD=0x00; //스위치 연결포트를 입력으로사용

    while (1) 

    {

PORTB= PIND>>3; //PORTD(스위치) 입력을 PORTB (led)사용

    }                             // >>3(shift: 이동명령) :port를 3만큼내리다.

                                 // 즉, PORTD 3~6을 PORTB 0~3 으로 바꿈 

return 1;   

}



led 유지



#include <avr/io.h>

#include "./../../header/key.h"

#include "./../../header/led.h"


int main(void)

{

    unsigned char key=0x00; //key를 초기화 시켜준다

DDRB=0x0f;

DDRD=0x00;

PORTB= 0x0f;

    while (1) 

    {

key=(PIND & 0x78); //key가 연결된 PORT와 0x78=0b00111100 를 비트엔드 한다.

if(key==key_1) {PORTB= LED1_ON;} // key= key_1= 0b01110000

else if(key==key_2) {PORTB= LED2_ON;}

else if(key==key_3) {PORTB= LED3_ON;}

else if(key==key_4) {PORTB= LED4_ON;}


    }

return 1;

}




switch-case 문 사용




#include <avr/io.h>

#include "./../../header/key.h"

#include "./../../header/led.h"


int main(void)

{

unsigned char key=0x00;

DDRB=0x0f;

DDRD=0x00;

PORTB= 0x0f;

while (1)

{

key=(PIND & 0x78);

switch(key){

case(key_1): PORTB= LED1_ON; break;

case(key_2): PORTB= LED2_ON; break; 

case(key_3): PORTB= LED3_ON; break;

case(key_4): PORTB= LED4_ON; break;

}

}

return 1;

}


if 문보다는 switch-case문이 가독성도 좋고  깔끔해서 이쪽을 자주씁니다.


기본적인 스위치로 입력받아서 led를 키는거 해보았습니다.

이제 소스를 조금만 수정 응용하시면 키 하나눌러서 2~3개 키거나 모양을 만드실수 있게 될겁니다.



여기까지 led제어에 대해 알아봤고 다음엔 fnd(7-segment)제어에 대해 알아보겠습니다.

fnd를 사실때는 꼭 핀번호가 있는 데어터시트를 제공하는 제품을 사시고요. 

핀이 좌우로 된것보다는 상하로 된게 더많이 쓰이니 새싹분들은 상하를 사시는걸 추천드립니다.


그럼 다음에 만나요~~~

'avr 기초' 카테고리의 다른 글

귀찮은 avr F_CPU설정 한번에 해버리자!  (0) 2016.03.21
atmega32/ 128 fnd(7-segment)제어  (0) 2016.03.12
atmega로 led켜기  (0) 2016.03.04
delay.h 헤더파일 소스 설명  (1) 2016.03.03
delay, led, fnd 헤더파일  (0) 2016.03.02
Posted by 탕구이

블로그 이미지
엔지니어를 꿈꾸는 공대생
탕구이

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
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 31

최근에 올라온 글

글 보관함