2015-02-15

FND로 만드는 내 전화번호 표시기 코드연습 (code)입니다.

연습 코드 및 질문 답변입니다

출처 : http://cafe.naver.com/lazydigital/delay 


#include <avr/io.h>
#define F_CPU 16000000UL

#include <util/delay.h>

#define FND_N PORTC
#define FNC_C PORTG

unsigned char uch_n[]={0x00,0x00,0x00,0x3f,0x06, 0x3f, 0x40, 0x06, 0x5b, 0x4f, 0x66, 0x40, 0x6d, 0x7d, 0x27,0x7f };
                          // (0~255)  FND에 표시할 숫자값.
     //xxx010-1234-5678
unsigned char uch_c[]={0x08,0x04,0x02,0x01}; //(0/+ 양수1byte)    
int main(void)
{
   DDRC = 0xff;
   DDRG = 0x0f;
   DDRA = 0xff;
 
 
   int a,i,j;  //(-/+ 2byte)
   //float s; //(-/+ 4byte)
 
    while(1)
    {
         PORTA =  sizeof(uch_n[0]) ;// char 배열 함수의 크기 참고 확인용 sizeof(uch_n[0])=1, (1byte) sizof(uch_n) = 16 x 1
 
         for(a =0; a<(sizeof(uch_n)/sizeof(uch_n[0])); a++)      //표시할 문자를 선택. uch_n[]배열에 담길 임의의 갯수를                                                                                             //값으로 0~? 까지 순차적으로 선택                                
    {                                                                  //( 1byte x uch_n의 자료수 ) / (1byte x uch_n[0] (=1)])
 
     for(i=0; i<50; i++)    //(20ms)를 50번 단순 반복하여  = 1000ms (1sec)동안 표시유지  1초를 만들기위해 아래 함수                                               // 를 단순 반복.
      {
 
    for(j=0; j<4; j++)
     {
      FND_N = uch_n[(a+j)%(sizeof(uch_n)/sizeof(uch_n[0]))];
      FNC_C = uch_c[j];
      _delay_ms(5);
     }                      //0~3까지 4회반복 5ms로 4자리에 순차적 표시  //20ms 소요
     
   }
 
    }
   
 
 
 }

}

안녕하세요 강좌 2-3. FND로 만드는 내 전화번호 표시기를  강좌를 따라가며 질문에 답변해주신 예제코드의

내용을 토대로 전화번호 표시기를 나름대로 연습하여 짜본 연습용 코드입니다. (010-1234-5678  1초후 왼쪽으

로 한칸 이동 하며 4개씩 FND에 표시 이후 반복)

임베디드홀릭님이 강좌 중간마다 질문사항에 알려주신 코드중 일부를 응용하여 연습용으로 짜보았습니다.

코드는 정말 짜기 나름이구 짜는 사람의 이해정도에 따라 엄청나게 다양해 질 수 있다는 생각이 초보 수준인

저에게도 크게 느껴집니다.. 연습하면 할수록 욕심이 많이나는 부분입니다,  실례 일지는 모르겠습니다만 ^^;

좀더 다양한 활용방법을 익히는데는 역시 저보다 선배인분들의 코딩 형태를 답습하고 자신의 이해를 더해 응

용하는게 큰 도움이되는것 같습니다.  위코드에서 조금 불만 사항이라고 한다면 좀더 단순화 시키거나 다른

형태의 구문을 취하여 표현해보고 싶었는데 더이상 쓸만한 방법이 떠오르지 않았습니다, 작은 부분이라도 상

관없이 활용할 부분이나 주의 할 점이 있다면 알려주시면 대단히 감사하겠습니다.

출처 : http://cafe.naver.com/lazydigital/delay 



// 코드의 목적이 메모리를 최소한 사용하는걸 잡으셨다면. 님의 코드도 의미는 있지만.

표현을 조금 안다고 생각하고

typedef unsigned char u8_t ; // 좀더 간결하게 쓸수 있도록 새로운 타입을 사용함

#define FND_SIZE 12
#define OFF 10
#define DASH 11
u8_t  fnd_map[FND_SIZE] = { 0x3F, 1,2,3,...9,OFF,-}; fnd_map[0]는 0에 대한 FND 출력비트맵, [10]은 all off, [11]은 '-'

u8_t disp_img[] = {OFF,OFF,OFF,0,1,0,DASH,1,2,3,4,DASH,5,6,7,8};
     //xxx010-1234-5678

#define DISP_LOC(x) (0x8 >> (x))

#defien NUM_ARRAY(x)  (sizeof(x)/sizeof(x[0]))  

int main(void)
{
   DDRC = 0xff;
   DDRG = 0x0f;
   DDRA = 0xff;
 
 
   int a,i,j;  //(-/+ 2byte)
   //float s; //(-/+ 4byte)
 
    while(1)
    {

         for(a =0; a< NUM_ARRAY(disp_img) ; a++)                                                
        {                                                      
            for(i=0; i<50; i++)  
           {
                for(j=0; j<4; j++)
               {
                    FND_N = fnd_map[disp_img[(a+j)% NUM_ARRAY(disp_img)]];
                    FNC_C = DISP_LOC(j);
                   _delay_ms(5);
               }
        }
    }
   

% 연산을 사용하지 않는 방법은

010-1234-4566 010-1234-4567 010
이렇게 두개의 disp_img array을 사용하고 돌려도 되겠죠..

첫쨰, 010-
둘쨰, 10-1
이렇게 가서
마지막에
[]010
이후에 다시 첫음으로 루프가 돌아옴.


No comments:

Post a Comment

Total Pageviews