출처 : 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