Code Vison AVR C
ATmega8535
ATmega8535 제어 실습
I / O 포트 제어하기
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. 5×8, 5×10 도트 문자의 표현이 가능하다.
2. 2.7 ~5.5V 전원에서 동작한다.
3. 마이크로프로세서와 4비트와 8비트 인터페이스가 된다.
4. 80×8 비트 디스플레이 RAM (최대 80문자)
5. 240 문자 폰트의 9920 비트 문자 발생기 ROM CG ROM
6. 64×8 비트 문자 발생기 RAM – CG RAM
– 8 문자 폰트 (5×8 도트)
– 4 문자 폰트 (5×10 도트)
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종류의 5×7 도트 매트릭스 문자 패턴을 저장하고 있다.
위의 표에서 “0”은 상위 3 하위 0 이 되어 0x30이 된다. ( “Z” = 0x5A, “9” = 0x39 )
이 값을 DD RAM에 기록하면 CG ROM에 저장된 문자가 출력 된다
3. CG RAM ( Character Generator RAM )
CG RAM은 사용자가 프로그램에서 새로운 글자의 패턴을 만들 경우에 사용 하는 RAM이다. 5×7문자는 8개 5×10 문자는 4개까지 만들 수 있다.
CG RAM 어드레스와 CG RAM 문자패턴은 문자코드 DD RAM어드레스로 써넣어야 사용 할 수 있다.
CG RAM에 있는 만들어진 문자 패턴을 LCD로 출력하는 방법은 다음과 같다.
– 사용자 문자를 만들어 CG RAM에 저장한 다음
– DD RAM에 만들어둔 문자가 저장된 CG RAM의 코드를 Write하면 출력됨
4. LCD 모듈의 RS,R/W 선택 |
|||||||||||||||
|
RS, RW로 어떤 동작을 수행할 것인지 정한다.
5. 명령 레지스터 ( IR : Instruction Register )
DD RAM과 CG RAM에 대한 어드레스 정보와 클리어, 커서의 이동에 대한 명령 명령코드를 가지고 있다. IR은 쓰기만 되고 읽기는 되지 않는다.
|
|
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는 1×8, 1×16, 2×18, 2×20, 4×20, 2×24, 2×20 등이다.
LCD 함수들
1. lcd_init(unsigned char lcd_columns)
LCD 모듈을 초기화 시킨다. 모든 문자를 초기화하고 커서를 1행 1열로 위치시킨다.
ex) 2×16 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 문자열 출력
}
잘보고 갑니다~
좋은 내용 감사합니다 ^^ 퍼갈께요~