• 검색 결과가 없습니다.

도트 매트릭스 제어하기

N/A
N/A
Protected

Academic year: 2022

Share "도트 매트릭스 제어하기"

Copied!
24
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

CHAPTER 5

도트 매트릭스 제어하기

가. 도트 매트릭스 제어하기

(2)

가. 도트매트릭스 제어하기

단일 LED와는 다르게 도트매트릭스를 구동 시는 구동 전류가 프로세서에서 출력 되는 전류보다 사용량을 더 많이 필요하기 때문에 TTL 계열의 IC로 구동시키기에 는 무리가 따른다. 이러한 문제를 해결하기 위해서 사용 전압, 전류 정격이 높은 달 링턴 트랜지스터가 어레이 형태로 들어 있는 ULN2803을 이용한다. 이 IC에는 8개의 NPN형의 달링턴 회로가 들어 있고 인터페이스 레벨은 TTL, CMOS 등의 모든 장치 와 연결 가능하다. 달링턴 회로란 하나의 트랜지스터의 이미터 전류가 또 다른 트 랜지스터의 베이스 전류가 되도록 접속하고 두개의 트랜지스터의 collector를 같은 부하에 접속하도록 구현한 것으로 특징은 전류 증폭으로 전류증폭률이 각개의 값에 거의 곱이 된다.

그림 4.23에서 전류허용량을 늘리기 위해 사용하며, 1번 핀에 HIGH를 주면 아래 그림처럼 전류가 이동하는 것이다.

12VDC High 1

[그림 4.23] ULN2803 Pin 구조

간단히 설명하자면 ULN2803은 High-Current Darlington Arrays으로 sink driver이 다. 입력을 받는 라인을 통해 전류를 공통부로 빼주는 역할을 하며 주로 사용하는 곳은 LED의 + -극을 동시에 컨트롤해야 하는 경우에 많이 쓰인다. 회로에 연결을 하는 경우 출력 방향에 LED의 -극에 연결을 한다. 그림 4.24와 같이 A2982SLW의 경우 ULN2803과 사용용도는 동일하며, 동작원리는 반대로 사용된다.

12VDC

GND

[그림 4.24] ULN2803 Pin 구조

(3)

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

2단원의 구성 중 CRX10의 구조에서 회로를 참고하여 보면 이해가 더욱 쉽다. 아 래 실습을 통하여 도트매트릭스의 사용방법과 원리를 이해하고 넘어가도록 한다.

CRX10의 도트매트릭스는 PORTA와 PORTC에 연결되어있으며, 두 개의 포트에 High를 입력하면 좌표에 따른 LED가 켜지게 된다.

1) 활용 실습

Q : 4.8_ 도트매트릭스 전체 켜기 실습

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0xFF;

} }

Q : 4.9_ 도트매트릭스 전체 끄기 실습

(4)

while(1) {

PORTA=0xFF;

PORTC=0x00;

}

※ 참고 :

본 과정의 초반은 학생들에게 도트매트릭스의 주소와 16진수의 개념을 돕기 위 해 도트매트릭스의 주소별 ON/OFF에 대한 반복학습을 진행합니다.

A :

#include<avr/io.h>

Q : 4.10_ 도트매트릭스 1번 세로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x01;

PORTC=0xFF;

} }

Q : 4.11_ 도트매트릭스 2번 세로 라인만 켜기

(5)

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x02;

PORTC=0xFF;

} }

Q : 4.12_ 도트매트릭스 3번 세로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x04;

PORTC=0xFF;

} }

(6)

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x10;

PORTC=0xFF;

} }

Q : 4.13_ 도트매트릭스 4번 세로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x08;

PORTC=0xFF;

} }

Q : 4.14_ 도트매트릭스 5번 세로 라인만 켜기

(7)

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x40;

Q : 4.15_ 도트매트릭스 6번 세로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x20;

PORTC=0xFF;

} }

Q : 4.16_ 도트매트릭스 7번 세로 라인만 켜기

(8)

PORTC=0xFF;

} }

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

Q : 4.17_ 도트매트릭스 8번 세로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x80;

PORTC=0xFF;

} }

Q : 4.18_ 도트매트릭스 1번 가로 라인만 켜기

(9)

while(1) {

PORTA=0xFF;

PORTC=0x01;

} }

