HBE-MCU-All in One 키트에는 'Push Button'과 'LED' 에 대한 포트가 있습니다.

이번 포스팅에서는 Push Button 을 누를 때마다 LED가 다양하게 제어되는 형태의 프로그램에 대한 코드를

설명하려고 합니다. 각각 Push Button 에 대해서 LED는 다음과 같은 반응을 보일 수 있습니다.


그리고 소스 코드는 다음과 같습니다.


#include <avr/io.h> void my_delay(unsigned long x) { while(x--); } int main(void) { int i; unsigned char state, tmp; /* Push Button - 포트 D */ DDRD = 0x00; // 입력 /* LED - 포트 B */ DDRB = 0xFF; // 출력 while(1) { state = PIND; switch(state) { case 0x01: // 0번 버튼 PORTB = 0xFF; // 모든 LED가 켜진다. break; case 0x02: // 1번 버튼 PORTB = 0xAA; // 짝수번째 LED가 켜진다. break; case 0x04: // 2번 버튼 PORTB = 0x55; // 홀수번째 LED가 켜진다. break; case 0x08: // 3번 버튼 // 다른 스위치가 눌릴때까지 모든 LED를 깜빡인다. while(1) { PORTB = 0x00; // 모든 LED 꺼진다. my_delay(50000); if(PIND != 0x08 && PIND != 0x00) // 다른 스위치가 눌리는지 확인. break; PORTB = 0xFF; // 모든 LED 켜진다. my_delay(50000); if(PIND != 0x08 && PIND != 0x000) break; } break; case 0x10: // 4번 버튼 // 다른 스위치가 눌릴때까지 LED 1개 켜서 좌로 이동 while(1) { tmp = 128; for(i=0; i<8; i++) { PORTB = tmp; tmp = tmp >> 1; my_delay(50000); if(PIND != 0x10 && PIND != 0x00)// 다른 스위치가 눌리는지 확인. goto Finish1; } PORTB = 0x00; } Finish1: break; case 0x20: // 5번 버튼 // 다른 스위치가 눌릴때까지 LED 1개 켜서 좌로 이동 while(1) { tmp = 1; for(i=0; i<8; i++) { PORTB = tmp; tmp = tmp << 1; my_delay(50000); if(PIND != 0x20 && PIND != 0x00)// 다른 스위치가 눌리는지 확인. goto Finish2; } PORTB = 0x00; } Finish2: break; case 0x40: // 6번 버튼 PORTB = 0xF0; // 상위 4비트(LED4~LED7)만 켠다. break; case 0x80: // 7번 버튼 PORTB = 0x0F; // 하위 4비트(LED0~LED3)만 켠다. break; default: // 아무런 버튼도 누르지 않은 경우. PORTB = 0x00; // 모든 LED가 꺼진다. } } }


다음은 각각 결과에 대한 사진입니다.



▲ 0번 버튼을 누른 경우, LED가 전부 켜진다.


▲ 1번 버튼을 누른 경우, LED가 짝수 번째만 켜진다.


▲ 2번 버튼을 누른 경우, LED가 홀수 번째만 켜진다.


▲ 3번 버튼을 누른 경우, LED가 깜빡인다.


▲ 4번 버튼을 누른 경우, LED가 1개씩만 좌로 이동한다.


▲ 5번 버튼을 누른 경우, LED가 1개씩만 우로 이동한다.


▲ 6번 버튼을 누른 경우, LED가 상위 4비트(LED4~LED7)만 켜진다.


▲ 7번 버튼을 누른 경우, LED가 하위 4비트(LED0~LED3)만 켜진다.


<문제>

Input (Standard input)     

In the first line, the number of input keys N, and the integer M are given(1≤N,M≤30,000).     

In the next N lines, a key is given in each line. 

Output (Standard output)     

Print the key after the M steps of the selection sort. (Sort in increasing order.)

#include <stdio.h>
#include <stdlib.h>

// parameter:
// 'arr' is the array to sort.
// 'len' is the length of the array.
// 'count' means the steps of the selection sort.
void SelectionSort( int arr[], int len, int count )
{
	int i, j, minIdx, tmp;

	for( i=0; i<count; i++ )
	{
		minIdx = i;
		
		for( j=i+1; j<len; j++ )
		{
			if( arr[j] < arr[minIdx] )
				minIdx = j;
		}

		if( i != minIdx)
		{
			tmp = arr[minIdx];
			arr[minIdx] = arr[i];
			arr[i] = tmp;
		}
	}
}

