-
ATmega8535 - FND & LCD 제어Programming/Embeded 2009. 7. 9. 23:38Code Vison AVR C
ATmega8535
ATmega8535 제어 실습
FND 제어
FND에는 Vcc를 이용하는 애노드 (anode)형과 Gnd를 이용 하는 cathode형이 있다.
LED가 여러개 모여 있다 생각 하고 LED선택에 따라 문자와 숫자를 만들어 낼 수 있다.
최대한 많은 영문자를 만들기 위해 대문자와 소문자를 혼합한다.
(표현 가능한 문자 : A, b, C, d, E, F, H, I, J, L, o, P, r, S, t, u, y)
프로그램
- 1개의 FND가 0 -> 1 -> 2..... ->1 까지 1초마다 자동으로 카운트 하기
#include <mega8535.h>
#include <delay.h>
void main(void)
{
// 변수 선언
unsigned char i;
unsigned char FONT[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xD8, 0x80, 0x98};
//PORTA를 출력으로 설정하고 초기값은 모두 0
PORTA = 0x00;
DDRA = 0xFF;
//무한 루프
while (1)
{
// 0 - 8 까지 up-count 출력
for (i=0 ; i<9; i++) {
//PORTA 에 i 값 0 - 9를 출력
PORTA = FONT[i];
delay_ms(1000);
} //for i
// 9-1까지 down-count 출력
for (i=9; i>0; i--){
PORTA = FONT[i];
delay_ms(1000);
} //for i
} //while
} //main
LCD 컨트롤러 제어
문자 LCD 제어
LCD 모듈의 이해
일반적으로 LCD는 HD44780 컨트롤러를 사용한다.
<특징>
1. 5x8, 5x10 도트 문자의 표현이 가능하다.
2. 2.7 ~5.5V 전원에서 동작한다.
3. 마이크로프로세서와 4비트와 8비트 인터페이스가 된다.
4. 80x8 비트 디스플레이 RAM (최대 80문자)
5. 240 문자 폰트의 9920 비트 문자 발생기 ROM CG ROM
6. 64x8 비트 문자 발생기 RAM - CG RAM
- 8 문자 폰트 (5x8 도트)
- 4 문자 폰트 (5x10 도트)
7. 저 소비 저 전력
제어 할 때 주로 신경 쓰는 부분은 RS, RW, DB 이다.
RS (Register Select) : LCD의 제어 명령과 데이터 입력 제어 신호를 설정한다.R/W (Read/ Write) : 신호가 Low(0)이면 쓰기 동작, 신호가 High(1)이면 읽기 동작
DB0~DB7 : 마이크로프로세서와 LCD간의 데이터를 주고 받는 단자
8비트와 4비트 제어 방법이 있으며 4비트 제어시 DB4~DB7의 4개의 핀을 사용 한다.
LCD 제어의 이해HD44780은 8비트 레지스터인 인스트렉션(명령) 레지스터 IR 와 데이터 레지스터 DR 을 가지고 있다.
그리고 데이터가 저장되어 있거나 저장할 수 있는 DD RAM, CG ROM, CG RAM과 어드레스 카운터, 비지 플래그 등이 있다.
1. DD RAM (Display Data Ram)
DD RAM은 LCD에 실제 출력되는 문자가 저장 되는 메모리 이다. 여기에 데이터를 기록하면 문자가 LCD에 출력 된다.
l 최대 0x80 x 8bit의 용량을 가지므로 모두 128개의 문자를 저장할 공간이지만 사용되지 않는 부분이 있어 80개의 문자를 저장한다.
l 첫 번째 LINE을 표시하는 DD RAM의 어드레스는 0x00 ~ 0x27
l 두 번째 LINE을 표시하는 DD RAM의 어드레스는 0x40 ~ 0x67
기본 표시 어드레스를 좌우로 1비트씩 이동 시키면서 보여 준다.
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0F
10
11
12
13
...
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4F
50
51
52
53
...
초기 상태 (붉은 바탕이 표시 되는 부분이다.)
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0F
10
11
12
13
...
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4F
50
51
52
53
...
오른쪽으로 2칸 이동 (2비트 쉬프트)
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0F
10
11
12
13
...
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4F
50
51
52
53
...
오른쪽으로 4칸이동 (4비트 쉬프트)
* 40열 2행 짜리 표에 데이터를 기록 한다고 생각 하자!
2. CG ROM (Character Generator ROM)
다음 표와 같이 8비트 문자 코드 192종류의 5x7 도트 매트릭스 문자 패턴을 저장하고 있다.
위의 표에서 "0"은 상위 3 하위 0 이 되어 0x30이 된다. ( "Z" = 0x5A, "9" = 0x39 )
이 값을 DD RAM에 기록하면 CG ROM에 저장된 문자가 출력 된다
3. CG RAM ( Character Generator RAM )
CG RAM은 사용자가 프로그램에서 새로운 글자의 패턴을 만들 경우에 사용 하는 RAM이다. 5x7문자는 8개 5x10 문자는 4개까지 만들 수 있다.
CG RAM 어드레스와 CG RAM 문자패턴은 문자코드 DD RAM어드레스로 써넣어야 사용 할 수 있다.
CG RAM에 있는 만들어진 문자 패턴을 LCD로 출력하는 방법은 다음과 같다.
- 사용자 문자를 만들어 CG RAM에 저장한 다음
- DD RAM에 만들어둔 문자가 저장된 CG RAM의 코드를 Write하면 출력됨
4. LCD 모듈의 RS,R/W 선택
RS
R/W
동 작
0
0
IR 선택, IR 쓰기, 내부 동작 표시 클리어
0
1
비지 플래그(BF)와 어드레스 카운터 읽기
1
0
DR 선택, DR 쓰기
내부동작: DR → DD RAM, CG RAM1
1
DR 선택, DR 읽기
내부동작: DD RAM, CG RAM → DRRS, RW로 어떤 동작을 수행할 것인지 정한다.
5. 명령 레지스터 ( IR : Instruction Register )
DD RAM과 CG RAM에 대한 어드레스 정보와 클리어, 커서의 이동에 대한 명령 명령코드를 가지고 있다. IR은 쓰기만 되고 읽기는 되지 않는다.
LCD 모듈의 명령어의 종류
명령
코드
실행시간
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
0
1
1.64ms
0
0
0
0
0
0
0
0
1
x
1.64ms
0
0
0
0
0
0
0
1
I/D
S
40us
0
0
0
0
0
0
1
D
C
B
40us
0
0
0
0
0
1
S/C
R/L
x
x
40us
0
0
0
0
1
DL
N
F
x
x
40us
0
0
0
1
CG RAM 번지
40us
0
0
1
DD RAM 번지
40us
비지플래그/번지카운터 읽기
0
1
BF
DD RAM 번지
40us
CG RAM, DD RAM 쓰기
1
0
데이터
40us
CG RAM, DD RAM 읽기
1
1
데이터
40us
명령어 상세 설명
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
1
- 화면 클리어 후 커서는 홈 위치(00 번지 - 1행 1열)로 돌아간다. 그리고, DD RAM의 모든 어드레스에 스페이스 코드인 0x20이 들어가고 AC(Address Counter)에 DD RAM 어드레스에 0번지가 세트된다.
AC는 DD/CG RAM으로 데이터를 쓰거나 기억된 데이터를 읽을 때, 목적지가 되는 RAM의 어드레스를 지정한다. IR에 어드레스 세트 인스트럭션을 써 넣으면, IR에서 AC로 어드레스 정보가 전송된다.
DD/CG RAM에 문자 데이터를 써넣으면 엔트리 모드 설정에 따라서 AC는 자동적으로 +1 혹은 -1만큼 증감한다. 그리고, AC의 내용은 RS가 0, R/W가 1일 때, DB0~DB7을 통해서 읽는다.DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
1
x
- x: 무효 비트, 1이든 0이든 상관없다.
커서를 0으로 돌아가게 한다. AC에 DD RAM의 어드레스의 0번지가 세트된다.DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
1
I/D
S
- 커서의 진행방향(AC의 증감 방향과 같다) 및 표시를 쉬프트 시킬 것인지를 지정한다.
- Increment/Decrement
I/D=1: 어드레드를 +1
I/D=0: 어드레드를 -1
- Shift
S가 1일 때, 표시된 문자 전체를 좌/우로 이동시킨다. 단 이때 커서의 위치는 변하지 않는다.
I/D=1, S=1: 좌로 쉬프트
I/D=0, S=1: 우로 쉬프트
S=0: 표시는 쉬프트되지 않는다.DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
1
D
C
B
- 표시 ON/OFF, 커서 ON/OFF, 커서 위치에 있는 문자의 점멸을 설정한다. 커서의 ON/OFF 및 점멸은 AC로 지정되어 있는 DD RAM 어드레스에 해당하는 문자가 된다.
D=1: 표시 ON, D=0: 표시 OFF
C=1: 커서 ON, C=0: 커서 OFF
B=1: 점멸 ON, B=0: 점멸 OFFDB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
1
S/C
R/L
x
x
- DD RAM의 내용은 변경하지 않고, 커서 이동과 표시 쉬프트를 한다. 커서의 이동은 1행의 40번째에서 2행의 처음으로 온다. 그러나 표시 쉬프트는 두 행이 동시에 된다.
S/C=0, R/L=0: 커서 위치를 좌로 이동 (AC -= 1)
S/C=0, R/L=1: 커서 위치를 우로 이동 (AC += 1)
S/C=1, R/L=0: 표시 전체를 좌로 이동, 표시는 커서에 따라 움직인다.
S/C=1, R/L=1: 표시 전체를 우로 이동, 커서는 움직이지 않는다.DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
1
DL
N
F
x
x
- DL=1: 8비트(DB[0:7]) 인터페이스 세트
DL=0: 4비트(DB[4:7]) 인터페이스 세트, 상위 4비트 전송 후 하위 4비트 전송
N: 표시 행수의 설정(0: 1행, 1: 2행)
F: 문자 폰트를 설정 (0: 5×7도트, 1: 5×10도트)- CG RAM 어드레스 세트
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
1
A5
A4
A3
A2
A1
A0
- A[5:0]로 표시되는 CG RAM의 어드레스가 AC에 설정되고 이후 읽기/쓰기 데이터는 CG RAM에 쓰이고 읽혀지게 된다.
- DD RAM 어드레스 세트
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
A6
A5
A4
A3
A2
A1
A0
- A[6:0]로 표시되는 DD RAM의 어드레스가 AC에 설정되고 이후 읽기/쓰기 데이터는 DD RAM에 쓰이고 읽혀지게 된다.
- DB7에 1이 고정 되어 있으므로 프로그램 에서는 0x80을 더하여 주소를 설정 해야 한다. (code visionAVR C 의 lcd_gotoxy(x,y,)를 이용 하는것과 마찬가지)
6. 데이터 레지스터 (DR : Data Register)
DD RAM과 CG RAM에 쓰기 할 데이터나 읽어온 데이터를 일시 기억하는데 사용한다.
7. 비지 플래그 (Busy Flag)
비지 플래그는 LCD모듈이 다음 명령을 받을 수 있는 상태인지를 표시한다. 점검방법은 IR레지스터의 7번 비트가 '1' 인지 '0'인지를 검사한다. ( 1 : 다음 명령을 받을 수 없음, 0 : 받을 수 있음)
그러나 LCD출력 프로그램 에서는 이와 같은 절차로 점검하여 다음 동작을 하는 것은 번거러움으로 명령과 명령 사이에 지연 시간을 두도록 설계 하는 것이 보통이다.
8. 어드레스 카운터 (Address Counter)
DD RAM와 CG RAM의 어드레스를 지정할 때 사용한다.
Code Vision AVR C LCD기능
Code Vision AVR C에서 사용되는 LCD 제어 함수들은 <lcd.h>에 정리되어 있다. <lcd.h>에서 지원되는 LCD는 1x8, 1x16, 2x18, 2x20, 4x20, 2x24, 2x20 등이다.
LCD 함수들
1. lcd_init(unsigned char lcd_columns)
LCD 모듈을 초기화 시킨다. 모든 문자를 초기화하고 커서를 1행 1열로 위치시킨다.
ex) 2x16 LCD의 초기화
lcd_init(16);
2. lcd_clear(void)
표시된 모든 문자를 지우고, 문자의 출력 위치를 1행 1열으로 위치 시킨다.
ex) lcd_clear( );
3. lcd_gotoxy(unsigned char x, unsigned char y)
커서의 표시 위치를 설정한다. 여기서 x가 columns이고 y가 line이다. (0,0 부터 시작)
ex) 첫 째줄 6번째 칸으로 이동
lcd_gotoxy(5,0);
4. lcd_putchar(char c)
커서가 위치한 지점에 문자를 출력함
ex) 커서가 위치한 지점에 'A'를 출력 (반드시 작은 따옴표 (' ')를 사용)
lcd_putchar('A');
5. lcd_puts(char *str)
커서가 위치한 지점에 SRAM의 문자열을 출력함. 문자열을 먼저 선언 하여야함
ex) 커서가 위치한 지점에 문자열 "I LOVE NC!"을 출력 (" ")를 사용
char a[ ] = "I LOVE NC!"
lcd_puts(a);
6. lcd_putsf(char flash *str)
커서가 위치한 곳에 FLASH의 문자열을 출력함.
ex) 커서가 위치한 곳에 문자열 "Robot Study"를 출력
lcd_putsf("Robot Study");
7. _lcd_ready(void)
LCD모듈이 데이터 수신을 위한 준비를 한다. 이 함수는 LCD에 데이터를 쓰기 전에 반드시 사용해야 한다.
8. _lcd_write_data(unsigned char data)
LCD의 IR 레지스터에 byte 데이터를 Write 한다.
ex) LCD의 커서를 나타나게 할 경우
_lcd_ready( );
_lcd_write_data(0xE); //0xE는 커서의 출력 Enable 명령
9. lcd_write_byte(unsigned char addr, unsigned char data)
D.D.RAM 이나 C.G.RAM에 byte 데이터를 Write한다.
10. unsigned char lcd_read_byte(unsigned char addr)
D.D.RAM 이나 C.G.RAM에 byte 데이터를 읽어오기 한다.
문자 LCD 출력 실습
/*********************************************
This program was produced by Talsu
Date : 2008-02-28
LCD에 문자를 출력 하는 프로그램 입니다.
lcd_putchar 함수로 한 문자씩 출력 ("I ")
lcd_puts 함수로 SRAM의 문자열 출력 ("love")
lcd_putsf 함수로 flash의 문자열 출력 (" NClab")
*********************************************/
#include <mega8535.h>
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h> //LCD사용을 위한 헤더파일
char *lv = "love"; //SRAM문자열 출력을 위한 문자열 변수
void main(void)
{
lcd_init(16);
lcd_putchar('I'); //lcd_putchar 함수를 이용한 문자 출력
lcd_putchar(' ');
lcd_puts(lv); //lcd_puts 함수를 이용한 SRAM문자열출력 lcd_putsf(" Talsu"); //lcd_putsf 함수를 이용한 Flash 문자열 출력
from : http://talsu.net/'Programming > Embeded' 카테고리의 다른 글
DK-128 (0) 2012.12.26 8255A - Programmable Peripheral Interface (0) 2009.07.12 ATmega8535 Datasheet (0) 2009.07.10 ATmega8535 - 타이머,카운터 제어 시계 설계 (0) 2009.07.09 ATmega8535 - 시리얼통신 (UART) (0) 2009.07.09 - CG RAM 어드레스 세트