주요 포인트 :
맨 아래에 데이터시트(?)를 보면 알겠지만 X축(컬러 선택,GND)이던, Y축(LED배열 하나 선택,VCC)이던
하나의 반복문에 넣어버리면 사각형 형태 이외의 모양으로 출력할 방법이 없다.
따라서 TV에서 사용되는 주사선을 방식을 모방해 라인 바이 라인으로 X축 배열을 빠르게 쏴주면서(delay_ms참조)
Y축에서는 LED를 선택적으로 ON시키는 방식으로 작성했다.
아무런 문제없이 잘 동작했다.
#include <mega128.h>
#include <delay.h>
void LED_On(unsigned char *shape, int color, int time);
void main(void){
unsigned char heart1[8] = {0b00000000,
0b00000000,
0b01100110,
0b11111111,
0b01111110,
0b00111100,
0b00011000,
0b00000000};
unsigned char heart2[8] = {0b00000000,
0b01100110,
0b11111111,
0b01111110,
0b00111100,
0b00011000,
0b00000000};
unsigned char heart3[8] = {0b01100110,
0b11111111,
0b01111110,
0b00111100,
0b00011000,
0b00000000,
0b00000000};
unsigned char smile[8] = {0b00000000,
0b00000000 ,
0b01000010,
0b10100101,
0b00000000,
0b00111100,
0b00000000};
unsigned char sa[8] = {0b00000000,
0b01001100,
0b01010010 ,
0b11100001,
0b01000000,
0b01000000,
0b00000000};
unsigned char rang[8] = {0b01011111,
0b01010000 ,
0b11011111,
0b01000001,
0b01011111,
0b00111100,
0b00011000};
unsigned char hae[8] = {0b00001000,
0b10111111 ,
0b10101100,
0b11110010,
0b10101100,
0b10100000,
0b00000000};
int color; //1green, 2red, 3orange
int time;
int i, j;
DDRB = 0xff; //green
DDRD = 0xff; //red
DDRC = 0xff; //data
while(1){
//shape, color, time(ms), 즉 모양 배열,
LED_On(sa, 3, 40);
LED_On(rang, 3, 40);
LED_On(hae, 3, 40);
LED_On(heart1, 2, 10);
LED_On(heart2, 2, 10);
LED_On(heart3, 2, 10);
LED_On(smile, 1, 40);
}
}
void LED_On(unsigned char *shape, int color, int time){
int i;
int cool_time=0; //1프레임의 지속시간과 연관
unsigned char line[8] = {0b11111110,
0b11111101,
0b11111011,
0b11110111,
0b11101111,
0b11011111,
0b10111111,
0b01111111};
while(cool_time<time){
for(i=0; i<8; i++){
if(color==1){
PORTC = shape[i];
PORTB = line[i];
PORTD = 0xff;
delay_ms(2);
}
if(color==2){
PORTC = shape[i];
PORTD = line[i];
PORTB = 0xff;
delay_ms(2);
}
if(color==3){
PORTC = shape[i];
PORTD = line[i];
PORTB = line[i];
delay_ms(2);
}
}
cool_time++;
}
}
풀어야 할 숙제 :
S/W : Line 변수[]는 배열이 아닌 시프트 연산으로 바꾸는게 좋을것 같다.
H/W : 3개의 포트를 사용하는데 포트를 줄일 수 있는 방법을 찾아봐야될것 같다. X축(컬러 선택)을 하나하나 따서 그렇다..
동작화면
<도트매트릭스 내부구조>
<도트매트릭스 내부 구조>
●Green(x축, 위에서부터 24,21,18,15,1,4,7,10)
●Red (x축, 위에서부터 23,20,17,14,2,5,8,11)
ㅁ데이터 Y축 한줄(왼쪽부터 22,19,16,13,3,6,9,12)
(참고로 Green과 Red 동시에 넣으면 Orange색 들어옴)
'C/C++' 카테고리의 다른 글
오버로딩시 주의사항 (0) | 2013.09.26 |
---|---|
C언어 포인터 및 형변환 총정리 (0) | 2013.09.12 |
포인터로 배열 주고받기 (0) | 2013.09.09 |
c언어 동적할당 (0) | 2013.05.05 |
C언어 파일 + 구조체 (0) | 2013.05.05 |