원래 KUT-128에는 LCD가 바로 연결되지 않고 LCD 커넥터에다가 연결하도록 되어있다.

시뮬레이터 상에서는 만들 필요 없으니 그냥 바로 LCD 를 연결시켜서 만들었다.

회로 자체 만드는건 어렵지는 않았는데,

LCD 써보려고 하니까 글이 잘 안읽히더라

조금 찾아보니까 이분이 LCD 내용을 잘 정리하셨더라.

https://kogun.tistory.com/23

 

AVR(ATmaga128)로 텍스트LCD 장난하기

안녕하세요 고군입니다~ 이번 시간에는 텍스트LCD에 대하여 알아보고 AVR을 사용하여 화면을 표시해보도록 하겠습니다. LCD는 저렴한 가격으로 인해 산업현장에서는 아직도 많이 사용되고 있으

kogun.tistory.com

 

내가 정리한것 보다는 위 링크 보는게 이해하기 좋을거같다.

 

 

LCD 핀

- RS 핀 : 0은 명령어, 1은 데이터  

- DB4~7핀 : 8비트 or 4비트 모드 사용가능한데 4비트 모드 사용시 이 4개 핀 사용

- RW 핀 : 0이 W, 1이 R

 

LCD 

- 레지스터들 : 8비트 IR(명령), DR(데이터)가 존재. RS핀으로 선택

- IR : DDRAM(디스플래이 데이터), CGRAM(문자 생성) 주소 설정,메모리클리어, 디스플래이 onoff 명령어 등 CPU가 쓴다.

- DR : DDRAM, CGRAM에 쓴 데이터나 읽은 데이터 일시 저장. DR에 쓴 데이터는 DDRAM, CGRAM에 써진다. 렘으로부터 읽을때 IR에 주소를 넣으면 DR에 들어옴

- Busy Flag BF : LCD가 명령 받을수 있는지 표현. BF가 1이면 못받음. 0이면 받을 수 있음.RS=0, RW=1이면 BF 읽음

- DDRAM display data ram : 8비트 문자 데이터 표시. 16 x 2 lcd이나 실제로는 최대 80글자 기억

- CGROM 문자 생성 롬 : 5x7, 5x10 크기의 도트 문자 보관. CGROM의 문자 코드를 DDRAM에 써주면 표시됨.

- CGRAM 문자 생성 램 : 사용자가 정의한 문자를 보관. 8개 까지.

- 어드레스 카운터 : DDRAM, CGRAM 어드레스 지정시 사용. 

 

아래의 링크에서도 정말 잘 정리되어 있으니 참고하는게 좋겠다.

https://electronicsdo.tistory.com/entry/ATmega128%EC%8B%A4%EC%A0%84-CLCD-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

https://electronicsdo.tistory.com/entry/ATmega128%EC%8B%A4%EC%A0%84-CLCD-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

 

코드는 그대로 한거같은데 무슨이유에서인지 동작하지 않는다..

 

아무래도 비트 단위로 적어가면서 확인해봐야겠다.

 

명령어 하나 당 실행 시간이 40us인데 40us를 대기하는게하나도 없다.

 

일단 이제 0617 00시 됬으니 잠시 중지

 

-----

 

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

//function set 인터페이스 길이, 표시 행 수, 문자 폰트 설정
// DL=1은 8비트, DL=0은 4비트, 1 or 2줄, 도트 크기
//   dl NF    -> DL = 0, NF : 10 -> 2 라인, 5 x 7도트 
// 0010 1000 
#define FUNCSET	0x28
//entry mode set 110
//I/D = 1 어드레스 + 1하고 커서 우측 이동
//S = 0, DDRAM에 데이터 쓴 후 화면 좌 또는 우이동?
#define ENTMODE	0x06	// entry mode set
#define ALLCLR	0x01	//all clear
//display on/off
// 0000 1100 = 0x0c
// 0000 1DCB 
// D= 1 display on, C=1 cursor on, B=1 cursor Blink
#define DISPON	0x0E	//display on
#define DISPOFF 0x04	//display off
#define LINE1	0x80
#define LINE2	0xC0	//2nd line move

void lcd_init();
//flash 는 flash 변수. flash 메모리에 저장
void lcd_string(char*);
void busy();
void command(unsigned char);
void data(unsigned char);

void main(){
	lcd_init();
	
	/*
	while(1){
		command(DISPOFF);
		_delay_us(100);
		command(DISPON);
		_delay_us(100);
	}
	*/
	
	lcd_string("hello! kut-128");
	command(LINE2);
	lcd_string("atmel atmega128");
	while(1);
}

