본문내용
110000;// SEG 4 (PF7=0), 1000자리 표시
PORTB = seg_pat[N1000];
delay_ms(5);
}
// SW1 입력 처리 함수
void sw_key1(void)
{
if(pos == 0) N1 = (N1 + 1) % 10; // 1자리 +1
else if(pos == 1) N10 = (N10 + 1) % 10; // 10자리 +1
else if(pos == 2) N100 = (N100 + 1) % 10; // 100자리 +1
else N1000 = (N1000 + 1) % 10; // 1000자리 +1
}
// SW2 입력 처리 함수
void sw_key2(void)
{
pos = (pos + 1) % 4; // 입력 자리 이동
}
<소스 설명>
- 이번 실험은 6번 실험과 거의 흡사한 실험으로 다른 점이 있다면 외부인터럽트를 사용하지 않고 스위치를
사용했다는 점에서 다르다. 스위치부분도 4단원에서 실험을 했었는데, 스위치 부분만 다시 소스를 설명
하겠다.
- DDRB는 2진수 11111111이므로 모두다 출력으로 사용하고, DDRF는 11110000으로 0은 입력으로, 1은
출력으로 사용한다. old_sw 값은 PINE을 읽어서 AND연산한 값을 저장하여 sw 상태 값을 추출한다.
- if ~ elseif 구문을 사용하여 old_sw는 11110000이고 sw는 11100000(즉, SW1)일 때, SW1의 입력처리
함수를 동작하도록 설정되어있다. SW1의 입력처리함수는 숫자를 증가시키는 소스로 구성되어져 있다. 즉,
6번 실험에서 인터럽트 4와 같은 기능을 한다. elseif를 보면 old_sw는 11110000이고 sw는 11010000
(즉, SW2)일 때, SW2의 입력처리함수를 동작하도록 설정되어있다. SW2의 입력처리함수는 입력 자리를
이동시키는 소스로 구성되어져 있다. 즉, 6번 실험에서 인터럽트 5와 같은 기능을 한다.
<응용구현> 7-Segment를 이용한 자음 구현과 led와의 동시 동작
- 7-Segment에 ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅋ, ㅌ 총 8개가 SEG1 ~ SEG4에 무한반복으로 표시되며, 동시에
led 동작은 LED0 → LED1 → LED2 → LED3 → LED4 → LED5 → LED6 → LED7 → LED7 →
LED6 → LED5 → LED4 → LED3 → LED2 → LED1 → LED0 순으로 불이 들어온다.
<소스>
#include
#include
char korean2[8] = {0b00000111, 0b00111000, 0b00111001, 0b01011011,
0b00111111, 0b01111110, 0b01000111, 0b01111001};
void main(void)
{
int i;
unsigned char led = 0xFE;
DDRC = 0xFF;
DDRB = 0xFF; // 포트 B 출력 설정
DDRF = 0b11110000;
while(1){
PORTF = 0b11100000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
for(i = 0; i < 8; i++)
{
PORTC = led;
led <<= 1;
led |= 0x01;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
PORTF = 0b11010000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
led = 0x7F;
for(i = 0; i < 8; i++)
{
PORTC = led;
led >>= 1;
led |= 0x80;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
PORTF = 0b10110000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
led = 0xFE;
for(i = 0; i < 8; i++)
{
PORTC = led;
led <<= 1;
led |= 0x01;
if(led == 0xFF)
led = 0xFE;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
PORTF = 0b01110000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
for(i = 0; i < 8; i++)
{
PORTC = led;
led <<= 1;
led |= 0x01;
if(led == 0xFF)
led = 0xFE;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
}
}
<소스 설명>
- 한국어 자음을 나타내는 배열 korean2를 생성한다. korean2 중에서 2진수 0b00000111는 1일 때 불이 들어오므로, 아래그림과 같이 7-Segment에 ㄱ이라는 자음(기역)이 보인다.
- for문을 이용해 7-Segmet(SEG1)에 자음을 표시하고, 동시에 led가 상위비트에서 하위비트로 순차 점멸
되도록 코딩 되어져 있다. led를 좌 쉬프트[led <<= 1] 했을 경우 아래 그림과 같이 비트가 하나씩 좌로
움직이고 빈칸에는 다시 1로 채워진다[led |= 0x01].
11111110
11111101
- 그림에서 보는 바와 같이 ㄱ과 LED1이 동시에 들어오는 것을 볼 수 있다.
- 동작 설명을 자세히 하자면
SEG1 : ㄱ(LED1)→ㄴ(LED2)→ㄷ(LED3)→ㄹ(LED4)→ㅁ(LED5)→ㅂ(LED6)→ㅋ(LED7)→ㅌ(LED8)
▼
SEG2 : ㄱ(LED8)→ㄴ(LED7)→ㄷ(LED6)→ㄹ(LED5)→ㅁ(LED4)→ㅂ(LED3)→ㅋ(LED2)→ㅌ(LED1)
▼
SEG3 : ㄱ(LED1)→ㄴ(LED2)→ㄷ(LED3)→ㄹ(LED4)→ㅁ(LED5)→ㅂ(LED6)→ㅋ(LED7)→ㅌ(LED8)
▼
SEG4 : ㄱ(LED8)→ㄴ(LED7)→ㄷ(LED6)→ㄹ(LED5)→ㅁ(LED4)→ㅂ(LED3)→ㅋ(LED2)→ㅌ(LED1)
PORTB = seg_pat[N1000];
delay_ms(5);
}
// SW1 입력 처리 함수
void sw_key1(void)
{
if(pos == 0) N1 = (N1 + 1) % 10; // 1자리 +1
else if(pos == 1) N10 = (N10 + 1) % 10; // 10자리 +1
else if(pos == 2) N100 = (N100 + 1) % 10; // 100자리 +1
else N1000 = (N1000 + 1) % 10; // 1000자리 +1
}
// SW2 입력 처리 함수
void sw_key2(void)
{
pos = (pos + 1) % 4; // 입력 자리 이동
}
<소스 설명>
- 이번 실험은 6번 실험과 거의 흡사한 실험으로 다른 점이 있다면 외부인터럽트를 사용하지 않고 스위치를
사용했다는 점에서 다르다. 스위치부분도 4단원에서 실험을 했었는데, 스위치 부분만 다시 소스를 설명
하겠다.
- DDRB는 2진수 11111111이므로 모두다 출력으로 사용하고, DDRF는 11110000으로 0은 입력으로, 1은
출력으로 사용한다. old_sw 값은 PINE을 읽어서 AND연산한 값을 저장하여 sw 상태 값을 추출한다.
- if ~ elseif 구문을 사용하여 old_sw는 11110000이고 sw는 11100000(즉, SW1)일 때, SW1의 입력처리
함수를 동작하도록 설정되어있다. SW1의 입력처리함수는 숫자를 증가시키는 소스로 구성되어져 있다. 즉,
6번 실험에서 인터럽트 4와 같은 기능을 한다. elseif를 보면 old_sw는 11110000이고 sw는 11010000
(즉, SW2)일 때, SW2의 입력처리함수를 동작하도록 설정되어있다. SW2의 입력처리함수는 입력 자리를
이동시키는 소스로 구성되어져 있다. 즉, 6번 실험에서 인터럽트 5와 같은 기능을 한다.
<응용구현> 7-Segment를 이용한 자음 구현과 led와의 동시 동작
- 7-Segment에 ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅋ, ㅌ 총 8개가 SEG1 ~ SEG4에 무한반복으로 표시되며, 동시에
led 동작은 LED0 → LED1 → LED2 → LED3 → LED4 → LED5 → LED6 → LED7 → LED7 →
LED6 → LED5 → LED4 → LED3 → LED2 → LED1 → LED0 순으로 불이 들어온다.
<소스>
#include
#include
char korean2[8] = {0b00000111, 0b00111000, 0b00111001, 0b01011011,
0b00111111, 0b01111110, 0b01000111, 0b01111001};
void main(void)
{
int i;
unsigned char led = 0xFE;
DDRC = 0xFF;
DDRB = 0xFF; // 포트 B 출력 설정
DDRF = 0b11110000;
while(1){
PORTF = 0b11100000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
for(i = 0; i < 8; i++)
{
PORTC = led;
led <<= 1;
led |= 0x01;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
PORTF = 0b11010000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
led = 0x7F;
for(i = 0; i < 8; i++)
{
PORTC = led;
led >>= 1;
led |= 0x80;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
PORTF = 0b10110000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
led = 0xFE;
for(i = 0; i < 8; i++)
{
PORTC = led;
led <<= 1;
led |= 0x01;
if(led == 0xFF)
led = 0xFE;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
PORTF = 0b01110000; // 맨 우측 7-Segment SEG1 ON(PF4=0)
for(i = 0; i < 8; i++)
{
PORTC = led;
led <<= 1;
led |= 0x01;
if(led == 0xFF)
led = 0xFE;
PORTB = korean2[i];
delay_ms(1000);
}
PORTB = 0b00000000;
delay_ms(1000);
}
}
<소스 설명>
- 한국어 자음을 나타내는 배열 korean2를 생성한다. korean2 중에서 2진수 0b00000111는 1일 때 불이 들어오므로, 아래그림과 같이 7-Segment에 ㄱ이라는 자음(기역)이 보인다.
- for문을 이용해 7-Segmet(SEG1)에 자음을 표시하고, 동시에 led가 상위비트에서 하위비트로 순차 점멸
되도록 코딩 되어져 있다. led를 좌 쉬프트[led <<= 1] 했을 경우 아래 그림과 같이 비트가 하나씩 좌로
움직이고 빈칸에는 다시 1로 채워진다[led |= 0x01].
11111110
11111101
- 그림에서 보는 바와 같이 ㄱ과 LED1이 동시에 들어오는 것을 볼 수 있다.
- 동작 설명을 자세히 하자면
SEG1 : ㄱ(LED1)→ㄴ(LED2)→ㄷ(LED3)→ㄹ(LED4)→ㅁ(LED5)→ㅂ(LED6)→ㅋ(LED7)→ㅌ(LED8)
▼
SEG2 : ㄱ(LED8)→ㄴ(LED7)→ㄷ(LED6)→ㄹ(LED5)→ㅁ(LED4)→ㅂ(LED3)→ㅋ(LED2)→ㅌ(LED1)
▼
SEG3 : ㄱ(LED1)→ㄴ(LED2)→ㄷ(LED3)→ㄹ(LED4)→ㅁ(LED5)→ㅂ(LED6)→ㅋ(LED7)→ㅌ(LED8)
▼
SEG4 : ㄱ(LED8)→ㄴ(LED7)→ㄷ(LED6)→ㄹ(LED5)→ㅁ(LED4)→ㅂ(LED3)→ㅋ(LED2)→ㅌ(LED1)
추천자료
2002년1회 정보기기운용사 기출문제
Intel 8051 microcontroller 의 구조적 측면에 대한 설명
컴퓨터 구조의 전반적인 이해 - 100장에 걸친 요약 리포트
프로그램 입출력 방식
[CPU][중앙처리장치][Intel][인텔][AMD]CPU(중앙처리장치)의 정의, CPU(중앙처리장치)의 구조...
[CPU][중앙처리장치][인텔][비인텔계열]CPU(중앙처리장치)의 개념, CPU(중앙처리장치)의 구조...
[CPU][중앙처리장치]CPU(중앙처리장치)의 역사, CPU(중앙처리장치)의 구조, CPU(중앙처리장치...
8051 조사
클러스터 시스템에서의 자원 관리 프로그래밍 모델
MP3 플레이어 국내외 시장동향
컴퓨터의 이해 (이혜진)
컴퓨터의 이해 레포트
컴퓨터의이해[1]
AVR 스위치 입력관련기술과 키 디바운싱 기술에 대해서 (스위치 입력,키 디바운싱,키입력,키 ...
소개글