전자회로실험
스위치를 누름에 따라 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이아닌값)일 동안 계속해서 명령문을 실행한다.