본문 바로가기
코스웨어/15년 스마트컨트롤러

20150330-9번 김태영 퀴즈벨 만들기, 입력과 출력

by 알 수 없는 사용자 2015. 3. 30.
728x90
반응형



소일거리!?

PIC16F917을 이용하여 퀴즈벨 만들기

여기 0번, 1번, 2번, 3번 스위치가 있다. 여기서 0번을 누르면 0번 LED, 1번을 누르면 1번 LED, 2번을 누르면 2번 LED에 불이 들어온다. 3번 LED를 누르면 불이 다꺼지게 된다. 그리고 만약 하나의 LED에 먼저 불이 들어오게 되면 다른 LED 버튼을 눌러도 켜지지 않고 처음 누른 버튼의 LED는 계속 켜지게 하려고 한다. 3번 스위치를 누르면 리셋이 되게 된다.

예를 들면 0번 스위치를 눌러 LED를 키면 1번을 눌러도 1번 LED는 켜지지 않고 0번은 계속 켜져 있는 상태를 유지한다.

회로는 위와 같이 그린다.




 

 

/*

 * File:   GPIO_00.c

 * Author: it

 *

 * Created on 2015? 3? 25? (?), ?? 11:29

 */


#include <stdio.h>

#include <stdlib.h>

#include "pic16f917.h"

/*

 *

 */

int main()


{

    unsigned char a = 0; // char 1byte, 0~255, 8bit

    unsigned char b = 0x07;

    volatile unsigned int  c = 0;

    ANSEL = 0x00; // volatile unsigned 0x91h, select  digital

    TRISA = 0x0F; // A0~A3 PORT use as INPUT, 0b00000011

    TRISB = 0x00; // B0 ~ B7 PORT use as OUTPUT


/*register setup*/

    while(1) // funcion insert

    {


        while(b==0x0E | b==0x0D | b==0x0B)

        {

            if(PORTA == 0x07) break;

        } // 다른 벨을 눌려도 바뀌지 않게 하는 반복구문, 4번 버튼이 들어와야 이 와일구문을 빠져나오게 된다

        

        a = (PORTA & 0x0F);


        switch(a)

        {

         case 0x0E: // 1110

            while(PORTA == 0x0E)

            {

            }

            b=0x0E; // 1110 number0 LED on

            break;


         case 0x0D: // 1101

             while(PORTA == 0x0D)

             {

             }

             b=0x0D;// 1101 number1 LED on

             break;

 

         case 0x0B: // 1011

             while(PORTA == 0x0B)

             {

             }

             b=0x0B; // 1011 number2 LED on

             break;


         case 0x07: // 0111 all LED off

             while(PORTA == 0x07)

             {

             }

             b=0x07; // 0111

             break;


         default:

             break;

        }


        for(c=0;c<2000;c++);

        PORTB = b;


    }

    return 0;

}






폰트 디자인 할 때 엑셀 사용법



엑셀을 이용하면 LCD에 폰트입력할 것을 미리 보기 할 수 있다. 또한 함수를 활용해서 10진수 갑소가 16진수 값도 쉽게 확인이 가능하다

행과 열의 너비까지 LCD 사이즈에 맞추어 주며 더욱 실제에 가까운 확인이 가능하다.


옛날 TV를 말할때 흑백티비라고 표현을 하는데 이보다는 그레이스케일이라는 표현이 더 정확한 표현인데 이에 대해서 더 알아보자.

3x3으로 그래픽을 표현한다고 가정해보자.



오직 흑과 백으로만 표현한다고 친다. 저 아홉칸 중에 하나를 DOT(도트) 혹은 pixel(픽셀)이라고 표현 한다. 즉 한 도트를 표현하기 위해서는 1비트의 데이터가 필요하다 총 아홉칸이기 때문에 9비트의 데이터가 필요하다고 할 수 있다.

앞서 말했듯이 티비는 흑백티비가 아니라 그레이스케일로 볼 수가 있다. 말 그대로 흑과 백 사이의 색깔을 8비트로 표현한 것이다.8비트이기 때문에 0~ 255까지의 색을 나타낼수 있다(2^8 = 256). 여기서 0은 완전히 까만 흑색, 255는 백색으로 보면 될 것이다. 중간에는 진하기에 따라 회색을 나타날수 있는 데이터가 존재한다. 즉 비트와는 다르게 메모리가 커져야 됨을 알 수 있다.

더 나아가 칼라표현 방식을 알아보자.

빛의 삼원색은 빨간색, 초록색, 파란색으로 나눌 수 있다.(RGB)

위와 흑과 백을 8비트로 진하기에 따라 나눈 것을 똑같이 빨강, 초록, 파랑에 적용한다.예를 들어 빨강만 본다고 하면 0은 빨강 255는 검정을 나타낸다.나머지 색도 마찬가지로 나누게 되면 한 도트를 표현하는데 총 3byte가 필요하게 된다(2^8 x 3 / 1024)

따라서 3X3 그래픽을 표현한다고 했을 때 3x9 = 27byte의 메모리가 필요하다


이는 그림판에서도 확인할 수가 있다. 그림판에 들어가 ctrl + s 를 눌러 저장을 하면 포맷형식을 정할수 있는 창이 뜬다. 거기서 24비트 비트맵(한도트당 24비트의 데이터로 표현을 하는 형식)이 있는데 이는 앞서 설명한 것을 그대로 적용한 파일이라는 뜻이다.

