전자회로실험

스위치를 누름에 따라 LED ON 개수를 하나씩 늘려가는 코드
main.c
#include "port.h"

int main(void)
{
    unsigned char led;

    DDRF = 0x00;        //F핀 초기화
    PORTF = 0x00;

    DDRC = 0x00;        //C핀 초기화
    PORTC = 0x00;

    while(1)
    {
        led = PINC;        // C핀으로 입력된 값을 보수를 취하기 위한 코드
        led = 0xFF - led;

        switch(led)
        {
            case 0x01 :        //첫번째 스위치가 눌려지면
                DDRF = 0x01;
                break;
            case 0x02 :        //두번째 스위치가 눌려지면
                DDRF = 0x03;
                break;
            case 0x04 :        //세번째 스위치가 눌려지면
                DDRF = 0x07;
                break;
            case 0x08 :         //네번째 스위치가 눌려지면
                DDRF = 0x0F;
                break;
            case 0x10 :         //다섯번째 스위치가 눌려지면
                DDRF = 0x1F;
                break;
            case 0x20 :         //여섯번째 스위치가 눌려지면
                DDRF = 0x3F;
                break;
            case 0x40 :         //일곱번째 스위치가 눌려지면
                DDRF = 0x7F;
                break;
            case 0x80 :         //여덟번째 스위치가 눌려지면
                DDRF = 0xFF;
                break;
            default :         //아무것도 눌러지지 않으면
                DDRF = 0x00;
        }

    }
    return 0;
}
// 회로도를 보면 스위치는 안눌러진 상태에서 High 신호를 보내다가 스위치를 누르게 되면 Low신호가 입력된다. 그러므로 이 값을 보수를 취해서 각각을 비교하면 쉽게 어느 스위치가 눌렀는지 알 수 있다.
// PORTF가 0x00으로 초기화 되어 있고 DDRF방향설정으로 LED ON 개수를 조절 하고 있다.

위의 코드를 간략화한 코드
main.c
#include "port.h"

int main(void)
{
    unsigned char in = 0x01;
    unsigned char out = 0xFE;
    unsigned int count = 0;

    DDRC = 0x00;    //switch input
    PORTC = 0x00;

    DDRF = 0xFF;    //LED output
    PORTF = 0xFF;

    while(1)
    {
        if((~PINC) & (in << count))        // 어느 스위치가 눌러졌는지 확인
        {
            PORTF = out << count;    // LED ON
        }
        else                    // 아무 스위치도 눌러 지지 않았을 때
        {
            PORTF = 0xFF;
        }

        count++;
        if(count >= 8)
        {
            count = 0;
        }
    }
    return 0;
}
// 시프트연산자를 이용하여 처음 작성한 코드를 간단히 만들어 보았다. 처음 코드를 보면 스위치를 확인 할 때의 숫자들을 자세히 살펴보면 결국 0x01로 시작해서 왼쪽으로 1개씩 시프트 연산한 것과 같다. 이를 변수로 만들어서 if문 하나에서 전부 확인하고 있다.
// LED ON 또한 Low 신호에 반응하기 때문에 시프트연산을 이용하면 쉽게 출력을 만들어 낼 수 있다.

 

C언어

swtich 문
p3-9.c
#include <stdio.h>

int main()
{
    char ch;

    printf("Please enter a number between 0 to 9 : ");
    scanf("%c", &ch);

    switch(ch)
    {
            case '0' :
                    printf("Input Number is Zero.\n");
                    break;
            case '1' :
                    printf("Input Number is One.\n");
                    break;
            case '2' :
                    printf("Input Number is Two.\n");
                    break;
            case '3' :
                    printf("Input Number is Three.\n");
                    break;
            case '4' :
                    printf("Input Number is Four.\n");
                    break;
            case '5' :
                    printf("Input Number is Five.\n");
                    break;
            case '6' :
                    printf("Input Number is Six.\n");
                    break;
            case '7' :
                    printf("Input Number is Seven.\n");
                    break;
            case '8' :
                    printf("Input Number is Eight.\n");
                    break;
            case '9' :
                    printf("Input Number is Nine.\n");
                    break;
            default :
                    printf("wrong number.\n");
    }

    return 0;
}

// switch문은 ch 안의 변수와 매칭되는 case 문이 실행 된다. 조건이 맞아 떨어지는 case문부터 그 밑으로 쭉다 실행하기 때문에 break;는 필수적으로 사용해야 한다.

문자열 입출력 함수
p3-10.c
#include <stdio.h>

int main()
{
    char ch;

    printf("Please enter any character: ");
    ch = getchar();
    putchar(ch);
    printf(" is a letter you typed.\n");
    //fflush(stdin);
    __fpurge(stdin);
    printf("Please enter any character: ");
    scanf("%c", &ch);
    printf("%c is a letter you typed.\n", ch);

    return 0;
}

// fflush(stdin)은 입출력 버퍼에 남아 있는 내용을 강제로 쓰는 명령이다. 이로 인해 입출력 버퍼가 비워지는데 윈도우 시스템에서는 이 코드가 원하는데로 잘 동작하나 리눅스시스템에서는 우리가 원하는데로 버퍼가 비워지지 않았다. 리눅스에서는 __fpurge(stdin)으로 입력버퍼의 내용을 지울 수 있었다. 이 함수들을 사용하는 이유는 앞선 입력에서 입력버퍼를 사용하고 버퍼에 불필요한 쓰레기 값을 남기게 되는데 이 값이 다음 입력에 영향을 주기 때문에 입력 버퍼를 비워주어야만 다음 입력이 제대로 동작한다.
//getchar(), putchar()함수는 각각 하나의 문자를 입력, 출력 하는 함수 이다. getchar()함수는 키보드로부터 하나의 문자를 입력받아서 이를 리턴해주고, putchar()함수는 아스키값을 넘겨주면 이를 문자로 화면에 출력해준다.

반복문
반복문은 같은 명령문을 여러 번 반복해서 수행해야 될 경우 사용한다. 반복문을 사용할 때는 다음의 3가지 조건이 필요하다.
1. 초기조건 // 2. 반복되는 일 // 3. 종료조건
p3-12.c
#include <stdio.h>

int main()
{
    int num;

    num = 0;        // 1.초기조건
    while(num <= 5)    // 3.종료조건
    {
            printf("%d\t", num);    // 2.반복되는 일
            num = num + 1;
    }
    printf("\n");

    return 0;
}


// while(논리식) { 명령문 } while문은 논리식이 참(0이아닌값)일 동안 계속해서 명령문을 실행한다.

+ Recent posts