Embedded System/AVR

[AVR] 캐릭터 LCD (CLCD, LMC1623A) 소스코드

임베지수 2017. 4. 2. 14:49

 

이미 AVR LCD관련 글을 올렸지만(http://embejied.tistory.com/15) 이후 작성하는 글에서 올리는 소스에는 따로 헤더파일로 만들어서 "lcd.h"를 사용했는데 생각보다 요걸 물어보는 사람이 상당수 있었다... 사실 내용은 별거 없는뎈ㅋㅋ 그냥 메인에 있던 함수들을 헤더파일로 빼주고 매크로상수 몇개 넣어줬다... 그래도 혹시나 하는 마음에 정리해서 간단한 설명과 예제소스를 올려본다.

 

일단 헤더파일이다.

 

#ifndef LCD_H_
#define LCD_H_

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

#define RS  7 // RRL BOARD
#define RW  6
#define E   5
#define DATABUS PORTC
#define CTRLBUS PORTE


//#define RS    7 // MY BOARD
//#define RW    5
//#define E     3
//#define DATABUS   PORTA
//#define CTRLBUS   PORTE

void LCD_controller(unsigned char control)
{
	_delay_ms(1);
	CTRLBUS = 0x00; //RW clear.
	_delay_us(0.05); //RW &amp; RS Setup time is 40ns min.
	CTRLBUS |= 1&lt;&lt;E; // E set.
	_delay_us(0.1); //Data Setup time is 80ns min.
	DATABUS = control; // Data input.
	_delay_us(0.3); // valid data is 130ns min.
	CTRLBUS = (1&lt;&lt;RS)|(1&lt;&lt;RW)|(0&lt;&lt;E); // RS set. RW set. E clear.
}

void LCD_data(unsigned char Data)
{
	_delay_ms(1);
	CTRLBUS = 1&lt;&lt;RS; //RS set. RW clear. E clear.
	_delay_us(0.05); //RW &amp; RS Setup time is 40ns min.
	CTRLBUS |= 1&lt;&lt;E; // E set.
	_delay_us(0.1); //Data Setup time is 80ns min.
	DATABUS = Data; // Data input.
	_delay_us(0.5); // valid data min is 130ns.
	CTRLBUS = 1&lt;&lt;RW; // RS clear. RW set. E clear.
}

void LCD_string(unsigned char address, char *Str)
{
	int i=0;
	LCD_controller(address); // LCD display start position
	while(*Str!=0)
	{
		if(address+i == 0x90)
		LCD_controller(0xc0); // second line display
		LCD_data(*Str);
		i++;
		Str++;
	}
}

void LCD_clear()
{
	LCD_controller(0x01); // Display Clear.
}

void LCD_initialize()
{
	/* 8bit interface mode */
	_delay_ms(50);
	LCD_controller(0x3c); // Function set. Use 2-line, display on.
	_delay_us(40); // wait for more than 39us.
	LCD_controller(0x0c); // Display ON/OFF Control. display on ,cursor off,blink off
	_delay_us(40); // wait for more than 39us.
	LCD_controller(0x01); // Display Clear.
	_delay_ms(1.53); // wait for more than 1.53ms.
	LCD_controller(0x06); // Entry Mode Set. I/D increment mode, entire shift off
}

#endif /* LCD_H_ */

 

4번째 줄은 클럭속도다.. 혹시 8MHz 사용하는 사람들은 8000000UL로 바꿔준다.

9번째 줄부터 13번째 줄까지는 LCD에 연결한거랑 똑같이 바꿔주면 된다. 나같은 경우 CLCD의 RS, RW, E핀은 PORTE에 7,6,5번 핀에 물려있고 DataBus는 PORTC를 사용했다.

 

다음은 간단한 예제소스이다.

 

/* 
 * jisuLCDtest.c
 * Created: 2014-03-06 오전 1:04:42
 *  Author: movemove
*/ 

#include <avr/io.h>
#include "lcd.h"

int main(void)
{
	DDRE = 0xff; // CLCD ctrl pin output
	DDRC = 0xff; // CLCD data pin output
	
	LCD_initialize();
	
	while(1)
	{
		LCD_string(0x80, "hello world");
		_delay_ms(1000);
		LCD_clear();
			
		LCD_string(0x80, "welcome AVR!!");
		_delay_ms(1000);
		LCD_clear();
	}
}

 

동작영상~

자세한 설명은 http://embejied.tistory.com/15 을 참고한다.