256색이라는 저장형식도 있는데 이는 각색마다 256가지가 85가지로 단계를 나누어 색을 표현한 것이다. 따라서 24비트 형식으로 표현한 것보다는 용량이 적지만 질이 떨어진다.

그림판의 속성에 들어가서 1024x768로 너비 높이를 조절하고 24비트로 저장을 하게 되면 용량은 다음과 같다.

1024 x 768 x 3(byte) / 1024 /1024 = 2MB로 나온다. 실제 저장해보면 2MB가 약간 넘는데 이는 다른 어떠한 정보를 포함해서 이렇게 뜨는 것으로 보인다.


영상을 만들 때 보통 1초에 24장의 이미지 파일을 사용하는데 이를 한시간으로 보아 계산을 한다면 2MB x 24frame/1sec x 60sec/1min x 60min/1hr x 1G/1024MB =168Gbyte가 나오게 된다.

매우 높은 용량을 그대로 쓸수 없기 때문에 압축기술이 발달하게 되었다 압축 기술에는 손실 압축, 비손실 압축 두가지가 있는데 mp3, jpg등이 대표적인 손실 압축이다. 말 그대로 필요없는 내용을 없애서 파일을 저장한다는 개념인데 이 없애는 내용은 사람들이 인지할수 없는 내용이 많다.


빛에서 우리는 적외선과 자외선을 볼수가 없으며, 소리도 초음파와 극저주파는 들을수 없다. 손실압축은 이에 해당하는 내용을 과감히 잘라 버리는 것이다. 

동영상을 압축하는 알고리즘을 코덱이라고 한다. 어쨋든.. 그래픽 데이터를 CPU가 다 처리한다면 컴퓨터가 마비되기 때문에 그래픽 처리를 도와주는 그래픽카드가 생겨나게 되었다.t




입력 출력에 대해서 조금 정리하고 들어갈 필요가 있는 듯하다. 우리가 잘알고 있는 키보드는 입력 전용, 모니터는 출력 전용이다. 우리가 유의깊게 보아야 될 것은 '파일'이다. 하나의 프로그램을 주체라고 생각하면 이 주체는 파일을 저장(출력)하기도 하고 파일을 불러들어서 수정(입력)하기도 한다. 즉, 파일은 입력이 될수도 있고 출력이 될 수도 있다. 

C의 입출력이라는 주제에 들어가면서 처음 나오는 단어는 '스트림'이다. 스트림을 직역하면 '흐름'이란 뜻인데 컴퓨터에서는 흘러가는 길이라고 생각하면 편할 것 같다. C 교재를 참고해서 정의하면 

<프로그램 상에서 모니터와 키보드를 대상으로 데이터를 입출력 하기 위해서는 이들을 연결시켜주는 다리가 필요하다. 그리고 이러한 다리의 역할을 하는 매개체를 '스트림'이라한다>

<스트림은 '한 방향으로 흐르는 데이터의 흐름'을 뜻한다. 즉 스트림이란 단어에는 단 방향으로만 데이터의 전송이 이뤄진다는 뜻이 담겨 있다. 실제로 입출력 스트림도 입력스트림과 출력 스트림이 구분되어서 한 방향으로만 데이터의 흐름을 유지하고 있다.>

스트리밍이라는 것은 '정해지지 않은 양을 전송하는 것'인데 동영상, 음악과 같은 멀티미디어 전송에 많이 쓰인다. 이는 저장되는 것이 아니라 다시 분해된다. 키보드 입력도, 모니터 화면에 출력되는 것도 모두 스트리밍이다.  정해진 데이터를 보내는 것이 아니라 계속 바뀌는 정보들을 보내주는 것이기 때문이다.

우리가 지금까지 교육을 받으면서 무수하게 많은 입력과 출력을 해왔는데 자동으로 스트림이 생성되었다고 보면 된다. 즉, 교재의 말로 정의하면 콘솔 입출력을 위한 '입력 스트림'과 '출력 스트림'은 프로그램이 실행되면 자동으로 생성되고, 프로그램이 종료되면 자동으로 소멸되는 스트림이다.

표준 스트림에는  stdin, stdout, stderr 이 있다.



stdin 

표준 입력 스트림

키보드 대상으로 입력 

stdout

표준 출력 스트림

모니터 대상으로 출력 

stderr 

표준 에러 스트림 

모니터 대상으로 출력 


stdon은 모니터에 대한 정보를 가지고 있고, stdin은 키보드에 대한 정보, stderr은 모니터지만 에러에 관한 모니터 정보를 가지고 있다.

stdin은 0, stdout은 1, stderrs는 2로 지정되어 있는데 다음과 같은 명령어로 몇가지 정보를 확인할 수 있다.

Dir 1> a.txt

바탕화면에서 우선 도스창을 뛰운다. 그리고 그 도스창에 위 명령어를 입력하면 현제디렉토리 파일을 보여주는 출력에 관한 내용을 a.txt파일을 만들어 넣어 저장을 한다. 이뿐만 아니라 컴파일 시킬떄에도 cl 1>a.txt같은 명령어를 통해 스트림 별로 내용을 볼수가 있다.  




IT 컴퓨터가 아닌 집컴퓨터로 하려니 속시원하게 쓰지못하고 답답하기만 하네요ㅠㅠ 모자란 부분 많이 알려주세요!

728x90