CHAPTER 5 도트매트릭스제어하기 가. 도트매트릭스제어하기
가. 도트매트릭스제어하기 단일 LED와는다르게도트매트릭스를구동시는구동전류가프로세서에서출력되는전류보다사용량을더많이필요하기때문에 TTL 계열의 IC로구동시키기에는무리가따른다. 이러한문제를해결하기위해서사용전압, 전류정격이높은달링턴트랜지스터가어레이형태로들어있는 ULN2803을이용한다. 이 IC에는 8개의 NPN형의달링턴회로가들어있고인터페이스레벨은 TTL, CMOS 등의모든장치와연결가능하다. 달링턴회로란하나의트랜지스터의이미터전류가또다른트랜지스터의베이스전류가되도록접속하고두개의트랜지스터의 collector를같은부하에접속하도록구현한것으로특징은전류증폭으로전류증폭률이각개의값에거의곱이된다. 그림 4.23에서전류허용량을늘리기위해사용하며, 1번핀에 HIGH를주면아래그림처럼전류가이동하는것이다. High 1 12VDC [ 그림 4.23] ULN2803 Pin 구조 간단히설명하자면 ULN2803은 High-Current Darlington Arrays으로 sink driver이다. 입력을받는라인을통해전류를공통부로빼주는역할을하며주로사용하는곳은 LED의 + -극을동시에컨트롤해야하는경우에많이쓰인다. 회로에연결을하는경우출력방향에 LED의 -극에연결을한다. 그림 4.24와같이 A2982SLW의경우 ULN2803과사용용도는동일하며, 동작원리는반대로사용된다. GND 12VDC [ 그림 4.24] ULN2803 Pin 구조
2단원의구성중 CRX10의구조에서회로를참고하여보면이해가더욱쉽다. 아래실습을통하여도트매트릭스의사용방법과원리를이해하고넘어가도록한다. CRX10의도트매트릭스는 PORTA와 PORTC에연결되어있으며, 두개의포트에 High를입력하면좌표에따른 LED가켜지게된다. 1) 활용실습 Q : 4.8_ 도트매트릭스전체켜기실습 PORTA=0xFF; Q : 4.9_ 도트매트릭스전체끄기실습
PORTA=0xFF; PORTC=0x00; 참고 : 본과정의초반은학생들에게도트매트릭스의주소와 16진수의개념을돕기위해도트매트릭스의주소별 ON/OFF에대한반복학습을진행합니다. Q : 4.10_ 도트매트릭스 1번세로라인만켜기 PORTA=0x01; Q : 4.11_ 도트매트릭스 2 번세로라인만켜기
PORTA=0x02; Q : 4.12_ 도트매트릭스 3 번세로라인만켜기 PORTA=0x04;
Q : 4.13_ 도트매트릭스 4 번세로라인만켜기 PORTA=0x08; Q : 4.14_ 도트매트릭스 5 번세로라인만켜기 PORTA=0x10;
Q : 4.15_ 도트매트릭스 6 번세로라인만켜기 PORTA=0x20; Q : 4.16_ 도트매트릭스 7 번세로라인만켜기 PORTA=0x40;
Q : 4.17_ 도트매트릭스 8 번세로라인만켜기 PORTA=0x80; Q : 4.18_ 도트매트릭스 1 번가로라인만켜기
PORTA=0xFF; PORTC=0x01; Q : 4.19_ 도트매트릭스 2 번가로라인만켜기 PORTA=0xFF; PORTC=0x02; Q : 4.20_ 도트매트릭스 3 번가로라인만켜기
PORTA=0xFF; PORTC=0x04; Q : 4.21_ 도트매트릭스 4 번가로라인만켜기 PORTA=0xFF; PORTC=0x08; Q : 4.22_ 도트매트릭스 5 번가로라인만켜기
PORTA=0xFF; PORTC=0x10; Q : 4.23_ 도트매트릭스 6 번가로라인만켜기 PORTA=0xFF; PORTC=0x20;
Q : 4.24_ 도트매트릭스 7 번가로라인만켜기 PORTA=0xFF; PORTC=0x40; Q : 4.25_ 도트매트릭스 8 번가로라인만켜기 PORTA=0xFF; PORTC=0x80;
Q : 4.26_ 도트매트릭스세로방향으로 0x00 부터 0xff 라인까지깜박이며순차적 으로이동하기 void m_delay(unsigned int k) unsigned int i, j; for(i=0; i<2560; i++) for(j=0; j<k; j++); unsigned int cnt; for(cnt=0; cnt<8; cnt++) PORTA=0x01<<cnt; m_delay(50);
Q : 4.27_ 도트매트릭스의중심을기준으로영문 X 를만들어오른쪽으로회전시 키기 void m_delay(unsigned int k) unsigned int i, j; for(i=0; i<500; i++) for(j=0; j<k; j++); PORTA=0x81; PORTC=0x01; PORTA=0x42; PORTC=0x02; PORTA=0x24; PORTC=0x04; PORTA=0x18; PORTC=0x08; PORTA=0x18; PORTC=0x10; PORTA=0x24; PORTC=0x20;
PORTA=0x42; PORTC=0x40; PORTA=0x81; PORTC=0x80; m_delay(100); PORTA=0x10; PORTC=0x01; PORTA=0x10; PORTC=0x02; PORTA=0x10; PORTC=0x04; PORTA=0x10; PORTC=0x08; PORTA=0xFF; PORTC=0x10; PORTA=0x10; PORTC=0x20; PORTA=0x10; PORTC=0x40; PORTA=0x10; PORTC=0x80; m_delay(100);
Q : 4.28_ 도트매트릭스에 A 출력하기 void m_delay(unsigned int k) unsigned int i, j; for(i=0; i<500; i++) for(j=0; j<k; j++); PORTA=0x02; PORTC=0xFE; PORTA=0x04; PORTA=0x08; PORTC=0x1B; PORTA=0x10; PORTC=0x1B; PORTA=0x20; PORTA=0x40; PORTC=0xFE;
Q : 4.29_ 도트매트릭스에 A 출력하고한번씩깜박이게하기 void m_delay(unsigned int k) unsigned int i, j; for(i=0; i<500; i++) for(j=0; j<k; j++); PORTA=0x02; PORTC=0xFE; PORTA=0x04; PORTA=0x08; PORTC=0x1B; PORTA=0x10; PORTC=0x1B;
PORTA=0x20; PORTA=0x40; PORTC=0xFE; PORTA=0xFF; PORTC=0x00; m_delay(500); Q : 4.30_ 도트매트릭스에본인영문이니셜을한자씩출력하여아래에서위쪽 으로지나가게하기 #include<util/delay.h> #define dot_j 0 #define dot_h 1 #define dot_y 2 unsigned char ccc[8] = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 ; unsigned char row[3][8] = 0x00, 0x70, 0xF0, 0xC0, 0xC0, 0xFF, 0x7E, 0x00, 0x00, 0xFF, 0xFE, 0x18, 0x18, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0x1E, 0xF8, 0xF8, 0x1F, 0x0E, 0x00; void shift(int n,int time) int w,v,l,i; unsigned char buf[8];
for(v=7;v>=1;v--) for(w=0;w<8;w++) buf[w]=row[n][w]<<v; for(l=0;l<time;l++) for(i=0;i<8;i++) PORTA=ccc[i]; PORTC=buf[i]; _delay_ms(2); for(v=0;v<8;v++) for(w=0;w<8;w++) buf[w]=row[n][w]>>v; for(l=0;l<time;l++) for(i=0;i<8;i++) PORTA=ccc[i]; PORTC=buf[i]; _delay_ms(2); shift(dot_j,50); shift(dot_h,50); shift(dot_y,50);
4.31_ 도트매트릭스에본인영문이니셜을한자씩출력하여아래에서위쪽 Q : 으로지나가게하면서 1 번에서 3 번까지의 LED 가오른쪽으로순차적으로 깜박이게하기 #include<util/delay.h> #define dot_j 0 #define dot_h 1 #define dot_y 2 unsigned char ccc[8] = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 ; unsigned char row[3][8] = 0x00, 0x70, 0xF0, 0xC0, 0xC0, 0xFF, 0x7E, 0x00, 0x00, 0xFF, 0xFE, 0x18, 0x18, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0x1E, 0xF8, 0xF8, 0x1F, 0x0E, 0x00; void m_delay(unsigned int k) unsigned int i, j; for(i=0; i<2560; i++) for(j=0; j<k; j++); void shift(int n,int time) int w,v,l,i; unsigned char buf[8]; for(v=7;v>=1;v--) for(w=0;w<8;w++) buf[w]=row[n][w]<<v;
for(l=0;l<time;l++) for(i=0;i<8;i++) PORTA=ccc[i]; PORTC=buf[i]; _delay_ms(2); for(v=0;v<8;v++) for(w=0;w<8;w++) buf[w]=row[n][w]>>v; for(l=0;l<time;l++) for(i=0;i<8;i++) PORTA=ccc[i]; PORTC=buf[i]; _delay_ms(2); DDRE=0xFF; DDRB=0xFF; shift(dot_j,50); shift(dot_h,50); shift(dot_y,50); PORTB=0x80; PORTE=0x20; m_delay(100);
PORTB=0x90; PORTE=0xC0; m_delay(100); PORTB=0x10; PORTE=0x20; m_delay(100); Q : 4.32_ 도트매트릭스의첫째열만을이용하여자기이름 ( 영문 ) 쓰기 void m_delay(unsigned int k) unsigned int i, j; for(i=0; i<6000; i++) for(j=0; j<k; j++); PORTA=0x01; PORTC=0x00; PORTC=0x70; PORTC=0xF0;
PORTC=0xC0; PORTC=0x7E; PORTC=0x00; PORTC=0x00; PORTC=0xFE; PORTC=0x18; PORTC=0x18; PORTC=0xFE; PORTC=0x00; PORTC=0x00; PORTC=0x0F; PORTC=0x1E; PORTC=0xF8; PORTC=0xF8; PORTC=0x1F;
PORTC=0x0E; PORTC=0x00; 2) 응용문제 1 0 ~ 9 까지의숫자를순차적으로 Display 하는프로그램을구현하기