-
[AVR] 사용자 정의 문자 선언을 통해 간단한 그림 출력AVR study 2013. 1. 30. 19:20반응형
CGRAM의 주소값을 설정하고 사용자 정의 문자열을 선언해서 간단한 생선 그림을 만들어봤습니다.
//----------------------------------------------------------------------------------------LCD 옵션 설정문
#define CMD_CREAR_DISPLAY 0x01 //1. Clear Display
#define CMD_RETURN_HOME 0x02 //2. Return Home
//3. Entry Mode Set
#define CMD_ENTRY_MODE_SET_OPTION1 0x04 // cursor [left], Display shift[none]
#define CMD_ENTRY_MODE_SET_OPTION2 0x05 // cursor [left], Display shift[]
#define CMD_ENTRY_MODE_SET_OPTION3 0x06 // cursor [right], Display shift[none]
#define CMD_ENTRY_MODE_SET_OPTION4 0x07 // cursor [right], Display shift[]
//4. Display On/Off
#define CMD_DISPLAY_OPTION1 0x08 // Display [Off], Cursor [Off], Cursor Blink [Off]
#define CMD_DISPLAY_OPTION2 0x09 // Display [Off], Cursor [Off], Cursor Blink [On]
#define CMD_DISPLAY_OPTION3 0x0A // Display [Off], Cursor [On], Cursor Blink [Off]
#define CMD_DISPLAY_OPTION4 0x0B // Display [Off], Cursor [On], Cursor Blink [On]
#define CMD_DISPLAY_OPTION5 0x0C // Display [On], Cursor [Off], Cursor Blink [Off]
#define CMD_DISPLAY_OPTION6 0x0D // Display [On], Cursor [Off], Cursor Blink [On]
#define CMD_DISPLAY_OPTION7 0x0E // Display [On], Cursor [On], Cursor Blink [Off]
#define CMD_DISPLAY_OPTION8 0x0F // Display [On], Cursor [On], Cursor Blink [On]
//5. Cursor or Display Shift
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION1 0x10 // [Cursor] Select, Cursor Shift [Left]
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION2 0x14 // [Cursor] Select, Cursor Shift [Right]
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION3 0x18 // [Display] Select, Display Shift [Left]
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION4 0x1C // [Display] Select, Display Shift [Right]
//6. Function Set
#define CMD_FUNCTION_SET_OPTION1 0x20 // [4]bit mode, [1] line, [5x8] Font
#define CMD_FUNCTION_SET_OPTION2 0x24 // [4]bit mode, [1] line, [5x11] Font
#define CMD_FUNCTION_SET_OPTION3 0x28 // [4]bit mode, [2] line, [5x8] Font
#define CMD_FUNCTION_SET_OPTION4 0x2C // [4]bit mode, [2] line, [5x11] Font
#define CMD_FUNCTION_SET_OPTION5 0x30 // [8]bit mode, [1] line, [5x8] Font
#define CMD_FUNCTION_SET_OPTION6 0x3C // [8]bit mode, [1] line, [5x11] Font
#define CMD_FUNCTION_SET_OPTION7 0x34 // [8]bit mode, [2] line, [5x8] Font
#define CMD_FUNCTION_SET_OPTION8 0x38 // [8]bit mode, [2] line, [5x11] Font
//----------------------------------------------------------------------------------------헤더파일 선언
#include<avr/io.h>
#include<util/delay.h>
//----------------------------------------------------------------------------------------설정 bit 선언
#define RS 0
#define RW 1
#define E 2
#define DATA PORTAunsigned char a[]="Fish^^";
unsigned char b[]="";
void LCD_INS (unsigned char com) // LCD Instruction 함수
{
PORTC&=~(1<<RS); // RS bit을 0으로 마스킹
PORTC&=~(1<<RW); // RW bit을 0으로 마스킹
PORTC|=(1<<E); // E bit을 0으로 마스킹
_delay_ms(50);
DATA=com;
_delay_ms(50);
PORTC&=~(1<<E); // E bit을 1으로 마스킹
}
void LCD_WRITE_DATA (unsigned char com) // LCD DATA 쓰기 함수
{
PORTC|=(1<<RS); // RS bit을 1으로 마스킹
PORTC&=~(1<<RW); // RW bit을 0으로 마스킹
PORTC|=(1<<E); // E bit을 1으로 마스킹
_delay_ms(30);
DATA=com;
_delay_ms(30);
PORTC&=~(1<<E); // E bit을 0으로 마스킹
}void LCD_PST(unsigned char col, unsigned char row) // 문자열 디스플레이 행, 열 지정 함수
{
LCD_INS(0x80|(row+col*0x40));
}void str(unsigned char* com) // 문자열 함수
{
while(*com!=0)
{
LCD_WRITE_DATA(*com);
com++;
}
}void init_buffer(void) // LCD 버퍼 초기화 함수
{
PORTC|=(1<<RS);
PORTC|=(1<<RW);
PORTC|=(1<<E);
_delay_ms(10);
while(DATA!=0)
{
LCD_WRITE_DATA(0);
_delay_ms(10);
}
}int main()
{
volatile unsigned char cnt = 0;
// ---------------------------------------------------------------------------> 물고기 모양 문자 정의
unsigned char fish[] = {
0x00, 0X00, 0X00, 0X01, 0X03, 0X07, 0X0F, 0X0F, //머리 위앞 0x00
0x07, 0X0F, 0X1F, 0X1F, 0X1B, 0X1F, 0X1F, 0X1F, //머리 위뒤 0x01
0x07, 0X0F, 0X07, 0X03, 0X01, 0X00, 0X00, 0X00, //머리 아래앞 0x02
0x1F, 0X1F, 0X1F, 0X1F, 0X1F, 0X0F, 0X03, 0X00, //머리 아래뒤 0x03
0x00, 0X00, 0X00, 0X04, 0X04, 0X04, 0X0E, 0X1F, //가시1 위 0x04
0x0E, 0X04, 0X04, 0X04, 0X00, 0X00, 0X00, 0X00, //가시1 아래 0x05
0x00, 0X00, 0X00, 0X01, 0X03, 0X07, 0X0F, 0X1F, //꼬리 위 0x06
0x0F, 0X07, 0X03, 0X01, 0X00, 0X00, 0X00, 0X00}; //꼬리 아래 0x07// --------------------------------------------------------------------> LCD 사용 전 초기화 단계
DDRA=0xff; // PORTA 출력 설정
DDRC=0xff; // PORTC 출력 설정PORTA=0x00; // PORTA 값 초기화
PORTB=0x00; // PORTC 값 초기화LCD_INS(CMD_CREAR_DISPLAY); // Clear Display
_delay_ms(2);LCD_INS(CMD_RETURN_HOME); // Return Home
_delay_ms(2);LCD_INS(CMD_FUNCTION_SET_OPTION8); // [8]bit mode, [2] line, [5x8] Font
_delay_ms(2);LCD_INS(CMD_DISPLAY_OPTION5); // Display [On], Cursor [Off], Cursor Blink [Off]
_delay_ms(2);LCD_INS(CMD_CURSOR_DISPLAY_SHIFT_OPTION2); // [Cursor] Select, Cursor Shift [Right]
_delay_ms(2);LCD_INS(CMD_ENTRY_MODE_SET_OPTION3); // cursor [right], Display shift[none] (커서 오른쪽증가, shift Off)
_delay_ms(2);
// ----------------------------------------------------------------> CGRAM 쓰기
LCD_INS(0x40); // CGRAM 쓰기 모드 설정
for(cnt=0; cnt<64; cnt++){ // 0x00 ~ 0x07 까지 8개의 배열로 이루어진 8개의 문자에 쓰기
LCD_WRITE_DATA(fish[cnt]); // 8 x 8 개 이므로 64번 반복문 수행. CGRAM에 사용자 정의 문자가 기록됨
}
//LCD_INS(0x01);// ----------------------------------------------------------------> 그림 문자 출력
LCD_INS(0x80); // DD RAM Address (첫 라인 4번위치)
LCD_WRITE_DATA(0x00);
LCD_WRITE_DATA(0x01);
LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x04);
LCD_WRITE_DATA(0x06);LCD_INS(0xC0); // DD RAM Address (두번째 라인 4번위치)
LCD_WRITE_DATA(0x02);
LCD_WRITE_DATA(0x03);
LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x05);
LCD_WRITE_DATA(0x07);LCD_INS(0x8A); // DD RAM Address
str(a); // 문자열 출력
}
반응형'AVR study' 카테고리의 다른 글
[AVR] ADC 내부 블럭도 및 관련 레지스터 (4) 2013.02.10 [AVR] 타이머/카운터0 와 CLCD를 이용한 디지털 시계 (3) 2013.02.03 [AVR] 간단한 LCD 구동 코드 예제 (0) 2013.01.29 [AVR] CLCD의 Instruction Table을 통한 헤더파일 작성 (0) 2013.01.29 [AVR] CLCD 내부구조 및 핀설명 / WH1602B-YYH-JT# (0) 2013.01.29