A :

#include<avr/io.h>

void main()

Q : 4.19_ 도트매트릭스 2번 가로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x02;

} }

Q : 4.20_ 도트매트릭스 3번 가로 라인만 켜기

(10)

{

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x04;

} }

A :

Q : 4.21_ 도트매트릭스 4번 가로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x08;

} }

Q : 4.22_ 도트매트릭스 5번 가로 라인만 켜기

(11)

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x10;

} }

Q : 4.23_ 도트매트릭스 6번 가로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x20;

} }

(12)

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x80;

} }

Q : 4.24_ 도트매트릭스 7번 가로 라인만 켜기

A :

#include<avr/io.h>

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0xFF;

PORTC=0x40;

} }

Q : 4.25_ 도트매트릭스 8번 가로 라인만 켜기

(13)

Q : 4.26_ 도트매트릭스 세로 방향으로 0x00부터 0xff라인까지 깜박이며 순차적 으로 이동하기

A :

#include<avr/io.h>

void m_delay(unsigned int k) {

unsigned int i, j;

for(i=0; i<2560; i++) for(j=0; j<k; j++);

}

void main() {

unsigned int cnt;

DDRA=0xFF;

DDRC=0xFF;

while(1) {

for(cnt=0; cnt<8; cnt++) {

PORTA=0x01<<cnt;

PORTC=0xFF;

m_delay(50);

} }

}

(14)

A :

#include<avr/io.h>

void m_delay(unsigned int k) {

unsigned int i, j;

for(i=0; i<500; i++) for(j=0; j<k; j++);

}

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x81;

PORTC=0x01;

m_delay(1);

PORTA=0x42;

PORTC=0x02;

m_delay(1);

PORTA=0x24;

PORTC=0x04;

m_delay(1);

PORTA=0x18;

PORTC=0x08;

m_delay(1);

PORTA=0x18;

PORTC=0x10;

m_delay(1);

PORTA=0x24;

PORTC=0x20;

Q : 4.27_ 도트매트릭스의 중심을 기준으로 영문X를 만들어 오른쪽으로 회전시 키기

(15)

m_delay(1);

PORTA=0x42;

PORTC=0x40;

m_delay(1);

PORTA=0x81;

PORTC=0x80;

m_delay(100);

PORTA=0x10;

PORTC=0x01;

m_delay(1);

PORTA=0x10;

PORTC=0x02;

m_delay(1);

PORTA=0x10;

PORTC=0x04;

m_delay(1);

PORTA=0x10;

PORTC=0x08;

m_delay(1);

PORTA=0xFF;

PORTC=0x10;

m_delay(1);

PORTA=0x10;

PORTC=0x20;

m_delay(1);

PORTA=0x10;

PORTC=0x40;

m_delay(1);

PORTA=0x10;

PORTC=0x80;

m_delay(100);

} }

(16)

A :

#include<avr/io.h>

void m_delay(unsigned int k) {

unsigned int i, j;

for(i=0; i<500; i++) for(j=0; j<k; j++);

}

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x02;

PORTC=0xFE;

m_delay(1);

PORTA=0x04;

PORTC=0xFF;

m_delay(1);

PORTA=0x08;

PORTC=0x1B;

m_delay(1);

PORTA=0x10;

PORTC=0x1B;

m_delay(1);

PORTA=0x20;

PORTC=0xFF;

m_delay(1);

PORTA=0x40;

PORTC=0xFE;

Q : 4.28_ 도트매트릭스에 A출력하기

(17)

m_delay(1);

} }

A :

#include<avr/io.h>

void m_delay(unsigned int k) {

unsigned int i, j;

for(i=0; i<500; i++) for(j=0; j<k; j++);

}

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x02;

PORTC=0xFE;

m_delay(1);

PORTA=0x04;

PORTC=0xFF;

m_delay(1);

PORTA=0x08;

PORTC=0x1B;

m_delay(1);

PORTA=0x10;

PORTC=0x1B;

Q : 4.29_ 도트매트릭스에 A출력하고 한번 씩 깜박이게 하기

(18)

m_delay(1);

PORTA=0x20;

PORTC=0xFF;

m_delay(1);

PORTA=0x40;

PORTC=0xFE;

m_delay(1);

PORTA=0xFF;