int main( void )
{
	int i;	// for repetition
	int len, count;
	int * arr;

	/* Input */
	scanf("%d %d", &len, &count); // 길이(N)와 스텝(M) 입력.

    arr = ( int* )malloc( sizeof(int) * len ); // 그 길이에 맞춘 배열 생성
    for( i=0; i < len; i++ )
    {
        scanf("%d", &arr[i]); // 배열 원소들의 값들 입력받기
    }
 
    /* Output */
    SelectionSort( arr, len, count );  // 선택 정렬.
    for( i=0; i < len; i++ )
    {
        printf("%d\n", arr[i]); // 각 값들 모두 출력하기
    }
    free(arr);
	return 0;
}


#include <stdio.h>
#include <stdlib.h>
#define inf 99999

void Merge(int arr[], int first, int mid, int last)
{
	int i=0,j=0,k=0;
	int a=first, b=mid, c=last;
	int n1 = b - a + 1;
	int n2 = c - b;

	int * Left, * Right;
	Left = (int*)malloc(sizeof(int)*(n1+1));
	Right = (int*)malloc(sizeof(int)*(n2+1));

	for( i=0; i < n1; i++ )
	{
		Left[i] = arr[a + i - 1]; 
	}
	for( i=0; i < n2; i++ )
	{
		Right[i] = arr[b + i];
	}
	Left[n1] = inf;
	Right[n2] = inf;
	i=0;
	j=0;

	for( k=a-1; k < c; k++ )
	{
		if(Left[i] <= Right[j])
			arr[k] = Left[i++];
		else
			arr[k] = Right[j++];	
	}
}

void MergeSort(int arr[], int first, int last)
{
	if(first < last)			 // Terminal Condition!
	{
		int mid = (first + last)/2;
		MergeSort(arr, first, mid);
		MergeSort(arr, mid+1, last);
		Merge(arr, first, mid, last);
	}
}

void ReverseOrder(int arr[], int len)
{
	int tmp,i;

	int mid = len/2;

	for(i=0; i<mid; i++)
	{
		tmp = arr[i];
		arr[i] = arr[len-i-1];
		arr[len-i-1] = tmp;
	}
}

int main(void)
{
    int i; // for repetition
    int len;
    int * arr;

    /* Input */
    scanf("%d", &len);  // 길이 입력
    arr = (int*)malloc(sizeof(int)*(len+1)); // 그 길이에 맞춘 배열 생성
    for(i=0; i < len; i++)
    {
        scanf("%d", &arr[i]); // 배열 원소들의 값들 입력받기
    }
 
    /* Output */
    MergeSort(arr,1,len);  // 삽입 정렬.
	ReverseOrder(arr, len);		// 내림차순 정렬.
    for(i=0; i < len; i++)
    {
        printf("%d\n", arr[i]); // 각 값들 모두 출력하기
    }
	return 0;
}




#include <avr/io.h>

void my_delay(unsigned long x)		// 시간 딜레이 함수.
{
	while(--x);
}

// 포트 B 8개는 LED0~7까지,
// 포트 D 8개는 LED8~15까지 연결한 상태입니다.
int main(void){

	int i;
	unsigned char tmp;
	
	DDRB = 0xFF;
	DDRD = 0xFF;

	while(1){

		tmp=1;
		/* [포트 B] LED 윗 줄(LED0~LED7)에 대한 반복문 */
		for(i=0;i<8;i++)
		{	
			PORTB = tmp;
			tmp = tmp << 1;
			my_delay(500000);
		}
		PORTB = 0x00;		// LED7 끄기 위함.

		/* [포트 D] LED 아랫 줄(LED8~LED15)에 대한 반복문 */
		tmp=1;
		for(i=0;i<8;i++)
		{	
			PORTD = tmp;
			tmp = tmp << 1;
			my_delay(500000);
		}
		PORTD = 0x00;		// LED15 끄기 위함.
	}
	return 0;
}


위 소스 코드는 HBE-MCU-AllinOne 보드에 있는 LED 16개 (LED0~LED15) 를 순차적으로 켤 수 있도록 만든 코드입니다. 크게 어려운 부분이 없으므로 설명은 생략하겠습니다.



