8개 LED 켜고 끄기

     스위치 입력은 Pin B7을 통하여 상태를 읽게 되고 스위치의 상태를 읽어 8개의 LED를 켜고 끌 수 있다. 회로는 아래와 같이 8 Array LED와 Tact Switch를 사용한 기본회로를 사용하였다.


PIC16F18345/687을 사용하기 위한 기본 회로


     아래 그림은 위 회로를 빵판에 옮겨 놓은 것으로 이와 같이 꾸미고 프로그램을 작성하고 동작 시키면 된다. 실행 프로그램은 스위치를 누르면 LED 모두가 켜지고 그렇지 않으면 LED 가 모두 꺼지도록 하였다.


PIC16F687을 사용하기 위하여 빵판에 꾸민 모양
(그림을 마우스로 클릭하면 간단한 동영상을 볼 수 있다.)


     스위치의 상태에 따라 LED 전체를 켜고 끄기 위하여 스위치의 상태를 읽기위하여 input () 함수를 사용하였고, LED를 켜고 끄기위하여 output_high (), 그리고 output_low () 함수를 사용하였다. Digital output 함수의 하나로 포트 전체(Bit0 ~ Bit7)를 켜고 끄기위하여 output_x () 함수를 사용 할 수 도 있다. 하나의 포트에 포함된 여러개의 Pin(주로 8개) 모두를 컨트롤하기 위해서는 output_x () 함수를 사용하는 것이 편리하다.

3. Digital Output 명령어: output_x ()  (CCS-C Manual 참고)

     - output_x (value): port x를 통하여 value 값을 출력

     output_x (value)에서 x는 포트 이름을 이야기 하며, vlue는 Port X의 출력값으로 0x00 ~ 0xFF (0 ~ 255)사이의 값으로 bit 0에서 bit 7의 출력 값을 2진수로 표현한 값이다.
     예로서 output_c (0) 의 경우 port c를 통하여 0의 값을 출력한다는 의미로 value 0은 2진수로 00000000 이므로 Bit 0에서 Bit 7 까지 모두 0의 출력 신호(0 V)를 내 보낸다는 의미이다. 따라서 output_c (0)함수를 실행하면 Port C의 출력은 모두 0 V가 되고 따라서 8개의 LED가 모두 꺼지게 된다. 반면에 output_c (255)의 경우 255는 2진수로 11111111 이므로 Bit 0에서 Bit 7 까지 모두 1의 출력 신호(5 V)를 내 보내게되고 8개의 LED 모두 켜지게 된다. 따라서 value에 따라서 원하는 LED를 켜고 끌 수 있다.

예)
output_c (0x00) ;  //* LED를 모두 꺼짐, 0x00 (16진수) -> 00000000 (2진수)
output_c (0xFF) ;  //* LED를 모두 켜짐, 0xFF (16진수) -> 11111111 (2진수)
output_c (0xF0) ;  //* 위 4개가 켜짐, 0xF0 (16진수) -> 11110000 (2진수)

아래 프로그램은 버튼을 눌렀을때 모두 켜지고 스위치를 누르지 않은 상태는 모두 꺼지는 프로그램입니다. 프로그램은 아래 위 두 종류로 되어있고, 둘이 조금 다르긴하지만 같은 결과를 나타낸다. 다만 output_high () 함수를 사용하는 경우 8개의 LED 가 매우 빠르게 순차적으로 켜지며, output_c () 함수의 경우 8개의 LED가 동시에 켜지고 꺼진다.

//***********************************************************************
// 스위치를 읽어 LED 켜기 (output_high (), output_low () 함수 사용)
//***********************************************************************  											 
                    
#include  <16f687.h>                         //* pic16f687을 사용하기 위한 header file

#fuses    HS                                        //* 4 MHz:XT, 4 MHz 이상: HS
#use      delay (clock = 20000000)      //* 사용한 크리스탈

void main (void)
{
	int1 bitSW ;                                 //* 1 bit bitSW 변수 선언

	while (1) {
        bitSW = input (PIN_B7) ;                   //* 스위치(PIN_B7) 의 상태 신호를 읽음

		if (bitSW == 0) {
			output_high (PIN_C0) ;    //* Pin_C0 On   
			output_high (PIN_C1) ;    //* Pin_C1 On   
			output_high (PIN_C2) ;    //* Pin_C2 On
			output_high (PIN_C3) ;    //* Pin_C3 On
			output_high (PIN_C4) ;    //* Pin_C4 On
			output_high (PIN_C5) ;    //* Pin_C5 On
			output_high (PIN_C6) ;    //* Pin_C6 On
			output_high (PIN_C7) ;    //* Pin_C7 On   
		}
		else {
			output_low (PIN_C0) ;     //* Pin_C0 Off   
			output_low (PIN_C1) ;     //* Pin_C1 Off 
			output_low (PIN_C2) ;     //* Pin_C2 Off 
			output_low (PIN_C3) ;     //* Pin_C3 Off 
			output_low (PIN_C4) ;     //* Pin_C4 Off 
			output_low (PIN_C5) ;     //* Pin_C5 Off 
			output_low (PIN_C6) ;     //* Pin_C6 Off 
			output_low (PIN_C7) ;     //* Pin_C7 Off 
		}
	} 
}

//*********************************************************************** 
  

위 프로그램을 포트 출력 명령어 output_c () 함수를 사용할 수도 있다.
                                  
//***********************************************************************
// 스위치를 읽어 LED 켜기 (output_c () 함수 사용)
//***********************************************************************  											 
                    
#include  <16f687.h>                         //* pic16f687을 사용하기 위한 header file

#fuses    HS                                        //* 4 MHz:XT, 4 MHz 이상: HS
#use      delay (clock = 20000000)      //* 사용한 크리스탈

void main (void)
{
	int1 bitSW ;                                 //* 1 bit bitSW 변수 선언

	while (1) {
		bitSW = input (PIN_B7) ;               //* 스위치(PIN_B7) 의 상태 신호를 읽음

		if (bitSW == 0) output_c (0xFF) ;   //* LED를 한번에 모두 켬 (스위치가 눌렸을 경우)    
		else output_c (0x00) ;		   //* LED를 모두 끔                     
	}
}

//***********************************************************************      




< Prev
TOP
Next >