void lcd_init(){
	DDRD = 0xff;
	PORTD &= 0xfb;
	
	_delay_ms(20);
	command(0x30);
	_delay_ms(10);
	command(0x30);
	_delay_ms(1);
	command(0x30);
	_delay_ms(1);
	command(0x20);
	_delay_ms(1);
	
	command(FUNCSET);
	command(DISPON);
	command(ALLCLR);
	command(ENTMODE);
}

void lcd_string(char *str){
	char *pstr = 0;
	
	pstr = str;
	while(*pstr)
		data(*pstr++);
}

void command(unsigned char byte){
	busy();	
	PORTD = (byte & 0xf0);
	PORTD &= 0xfe;
	PORTD &= 0xfd;
	_delay_ms(1);
	PORTD |= 0x04;
	_delay_ms(1);
	PORTD &= 0xfb;
	
	
	PORTD = ((byte<<4) & 0xf0);
	PORTD &= 0xfe;
	PORTD &= 0xfd;
	_delay_ms(1);
	PORTD |= 0x04;
	_delay_ms(1);
	PORTD &= 0xfb;

	/*
	busy();
	
	// 인스트럭션 상위 바이트
	PORTD = (byte & 0xf0);	//데이터
	PORTD &= 0xfe;			//rs=0
	PORTD &= 0xfd;			//rw=0;
	_delay_us(1);
	PORTD |= 0x04;			//e = 1;
	_delay_us(1);
	PORTD &= 0xfb;			//e = 0;
	
	//인스트럭션 하위 바이트
	PORTD = ((byte << 4) & 0xf0);
	PORTD &= 0xfe;
	PORTD &= 0xfd;
	_delay_us(1);
	PORTD |= 0x04;
	_delay_us(1);
	PORTD &= 0xfb;
	*/
}

void data(unsigned char byte){
	busy();
	PORTD = (byte & 0xf0);
	PORTD |= 0x01;
	PORTD &= 0xfd;
	_delay_ms(1);
	PORTD |= 0x04;
	_delay_ms(1);
	PORTD &= 0xfb;
	
	PORTD = ((byte<<4) & 0xf0);
	PORTD |= 0x01;
	PORTD &= 0xfd;
	_delay_ms(1);
	PORTD |= 0x04;
	_delay_ms(1);
	PORTD &= 0xfb;
	/*
	busy();
	
	PORTD = (byte & 0xf0);
	PORTD |= 0x01;
	PORTD &= 0xfd;
	_delay_us(1);
	PORTD |= 0x04;
	_delay_us(40);
	PORTD &= 0xfb;
	
	PORTD = ((byte << 4) & 0xf0);
	PORTD |= 0x01;
	PORTD &= 0xfd;
	_delay_us(1);
	PORTD |= 0x04;
	_delay_us(40);
	PORTD &= 0xfb;
*/
}


void busy(){
	_delay_ms(2);
	//_delay_us(400);
}

 

----------

지금 시간이 일요일 새벽 1시

결국 lcd 4비트 모드로 제어하려고 별짓을 다해봤지만 안됬다.

 

구글링해서 봐도 영어 실력이 부족해서 잘 읽혀지지가 않았다.

코드를 다 뜯어고쳐서 써보자니 이럴때는 아얘 다날리고 쓰는게 맞긴한데

그러기는 너무 싫더라

코드 바꾸기는 싫고 이래저래 시뮬레이션 시간, 딜레이 시간 조절해가면서 이래저래 시도해보다보니 시간이 이렇게 됬다.

 

며칠간 이걸로 한참 삽질했는데

그냥 디버깅 툴이랑 주변 장치 컨트롤러를 여러 라인에 딜레이 주는 식으로 어떻게 초기화하고 값을 입력시키는지 이해한걸로 만족해야 될거같다.

나중에 기회되면 다시 시도해야지.

 

이 다음에는 모터 시뮬도 돌리려했지만 타이머/카운터를 다루는 내용이 나온다.

이 부분은 학교 수업에서 진행하니 나중에 진도 나가고 하고 싶어지면 해야지.

 

일단 프로테우스 아트메가 시뮬레이션 글은 여기까지로 마쳐야겠다.

이 다음에는 임베디드 간단하고 넓게 정리해보고,

나빌로스 만들기 나 학교에 있는 임베디드 키트 가지고 놀아볼 생각이다.

+ Recent posts