▲ LED 포트가 하나씩 불이 들어오는 모습


각 LED 포트 하나씩 불들어오는 거 다 찍었으면 더 예뻤을 텐데 시간이 없었네요 ㅎㅎㅎ;;;


p.s 궁금한 점 있으면 댓글이나 이메일 보내주시면 감사하겠습니다 ^^ :)




1. 제품 개요

8-bit 마이크로컨트롤러(MCU)는 현 산업계에서 가장 많이 사용되는 프로세서 중 가운데 하나이며, 이를 통해 다양한 주변 장치들을 제어할 수 있는 많은 종류의 제품이 개발되고 있습니다. 8-bit 기반의 MCU에서 지원하는 다양한 기능을 여러 주변장치를 통해 습득하고 이를 응용하는 기술은 하드웨어 및 소프트웨어 개발자의 기본 지식입니다. HBE-MCU-AllinOne은 20종 이상의 주변장치를 하나의 시스템을 통해 실험실습할 수 있도록 구성하여 마이크로콘트롤러의 다양한 기능과 활용 방법을 습득할 수 있습니다. 또한 다양한 옵션 모듈을 지원하여 기본 구성 이외의 기능들을 쉽게 추가할 수 있으며, 이를 통하여 프로젝트 실습 및 캡스톤 설계 교과목도 운용할 수 있습니다. HBE-MCU-AllinOne은 최근 MCU 분야에서 적용이 확산되고 있는 32-bit 기반 Cortex-M3 마이크로콘트롤러를 제공하여 상위 레벨의 교육 환경을 구축할 수 있습니다.

2. 제품 트징

● 4종(ATmega128, 89C51ED2, PIC18F6722, STM32F103)의 MCU 구성

● 착탈 가능한 커넥터 구조의 MCU 모듈 설계에 따른 다양한 MCU의 실험실습이 가능

● MCU 모듈과 기능 모듈을 다양하게 연결할 수 있는 커넥터 구조 제공

● MCU 학습 및 설계의 효율성을 향상시킬 수 있는 신호 분석 모듈(주파수 분석) 제공

● 다양한 입력 스위치 및 출력 표시 장치 제공

● USN 및 센서의 교육을 위한 다양한 센서 장착

● 응용 실험실습 및 프로젝트 수업을 위한 옵션모듈 장착 가능(어댑터 보드)

● 응용 실험실습에 필요한 다양한 예제 및 프로그램 소스 제공

● 기초 수준의 프로세서 교육에서 응용 제품 설계 수준의 교육 환경 지원

● 마이크로컨트롤러 종류별 4종의 표준 교재 및 예제 제공


3. 구성 및 명칭

HBE-MCU-AllinOne은 4종류의 마이크로컨트롤러(MCU 모듈) 및 주변장치들을 실험실습할 수 있는 단일보드(One Board) 형태의 MCU 교육 플렛폼입니다. HBE-MCU-AllinOne은 MCU 교육에 필수적인 최신 주변장치들(예: OLED 등)로 구성 되어 있으며, 확장 포트를 통해 다양한 옵션 모듈을 실험할 수 있는 유연한 구조를 가지고 있습니다.


출처: http://www.hanback.co.kr/boards/view/newproduct/9922/page:2

#include <stdio.h>
#include <stdlib.h>

// 길이와 배열을 입력받습니다.
// 출력결과는 내림차순입니다.
void InsertionSort(int len, int arr[])
{
	int i=0, j=0;
	int tmp=0;

	for( j=1; j < len; j++ )
	{
		tmp = arr[j];
		i=j-1;
		
		while( i>=0 && arr[i] < tmp )
		{
			arr[i+1] = arr[i];
			i--;
		}
		arr[i+1] = tmp;
	}
}

int main(void)
{
	int i; // for repetition
	int len;
	int * arr;

	/* Input */
	scanf("%d", &len);	// 길이 입력
	arr = (int*)malloc(sizeof(int)*len); // 그 길이에 맞춘 배열 생성
	for( int i=0; i < len; i++)
	{
		scanf("%d", &arr[i]); // 배열 원소들의 값들 입력받기
	}

	/* Output */
	InsertionSort(len, arr);  // 삽입 정렬.
	for(int i=0; i < len; i++)
	{
		printf("%d\n", arr[i]); // 각 값들 모두 출력하기
	}
	return 0;
}


+ Recent posts