다양한 방법을 통해 MCU의 비트를 제어할 수 있습니다.
(The bit of MCU can control through many method.)
아래와 같이 간단한 정의를 통해 비트 제어를 정의하고 수행될 수 있습니다.
(As below, through the simple definitions the bit control can be defined ans executed.)
1. 하나의 비트를 "1"로 Set 하기
(1. one of bit set to "1")
#define sbi(PORTX,BITX) PORTX|=(1<<BITX)
-For Example
PORTA=0xBF; //ob10111111
sbi(PORTA,7); // PORTA|=0x40; or PORTA|=64;
만약 여러 비트를 set하고 싶다면 아래와 같은 명령어를 사용하면 된다.
(If you want to be the set of several bits, you can used like as below.)
#define sbis(PORTX,BITX) PORTX|=BITX;
-For Example
PORTA=0x0F;
sbis(PORTA,0xF0);
2. 하나의 비트를 "0"로 Clear 하기
(2. one of bit clear to "0")
#define cbi(PORTX,BITX) PORTX&=~(1<<BITX)
- For example
PORTA=0xFF; //ob11111111
cbi(PORTA,8);PORTA&=~0x80;
만약 여러 비트를 clear 하고 싶다면 아래와 같은 명령어를 사용하면 된다.
(If you want to be the clear of several bits, you can used like as below.)
#define sbis(PORTX,BITX) PORTX|=BITX;
-For Example
PORTA=0x0F;
cbis(PORTA,0x0F); //PORTA&=~0x0F;
2014년 7월 20일 일요일
[AVR] IIC/I2C/TWI 2004 20X4 Character Liquid Crystal Display Module / #2 TWI Communications for the hardware configuration
8bit AVR MCU에 TWI(I2C) 통신 기능을 활용하여 20x4 LCD Display Module을 제어하려고 한다면 필수적으로 TWI(I2C)에 대해 알아야 합니다.
TWI(Two Wire Inctertace)는 우리가 흔이 알고 있는 I2C(Inter_Integrated Circuit)와 같은 통신 방식으로 Mega128에서는 TWI라고 부릅니다. I2C는 필립스에서 개발한 직렬 컴퓨터 버스 이며 주변기기들과 저속의 통신을 위해 개발되었습니다. 통신을 위해 필요한 단자는 단 2개의 (SCL, SDA) 이며 다수의 장치를 한번에 연결하여 통신할 수 있습니다.
아래 그림은 다수의 장치가 연결된 형태입니다.
I2C 통신 라인을 통하여 Master (MCU)에 여러 장치들(Slave)이 연결되어 있는 형태입니다. 각각의 장치들은 자신들만의 고유한 주소를 가지고 있어 Master는 주소를 지정하여 장치를 선택하고 선택된 장치와 통신을 할 수 있습니다. 만약 중복되는 주소를 갖는 장치가 있다면 Master로 부터 명령이 제대로 전달되지 않고 통신을 할 수 없는 상태가 되기 때문에 각 장치들은 중복되지 않는 주소를 갖고 있어야 합니다. 따라서 각 장치들은 별도의 Address select 기능을 갖고 있어 주소가 중복되지 않도록 설정할 수 있습니다. ATmega128의 경우 최대 128개 까지 연결 할 수 있도록 설계되어 있습니다.
아래 회로도는 20x4 LCD를 연결한 회로도 입니다.
PCF8574T의 ADDRESS SELECT는 0x40으로 선택되어 있습니다. 따라서 TWI(I2C)통신을 할때 명령을 읽고 쓰기 위해서 주소를 0x40을 사용해야 합니다.
I2C 통신에서 빠지지 말아야할 것은 SCL과 SDA는 항상 VDD와 저항을 통해 Pull-up 상태를 유지해야 합니다. 만약 그렇지 않는 경우 아래와 같이 SDA, SCL Signal이 정확한 구형파형을 만들지 못하여 통신 오류가 발생하게 됩니다.
ATmega128에 최대 TWI통신 속도는 400㎑ 입니다. 따라서 400㎑ 이하의 장치는 모두 호환되며 각 장치마다 통신속도가 다르더라도 1:1 통신이기 때문에 그 속도를 가변하여 통신할 수 도 있습니다. 우리가 사용할 20x4 LCD Module에 장착된 PCF8574 I2C I/O Expander IC의 최대 통신속도는 100㎑ 이므로 통신속도를 100㎑ 이하로 설정해야만 정확한 통신이 가능합니다.
TWI(Two Wire Inctertace)는 우리가 흔이 알고 있는 I2C(Inter_Integrated Circuit)와 같은 통신 방식으로 Mega128에서는 TWI라고 부릅니다. I2C는 필립스에서 개발한 직렬 컴퓨터 버스 이며 주변기기들과 저속의 통신을 위해 개발되었습니다. 통신을 위해 필요한 단자는 단 2개의 (SCL, SDA) 이며 다수의 장치를 한번에 연결하여 통신할 수 있습니다.
아래 그림은 다수의 장치가 연결된 형태입니다.
I2C 통신 라인을 통하여 Master (MCU)에 여러 장치들(Slave)이 연결되어 있는 형태입니다. 각각의 장치들은 자신들만의 고유한 주소를 가지고 있어 Master는 주소를 지정하여 장치를 선택하고 선택된 장치와 통신을 할 수 있습니다. 만약 중복되는 주소를 갖는 장치가 있다면 Master로 부터 명령이 제대로 전달되지 않고 통신을 할 수 없는 상태가 되기 때문에 각 장치들은 중복되지 않는 주소를 갖고 있어야 합니다. 따라서 각 장치들은 별도의 Address select 기능을 갖고 있어 주소가 중복되지 않도록 설정할 수 있습니다. ATmega128의 경우 최대 128개 까지 연결 할 수 있도록 설계되어 있습니다.
아래 회로도는 20x4 LCD를 연결한 회로도 입니다.
PCF8574T의 ADDRESS SELECT는 0x40으로 선택되어 있습니다. 따라서 TWI(I2C)통신을 할때 명령을 읽고 쓰기 위해서 주소를 0x40을 사용해야 합니다.
I2C 통신에서 빠지지 말아야할 것은 SCL과 SDA는 항상 VDD와 저항을 통해 Pull-up 상태를 유지해야 합니다. 만약 그렇지 않는 경우 아래와 같이 SDA, SCL Signal이 정확한 구형파형을 만들지 못하여 통신 오류가 발생하게 됩니다.
ATmega128에 최대 TWI통신 속도는 400㎑ 입니다. 따라서 400㎑ 이하의 장치는 모두 호환되며 각 장치마다 통신속도가 다르더라도 1:1 통신이기 때문에 그 속도를 가변하여 통신할 수 도 있습니다. 우리가 사용할 20x4 LCD Module에 장착된 PCF8574 I2C I/O Expander IC의 최대 통신속도는 100㎑ 이므로 통신속도를 100㎑ 이하로 설정해야만 정확한 통신이 가능합니다.
2014년 7월 8일 화요일
[AVR] 7-SEGMENT 구동하기 #1. 7-SEGMENT 의 구성 및 동작 원리
개발보드에 7-SEGMENT 회로는 아래와 같다.
PORT.A를 통해 74HC595 와 74LS138 IC를 제어하여 8자리 7-SEGMENT를 구동시키는 회로이다. 일반적으로 1개 포트를 사용해 1개의 7-SEGMENT를 제어할 수 있는데 PORT.A만으로 8개의 7-SEGMENT를 제어할 수 있어 적은 I/O를 최대한 활용하는데 최적의 회로라고 생각한다.
7-SEGMENT를 제어함에 있어 몇가지 하드웨어를 어떻게 구성할 것인지 생각할 필요가 있다.
아래 그림과 같이 7-SEGMENT는 Common cathode와 Common anode 2가지 타입이 있다. 이 두가지의 가장큰 차이점은 공통 전극이 VCC 또는 GND 인지의 여부다.
아래와 같이 LED를 PORT.A와 연결했다 가정했을 때를 알아보면 쉽게 이해할 수 있다.
- Common Cathode
: PORTA를 통해 출력을 LOW (0) 로 만들면 7-SEGMENT에 불이 꺼지고 HIGH(1)를 출력하면 불을 켤 수 있다.
- Common Anode
: PORTA를 통해 출력을 HIGH(1)로 만들면 7-SEGMENT에 불이 꺼지고 LOW(0)를 출력하면 불을 켤 수 있다.
PORT.A를 통해 74HC595 와 74LS138 IC를 제어하여 8자리 7-SEGMENT를 구동시키는 회로이다. 일반적으로 1개 포트를 사용해 1개의 7-SEGMENT를 제어할 수 있는데 PORT.A만으로 8개의 7-SEGMENT를 제어할 수 있어 적은 I/O를 최대한 활용하는데 최적의 회로라고 생각한다.
7-SEGMENT를 제어함에 있어 몇가지 하드웨어를 어떻게 구성할 것인지 생각할 필요가 있다.
아래 그림과 같이 7-SEGMENT는 Common cathode와 Common anode 2가지 타입이 있다. 이 두가지의 가장큰 차이점은 공통 전극이 VCC 또는 GND 인지의 여부다.
아래와 같이 LED를 PORT.A와 연결했다 가정했을 때를 알아보면 쉽게 이해할 수 있다.
- Common Cathode
: PORTA를 통해 출력을 LOW (0) 로 만들면 7-SEGMENT에 불이 꺼지고 HIGH(1)를 출력하면 불을 켤 수 있다.
- Common Anode
: PORTA를 통해 출력을 HIGH(1)로 만들면 7-SEGMENT에 불이 꺼지고 LOW(0)를 출력하면 불을 켤 수 있다.
[C언어] 전처리 명령 #include, #define, #undef, #if, #ifdef, #ifndef, #else, #endif
main.c 소스코드를 열어보면 가장 맨 앞에 위치하는 #으로 시작하는 코드들은 모두 전처리 명령이다.
대표적인 전처리 명령은 아래와 같다.
#include : 특정파일의 코드 포함
#define : 매크로 정의
#undef : 정의된 매크로 해제
#if, #ifdef, #ifndef, #else, #endif : 전처리 조건문
★ 전처리 조건문
- 예시#1
: 하나의 정의 내용에 대하여 연관된 다른 정의를 능동적으로 수행하고자 할때 아래와 같이 정의할 수 있다. 예를 들어 16by2 또는 16by4 LCD Display에 DDRAM Address를 정의하고자 한다. 2줄과 4줄 LCD는 각 줄에 시작 주소가 다르므로 아래와 같이 코드를 작성한다면 lcd_row 에 정의된 값에 따라 능동적으로 시킬 수 있다.
#define lcd_row=4
#define LCD_START_LINE1 0x00
#if LCD_DRIVER==KS0074
#elif lcd_row==4 // << lcd_row가 4이므로 1~4줄에 시작 주소를 정의함.
#define LCD_START_LINE2 0x20
#define LCD_START_LINE3 0x40
#define LCD_START_LINE4 0x60
#elif lcd_row==2 // << lcd_row가 2일 때 1~2 줄에 시작 주소를 정의함.
#define LCD_START_LINE2 0x40
#endif
- 예시 #2
: 주로 header file을 포함시키고 다른 코드에서 중복으로 사용되는 경우가 있다. 이때 이미 정의된것이 있다면 중복 정의 되지 않도록 코드를 작성할 수 있다. 예를 들어 LCD_H라는 정의가 되어 있지 않다면 #ifndef LCD_H 부터 #endif 사이에 작성된 정의를 수행하도록 하는 코드이다.
#ifndef LCD_H
#define LCD_H
/*
정의 내용 작성
*/
#endif
대표적인 전처리 명령은 아래와 같다.
#include : 특정파일의 코드 포함
#define : 매크로 정의
#undef : 정의된 매크로 해제
#if, #ifdef, #ifndef, #else, #endif : 전처리 조건문
★ 전처리 조건문
- 예시#1
: 하나의 정의 내용에 대하여 연관된 다른 정의를 능동적으로 수행하고자 할때 아래와 같이 정의할 수 있다. 예를 들어 16by2 또는 16by4 LCD Display에 DDRAM Address를 정의하고자 한다. 2줄과 4줄 LCD는 각 줄에 시작 주소가 다르므로 아래와 같이 코드를 작성한다면 lcd_row 에 정의된 값에 따라 능동적으로 시킬 수 있다.
#define lcd_row=4
#define LCD_START_LINE1 0x00
#if LCD_DRIVER==KS0074
#elif lcd_row==4 // << lcd_row가 4이므로 1~4줄에 시작 주소를 정의함.
#define LCD_START_LINE2 0x20
#define LCD_START_LINE3 0x40
#define LCD_START_LINE4 0x60
#elif lcd_row==2 // << lcd_row가 2일 때 1~2 줄에 시작 주소를 정의함.
#define LCD_START_LINE2 0x40
#endif
- 예시 #2
: 주로 header file을 포함시키고 다른 코드에서 중복으로 사용되는 경우가 있다. 이때 이미 정의된것이 있다면 중복 정의 되지 않도록 코드를 작성할 수 있다. 예를 들어 LCD_H라는 정의가 되어 있지 않다면 #ifndef LCD_H 부터 #endif 사이에 작성된 정의를 수행하도록 하는 코드이다.
#ifndef LCD_H
#define LCD_H
/*
정의 내용 작성
*/
#endif
[C언어] 헤더 선언 #include
Avrstudio 4.x 를 기준으로 '#include' 선언에 대하여 설명하도록 하겠다.
1. Header로 선언 할 수 있는 내용
- 함수 선언
- 상수의 정의
- 매크로 정의
2. 기본적인 지정경로의 헤더파일 지정 : 컴파일러에서 제공하는 헤더파일
- 형식 : #include<xxx.h>
* 예시 (1) #include <avr/io.h>
* 예시 (2) $include <util/delay.h>
3. 사용자 정의 헤더파일 : 사용자가 만든 헤더파일
- 형식 : #include"xxx.h"
* 예시 (1) : #include "io.h" // 현재 위치의 헤더파일 지정
* 예시 (2) : #include "./io.h" // 상대 경로의 헤더파일 지정
* 예시 (3) : #include "/test/led_shift/io.h" // 절대경로의 헤더파일 지정
1. Header로 선언 할 수 있는 내용
- 함수 선언
- 상수의 정의
- 매크로 정의
2. 기본적인 지정경로의 헤더파일 지정 : 컴파일러에서 제공하는 헤더파일
- 형식 : #include<xxx.h>
* 예시 (1) #include <avr/io.h>
* 예시 (2) $include <util/delay.h>
3. 사용자 정의 헤더파일 : 사용자가 만든 헤더파일
- 형식 : #include"xxx.h"
* 예시 (1) : #include "io.h" // 현재 위치의 헤더파일 지정
* 예시 (2) : #include "./io.h" // 상대 경로의 헤더파일 지정
* 예시 (3) : #include "/test/led_shift/io.h" // 절대경로의 헤더파일 지정
[AVR] IIC/I2C/TWI 2004 20X4 Character Liquid Crystal Display Module / #1 LCD Display specifications
아두이노에 사용되는 I2C 2004 20X4 Character LCD Module Display를 Mega128를 사용하여 제어할 계획입니다. 아두이노는 간단히 LCD를 제어할 수 있지만 mega128은 포트에 직접 연결하여 제어하는 방식이 일반적이므로 새롭게 I2C로 구동되는 코드를 작성해 볼까 합니다. 우선 LCD 모듈에 사양과 I2C 통신을 통해 포트를 확장해 주는 IC에 사양을 확인해 볼까 합니다.
■ LCD Module specification
- Module size (W x H x T) : 98.0 x 60.0 x 14.0
- Viewing Area (W x H) : 76.0 x 26.0
- Character size (W x H) : 2.94 x 4.74
- Dot size (W x H) : 0.54 x 0.54
- LCD Type & Color : STN : Blue, FSTN
- View angle : 6 0'clock
- Control IC & Package : KS0066 or EQV, COB
- Operating Temperature : -20℃ ~ 70℃
- Storage Temperature : -30℃ ~ 80℃
- Pin connections
(1) VSS - Ground for logic (0V)
(2) VDD - Power supply for logic (+5V)
(3) V0 - Power supply for LCD driver
(4) RS - H:Data ; L:Instruction Code
(5) R/W - H:Read; L:Write
(6) E - Enable signal
(7) ~ (14) DB0~DB7 - Data Bus Line
(15) A - Backlight Power(+5V)
(16) K - Backlight GND (0V)
- Instructions
■ Remote 8-bit I/O expander for I2C-bus
- Controller : PCF8754
- Pin connections
- Addressing
***20x4 LCD 뒷면에 8bit I/O expander for I2C IC(PCF8574T)가 장착되어 있다. 상기 그림 빨간 네모가 ADDRESS Select 를 할 수 있는 단자이다. 하지만 해당 단자는 현대 OPEN상태로 아래 그림과 같이 납땜을 하여 ADDRESS를 0100 000X (0x40)으로 설정해야 한다.
- I2C-bus timing characteristics
*** PCF 8574에 입력가능한 Clock 주파수는 최대 100Khz 이다. 따라서 I2c 통신 속도는 100Khz 이하로 설정해야 한다.
- I2C/TWI 20x4 LCD Character schematic
: 아두이노용 20x4 LCD 모듈은 아래와 같은 회로 이다.
따라서 Data bus를 8bit가 아닌 4bit로 제어해야 한다.
**** 자료 출처 ****
(1) Philips PCF8574 Remote 8-bit I/O expander for I2C-bus Datasheet
(2) QC2004A Datasheet
(3) Systronix 20x4 LCD brief technical data
(1) Philips PCF8574 Remote 8-bit I/O expander for I2C-bus Datasheet
(2) QC2004A Datasheet
(3) Systronix 20x4 LCD brief technical data
[AVR] ATmega128 개발환경 구축하기
안녕하세요.
대학생 학부 시절 임베디드 시스템을 공부하고 4년이 지난 시점에서 취미생활로 작품 활동을 하기 위해 다시 시작하고자 합니다. 직장인이다 보니 바쁜 시간을 쪼개어 시작하려고 하니 머리가 아프네요.
이러한 고민을 해결해주는 아이템으로 최근에 출시된 아두이노와 같은 개발 환경을 갖추면 복잡한 코딩 없이도 누구나 쉽게 센서를 제어할 수 있어 구미가 당겨 집니다. 하지만 코드를 하나하나 짜보면서 하드웨어를 제어하는 것이 진정한 재미 이므로 AVR를 사용한 개발환경을 구축해 볼까 합니다.
먼저 AVR이 무엇인지 살펴보고려고 합니다.
AVR은 1996년 아트멜社에서 개발된 하버드 구조를 갖는 8비트 RISC 방식의 단일칩 마이크로컨트롤러 입니다. 현존하는 대부분의 8비트 마이크로 컨트롤러들은 하버드 아키텍처를 기반으로 제작되었습니다. 따라서 메모리와 데이터 메모리가 서로 분리되어 있어 CPU가 독립적으로 프로그램과 데이터에 접근이 가능한 구조입니다.
아래 블록다이어그램을 보면 Flash Program Memory와 DATA SRAM이 각각 존재하고 있고 Data bus로 연결되어 있는 것을 볼 수 있습니다.
앞서 설명한 하버드 구조의 장점때문에 AVR은 ISP(In-System Programming)기능을 제공하여 손쉽게 내부 FLASH 메모리에 PROGRAM를 저장할 수 있는 기능을 제공합니다. AVR에서 사용되는 ISP는 저렴한 가격에 직접 만들어 쓸 수 있는 장점이 있습니다.
(AVR의 ISP관련 참고 자료 : http://www.atmel.com/images/doc0943.pdf)
필자는 AVR 하드웨어 구축을 위해 아래 사이트에서 10만원으로 구입하여 활용하기로 했습니다.
- 구매이유 : 중국산 AVR 보드 및 다양한 센서를 싼가격에 구입 가능
이곳에서 판매하는 Atmega128 Training KIT 생각보다 저렴한 가격에 구성이 잘되어 있어 좋았지만 막상 프로그램을 코딩하려고 보니 간단한 회로가 아니여서 첫 맨붕을 겪게 해주었습니다. Character LCD는 아두이노에 바로 사용할 수 있도록 만들어져 있어 기존 LCD 제어 코드는 활용이 불가능하여 새로이 I2C로 제어할 수 있도록 만들어야 합니다. 한가지 마음에 드는 점은 AVR ISP가 USB로 되어있어 정말 빠르고 쉽게 펌웨어를 업데이트 할 수 있어 가격대비 성능이 최상이라 생각 됩니다.
예전 같으면 한땀한땀 납땜하여 보드를 만들었을 테지만 많은 시간과 노력이 필요하므로 나중으로 기약하려고 합니다. 조금더 여력이 된다면 대학생때 처럼 소리전자에서 중고 오실로스코프 또는 Logic ananlyzer를 구매할 까합니다.
이상입니다.
대학생 학부 시절 임베디드 시스템을 공부하고 4년이 지난 시점에서 취미생활로 작품 활동을 하기 위해 다시 시작하고자 합니다. 직장인이다 보니 바쁜 시간을 쪼개어 시작하려고 하니 머리가 아프네요.
이러한 고민을 해결해주는 아이템으로 최근에 출시된 아두이노와 같은 개발 환경을 갖추면 복잡한 코딩 없이도 누구나 쉽게 센서를 제어할 수 있어 구미가 당겨 집니다. 하지만 코드를 하나하나 짜보면서 하드웨어를 제어하는 것이 진정한 재미 이므로 AVR를 사용한 개발환경을 구축해 볼까 합니다.
먼저 AVR이 무엇인지 살펴보고려고 합니다.
AVR은 1996년 아트멜社에서 개발된 하버드 구조를 갖는 8비트 RISC 방식의 단일칩 마이크로컨트롤러 입니다. 현존하는 대부분의 8비트 마이크로 컨트롤러들은 하버드 아키텍처를 기반으로 제작되었습니다. 따라서 메모리와 데이터 메모리가 서로 분리되어 있어 CPU가 독립적으로 프로그램과 데이터에 접근이 가능한 구조입니다.
아래 블록다이어그램을 보면 Flash Program Memory와 DATA SRAM이 각각 존재하고 있고 Data bus로 연결되어 있는 것을 볼 수 있습니다.
앞서 설명한 하버드 구조의 장점때문에 AVR은 ISP(In-System Programming)기능을 제공하여 손쉽게 내부 FLASH 메모리에 PROGRAM를 저장할 수 있는 기능을 제공합니다. AVR에서 사용되는 ISP는 저렴한 가격에 직접 만들어 쓸 수 있는 장점이 있습니다.
(AVR의 ISP관련 참고 자료 : http://www.atmel.com/images/doc0943.pdf)
필자는 AVR 하드웨어 구축을 위해 아래 사이트에서 10만원으로 구입하여 활용하기로 했습니다.
- 구매이유 : 중국산 AVR 보드 및 다양한 센서를 싼가격에 구입 가능
이곳에서 판매하는 Atmega128 Training KIT 생각보다 저렴한 가격에 구성이 잘되어 있어 좋았지만 막상 프로그램을 코딩하려고 보니 간단한 회로가 아니여서 첫 맨붕을 겪게 해주었습니다. Character LCD는 아두이노에 바로 사용할 수 있도록 만들어져 있어 기존 LCD 제어 코드는 활용이 불가능하여 새로이 I2C로 제어할 수 있도록 만들어야 합니다. 한가지 마음에 드는 점은 AVR ISP가 USB로 되어있어 정말 빠르고 쉽게 펌웨어를 업데이트 할 수 있어 가격대비 성능이 최상이라 생각 됩니다.
예전 같으면 한땀한땀 납땜하여 보드를 만들었을 테지만 많은 시간과 노력이 필요하므로 나중으로 기약하려고 합니다. 조금더 여력이 된다면 대학생때 처럼 소리전자에서 중고 오실로스코프 또는 Logic ananlyzer를 구매할 까합니다.
이상입니다.
2014년 7월 3일 목요일
피드 구독하기:
글 (Atom)
[C++] 연습문제 1-2
/****************************************************************************** - 피트(feet)를 인치(inch)로 변환시켜주는 프로그램을 작성 - 사용자로부터 피트를 입력받아 인치로...
-
개발보드에 7-SEGMENT 회로는 아래와 같다. PORT.A를 통해 74HC595 와 74LS138 IC를 제어하여 8자리 7-SEGMENT를 구동시키는 회로이다. 일반적으로 1개 포트를 사용해 1개의 7-SEGMENT를 제어할 수 있는데 P...
-
디스플레이 장치에 Direct bonding을 적용할 경우 광학적 개선효과 분석 필자는 2012 년도에 국내 디스플레이 대기업인 S 사와 함께 13.3”, 15.6”, 21.5”, 23.6”, 24.0” 등 다양한 개발모델을 가지고 ...
-
아두이노에 사용되는 I2C 2004 20X4 Character LCD Module Display를 Mega128를 사용하여 제어할 계획입니다. 아두이노는 간단히 LCD를 제어할 수 있지만 mega128은 포트에 직접 연결하여 제어하는 방식이 일반적...