PORTC=0x00;

m_delay(500);

} }

A :

#include<avr/io.h>

#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];

Q : 4.30_ 도트매트릭스에 본인 영문 이니셜을 한자씩 출력하여 아래에서 위쪽 으로 지나가게 하기

(19)

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);

} }

} }

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

shift(dot_j,50);

shift(dot_h,50);

shift(dot_y,50);

}

(20)

}

A :

#include<avr/io.h>

#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;

} Q :

4.31_ 도트매트릭스에 본인 영문 이니셜을 한자씩 출력하여 아래에서 위쪽 으로 지나가게 하면서 1번에서 3번까지의 LED가 오른쪽으로 순차적으로 깜박이게 하기

(21)

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);

} }

} }

void main() {

DDRA=0xFF;

DDRC=0xFF;

DDRE=0xFF;

DDRB=0xFF;

while(1) {

shift(dot_j,50);

shift(dot_h,50);

shift(dot_y,50);

PORTB=0x80;

PORTE=0x20;

m_delay(100);

(22)

PORTB=0x90;

PORTE=0xC0;

m_delay(100);

PORTB=0x10;

PORTE=0x20;

m_delay(100);

} }

A :

#include<avr/io.h>

void m_delay(unsigned int k) {

unsigned int i, j;

for(i=0; i<6000; i++) for(j=0; j<k; j++);

}

void main() {

DDRA=0xFF;

DDRC=0xFF;

while(1) {

PORTA=0x01;

PORTC=0x00;

m_delay(1);

PORTC=0x70;

m_delay(1);

PORTC=0xF0;

Q : 4.32_ 도트매트릭스의 첫째 열만을 이용하여 자기이름(영문) 쓰기

(23)

m_delay(1);

PORTC=0xC0;

m_delay(1);

PORTC=0xFF;

m_delay(1);

PORTC=0x7E;

m_delay(1);

PORTC=0x00;

m_delay(1);

PORTC=0x00;

m_delay(1);

PORTC=0xFF;

m_delay(1);

PORTC=0xFE;

m_delay(1);

PORTC=0x18;

m_delay(1);

PORTC=0x18;

m_delay(1);

PORTC=0xFF;

m_delay(1);

PORTC=0xFE;

m_delay(1);

PORTC=0x00;

m_delay(1);

PORTC=0x00;

m_delay(1);

PORTC=0x0F;

m_delay(1);

PORTC=0x1E;

m_delay(1);

PORTC=0xF8;

m_delay(1);

PORTC=0xF8;

m_delay(1);

PORTC=0x1F;

m_delay(1);

(24)

PORTC=0x0E;

m_delay(1);

PORTC=0x00;

m_delay(1);

} }

2) 응용문제

①‘0’~‘9’까지의 숫자를 순차적으로 Display 하는 프로그램을 구현하기

참조

관련 문서

• 수험표, 학생증(주민등록증)은 실기고사 시 반드시 지참하여야 하며 수험표를 분실하였을 경우 인터넷 원서접수 사이트에서 수험표를 재출력하여 사용한다..

 가치는 가정관리의 기초가 되며 가정관리자에게 무엇이 바람직하고 무엇을 해야 하는가를 나타내주는 기초적인 의미를 제공함---명시적인 상태로 밝히는

- 회로에 흐르는 전류의 방향과 크기가 일정한 전류를 직류(direct current) 라고 한다... 기전력이란 용어는 전기를 일으키는 힘이라는

• 원가 효율성, 현지 대응 그리고 학습을 동시에 추구하 고자 하는 전략.

이러한 역할을 하는 compute( ) 함수를 완 성하여 이

 전지등과 같이 기전력을 가지고 있어 전류를 흘리는 원동력이 되는 것을 전원 (power source)이라고 하며, 전원에서 전기를 받아 전류를 흐르게 하여 어떤 일

평방은 주간이 하중을 받는 구조, 또는 주간포를 사용하는 건물에서 공포를 안정되게 올려 놓을 수 있는 받침으로서 상부 하중을 기둥에 전달하는 역할을 한다..

선행사를 포함하는 관계대명사 what이 이끄는 명사절로 문장의 주어 역할을 하는 What matters, 주격 보어 역할을 하는 동명사 knowing, ‘~하는 방법’을 뜻하는