디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

유리한과 함께하는 AVR로 임베디드 개념쌔우기 - #8. L ! C ! D !

유리한갤로그로 이동합니다. 2007.08.01 22:44:18
조회 2701 추천 0 댓글 6












 

유리한과 함께하는 AVR로 임베디드 개념쌔우기 - #8. L ! C ! D !

 


싸지 않기위해 자신을 다잡고 있다

근데 숏나 귀찮은건 어쩔수 없더라.

하여간 말이다, 횽이 지금 CLCD 보유하고있는게 없어..

공돌이 특성상 이것저것 모아놓는 습관이 있어야되는데..

이상하게 CLCD가 없다. (부품욕심이 좀 있긴한데..요상하다..)

그렇다고 TFT를 하자니 회로 수정하기 귀찮고 강좌쓸 엄두가 안난다.

GLCD를 하자니 땜질이 잘못 됐는지 화면이 너무 흐려.

그냥 CLCD 가자. 소스는 예전에 만들어놓은거 쓰고.

(CLCD 굉장히 중요해. CLCD가 중요한건 아닌데 대부분의 모듈이 이것과 거의 같은 방식으로 동작해.)


/*
CLCD - Character LCD. 그냥 글자만 나오는거. 16x2를 많리쓴다. 16칸x2줄
GLCD -  Graphic LCD. 그림도 그릴수 있다. 보통 128x64(픽셀) 사이즈를 많이 사용..
TFT 는 말 안해도 알지? STN타입은 나도 써본적없으니 패스..
*/


http://blog.naver.com/meelin/50008650683 참고해라.


http://blog.naver.com/meelin/50018421989 요놈은 TFT-LCD.

그럼 소스부터 나간다.(첨부파일 참조)

/* avr-gcc로 C++ 컴파일 된다는 얘기를 듣고
   C++ 하루 공부해서 만든 나름 C++ 소스.. 
   그냥 처음으로 짜본 C++프로그램이니까 태클걸지마.
   레퍼런스 안쓰고 포인터 썼다고 까면 맞는다.*/


/* Header File */

/************************************************
*                                                                                               *
*                       YuriHan\'s Dream Factory™                       *
*                                                                                               *
*                       Made By, Choi Hyun Seok.                        *
*                                                                                               *
*                       "   LCD_Device_Module   "                       *
*                                                                                               *
*                                                                       version 1.0     *
*                                                                       2006.11.22      *
************************************************/


enum onoff{on,off};


class LCD_Module
{
        private :
                void rsw(unsigned char rsw_switch);
                void E_Pulse(onoff sw); // E펄스를 조작. rs와 rw, 데이터를 입력후 불러옴
               
                unsigned char cs_pos;
                volatile uint8_t* LCD_DATA;
                volatile uint8_t* LCD_RSW;


        public :
                void LCD_init(volatile uint8_t* RSW_Port,volatile uint8_t* DATA_port);
                void print_str(char* string);
                void print_char(char* ch);
                void LCD_ON_OFF(unsigned char on1off2);
                void ReturnHome(void);
                void Cursor_Position(unsigned char x,unsigned char y);
                void LCD_clear(void);
//              void fputc(char* ch);
};


/* Cpp */

/************************************************
*                                                                                               *
*                       YuriHan\'s Dream Factory™                       *
*                                                                                               *
*                       Made By, Choi Hyun Seok.                        *
*                                                                                               *
*                       "   LCD_Device_Module   "                       *
*                                                                                               *
*                                                                       version 1.0     *
*                                                                       2006.11.22      *
************************************************/


#include<avr/io.h>
#include<util/delay.h>
//#include<stdio.h>
#include"LCD_Device_Module.h"

void LCD_Module::E_Pulse(onoff sw)
{
        _delay_ms(2);
        switch(sw)
        {
                case on :
                        *LCD_RSW = *LCD_RSW | 0x04; //xxxx x1xx ON
                        break;
                case off :
                        *LCD_RSW = *LCD_RSW & 0xFB; //xxxx x0xx OFF
                        break;
        }
        _delay_ms(2);
}

void LCD_Module::rsw(unsigned char rsw_switch) //rs와 rw의 상태를 변경. 따로 함수지정 안하고 한큐에 선언했습니다.
{
        switch(rsw_switch) // s값을 먼저 적고 w값을 적으면됩니다. 00,01,11,10.
        {
                case 00 :
                        *LCD_RSW = *LCD_RSW & 0xFC; //xxxx xx00
                        break; 
                case 01 :
                        *LCD_RSW = *LCD_RSW & 0xFE; //xxxx xxx0
                        *LCD_RSW = *LCD_RSW | 0x02; //xxxx xx1x
                        break;
                case 10 :
                        *LCD_RSW = *LCD_RSW | 0x01; //xxxx xxx1
                        *LCD_RSW = *LCD_RSW & 0xFD; //xxxx xx0x
                        break; 
                case 11 :
                        *LCD_RSW = *LCD_RSW | 0x03; //xxxx xxx1
                default : break;
        }
}

void LCD_Module::LCD_init(volatile uint8_t* RSW_Port,volatile uint8_t* DATA_port)
{
        LCD_RSW=RSW_Port;
        LCD_DATA=DATA_port;
        LCD_ON_OFF(0); // lcd를 끕니다.
        E_Pulse(on);
        rsw(00); // 0 0 0011 1100
        *LCD_DATA=0x3C; // 펑션 셋.
        E_Pulse(off); // 실행
        LCD_clear(); // lcd 화면 클리어
        LCD_ON_OFF(1);
        ReturnHome();
}

void LCD_Module::print_str(char* string)
{
        while((*string)!=0)
        {
                print_char(string++); //wri_ch에 위치의 문자를 "보낸후" 1증가.
        }
}

void LCD_Module::print_char(char* ch)
{
        rsw(10); // 0 1 xxxx xxxx (x는 chh데이터.)
        E_Pulse(on);
        *LCD_DATA=*ch;
        E_Pulse(off); //실행
        cs_pos++;
        if(cs_pos==16)
                Cursor_Position(0,1);
        if(cs_pos==33)
        {
                LCD_clear();
                ReturnHome();
                cs_pos=0;
        }
       
}


void LCD_Module::LCD_ON_OFF(unsigned char on1off2)
{
        rsw(00);
        E_Pulse(on);
        if(on1off2==1)
                *LCD_DATA=0x0f; // 0 0 0000 1111 lcd 켜기
        else if(on1off2==2)
                *LCD_DATA=0x08; // 0 0 0000 1000 lcd 끄기
        E_Pulse(off); // 실행
}


void LCD_Module::ReturnHome(void)
{
        rsw(00); // 0 0 0000 0010 커서를 맨 앞으로 가져다 놓습니다.
        E_Pulse(on);
        *LCD_DATA=0x02;
        E_Pulse(off);
        cs_pos=0;
}


void LCD_Module::Cursor_Position(unsigned char x,unsigned char y)
{
        rsw(00);
        E_Pulse(on);
        if(y==0) //첫째줄
                *LCD_DATA=x+0x80;
        else //둘째줄
                *LCD_DATA=x+0xc0;
        E_Pulse(off);
        cs_pos=(x+(y*16));
}


void LCD_Module::LCD_clear(void)
{
        rsw(00);
        E_Pulse(on);
        *LCD_DATA=0x01; // 0 0 0000 0001 화면 클리어
        E_Pulse(off); //실행
}

 


/* Main */


// C++ Class TEST...
// LCD Device Module Test.

#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include"LCD_Device_Module.h"
//#include<stdio.h>

//#include"rprintf.h"

//#define F_CPU 16000000UL

 

int main(void)
{
        LCD_Module lcd;
       
        cli();
        DDRA=0xff;
        DDRB=0xff;
        DDRC=0xff;
        DDRD=0xff;
        DDRE=0xff;
        DDRF=0xff;
        sei();

        lcd.LCD_init(&PORTA,&PORTB);
        lcd.print_str("C++ Test Program");
        lcd.Cursor_Position(0,1);
        lcd.print_str("Made by, YuriHan");

        return 0;
}

 

 

이래저래 좀 길다..


일단 간단하게 설명하고 넘어가자,


CLCD는 명령을 주기위한 핀 3개와 데이터 핀 8개로 구성되어 있어.
(꼭 그렇지만도 않은게 데이터는 4비트로 주고받을수도 있어,)


RS / RW / E / DATA(8bit) 로 되어있지.


RS 는 레지스터 셀렉트. IR과 DR 선택에 사용해.
IR은 인스트럭션 레지스터. 즉, 명령.
DR은 데이터 레지스터. 즉, 데이터

R/W 는 Read Write. 제조사 마다 신호가 약간씩 달라.

E는 Enable 신호.

명령이나 데이터를 보내준 뒤에 튕겨주면 되는데,
쉽게 보자면 동기를 맞춰주는 놈이라고 보면 되.

데이터 버스야 말 안해도 알테고..


그럼 시작하자.

타이밍도 나가신다.


d0052452_1008131.jpg


쌩뚱맞은 그림 나오셨다.


하지만 임베쪽 하다보면 허구헌날 보게될 그림.

 

타이밍도!!

 

뭐 어려워보이지만 별로 어려울건 없다.

 

Write를 보자.

RS가 교차되는 지점이 보이나? 저런식으로 교차되는건 0이든 1이든 상관 없다는 뜻이다.
하지만 데이터가 바뀌어야 한다면 저 타이밍에 바뀌어야 한다는걸 의미한다.

R/W 를 보면 아래로 떨어젼다. High였든 Low였든 그 타이밍에는 떨어뜨려줘야 한다.
E신호가 올라갔다가 내려가는거 보이지?
데이터 교차되는것도 보일테고..

 

간략하게 순서를 보자면..

RS,RW가 제일 먼저 바뀌고
Enable 신호를 올려주고 데이터를 넣은 상태에서 Enable 신호를 떨어뜨린다.
(그 이후로도 그림이 있지만 봐줄 필요는 없다. Enable신호가 제일 중요하다. 왜? Enable이니까.)

 

Read도 마찬가지다.
Rs,RW 바뀌고 E 올리고 데이터 넣고 E 내리고.

거창한 그림에 비해 볼건 없다.

명령주는 순서만 잘 지켜주면 된다는 내용의 그림이다.


대충 감이 오지?

그럼 이제 어떤식으로 명령을 줘야되는지 보자.

 


d0052452_10082730.gif

데이터 시트보면 다 나와있다. 저런식으로 주면 되는거다.

지연시간도 나와있고..(execution time 이면 실행시간에 가깝겠네)

소스코드처럼 따로 명령을 미리 만들어놓고 쓰면 매우 편리하겠지?

순서 알려줬지, 명령 알려줬지, 더이상 가르칠게 없는거다.

소스코드 들여다 보면서 어떤식으로 명령준건지 명령표랑 맞춰서 봐.

그럼 오늘은 이만 접지.


항상 얘기하지만 공부는 혼자 스스로 하는거야.

개판이긴 해도 소스는 열심히 짠거니까 분석하면서 동작 원리를 잘 파악해보라구.

 


수고.




추가... TFT-LCD 구동. ARM7으로 작업했음.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47644 65
2894117 후라이드도 괜찬긴 하네 프갤러(210.217) 23:00 16 0
2894116 C레벨 <- 진짜 충격적인 판교어임 [6] 박민준갤로그로 이동합니다. 22:57 32 0
2894115 아씨발 닭강정 후라이드로 왔네 씨발 프갤러(210.217) 22:54 16 1
2894114 배달의`민족 3 만 원권 아무나 써 ! [1] ㅇㅇ(223.39) 22:49 7 0
2894113 토스도 고이면 문화가 죻아지지않을까? [2] 밀우갤로그로 이동합니다. 22:49 19 0
2894112 아 배달하는 새끼가 자전거네 씨발 프갤러(210.217) 22:48 18 1
2894111 햄버거 말고 닭강정 시킴 [1] 프갤러(210.217) 22:41 25 1
2894109 언리얼 제대로 쓸라면 문서에 있듯이 [4] ㅆㅇㅆ찡갤로그로 이동합니다. 22:37 35 1
2894108 컴포지션 원탑으론 러스트 베비 게임 엔진이 있습니다. 프갤러(110.8) 22:33 13 0
2894107 사실 엔진구조 자체는 유니티쪽이 더 신식임 [16] ㅆㅇㅆ찡갤로그로 이동합니다. 22:28 49 0
2894106 ㅅㅂ 이직이많다는건 [1] 밀우갤로그로 이동합니다. 22:22 21 0
2894105 햄버거 떙기는데 햄버거 시킬까? [2] 프갤러(210.217) 22:13 27 1
2894103 C++ 잘아시는분? [8] ㅇㅇ갤로그로 이동합니다. 22:09 41 0
2894102 회사 평균퇴사율보면 토스는 오래가기 힘들어보이던데 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 22:09 36 0
2894101 이게 추석이지 [10] ㅇㅇ(121.168) 22:06 55 0
2894100 섹스<<이거 진짜 존재하는 행위냐? [2] ㅆㅇㅆ찡갤로그로 이동합니다. 22:03 28 0
2894099 이력서 경력기술서 어케씀 ㅇ.ㅇ [6] 밀우갤로그로 이동합니다. 22:00 31 0
2894098 내 전문성은 비동기 프로그래밍과 클라 ui인데 ㅆㅇㅆ찡갤로그로 이동합니다. 21:58 17 0
2894097 법원이 드디어 화난듯 ㅇㅇ(121.168) 21:55 26 0
2894096 국정농단 비선실세 논란 김현지 게이트 국감 특검 수사로 진실 밝혀야 [3] ♥덩냥이♥갤로그로 이동합니다. 21:53 24 0
2894095 나도 전문화라는걸 해야하는데 클라쪽 전문인데 ㅆㅇㅆ찡갤로그로 이동합니다. 21:50 15 0
2894094 충격적임.. ♥덩냥이♥갤로그로 이동합니다. 21:48 19 0
2894093 대학원 수료한게 석사쪽 의뢰가 간간히 오는게 장점 ㅆㅇㅆ찡갤로그로 이동합니다. 21:41 21 0
2894092 오늘 코퍼스 언어학 관련 말뭉치해석 파싱 파이프라인 만듬 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 21:40 23 0
2894090 웨이랜드 좆같은거 맞음 ㅇㅇ [5] 박민준갤로그로 이동합니다. 21:38 25 0
2894089 내란범 뇌물범만 골라서 빠는 2찍 일베들만 하겠냐 [3] 프갤러(110.8) 21:16 30 2
2894088 2찍은 민주당 정권이 하는 모든것에 반대하지 않는다 ㅇㅇ(121.168) 20:46 19 0
2894087 토스도 판교어쓰냐? [2] 밀우갤로그로 이동합니다. 20:35 34 0
2894084 내일 하루 쉬고 또 매일 일해야 하는구나 ㅠㅠ 나르시갤로그로 이동합니다. 20:29 14 0
2894082 weston 업무용 데탑에 대해 레딧에 나르시갤로그로 이동합니다. 20:27 10 0
2894081 속보) 이진숙 방통위원장 불법체포 기각 [4] ♥덩냥이♥갤로그로 이동합니다. 20:24 36 1
2894080 일단 사람 수준은 갖추고 정치 논하자 [2] 프갤러(61.74) 20:23 26 0
2894078 중졸 이하들이 위선이 어쩌고 저쩌고 [4] 프갤러(27.175) 20:18 30 0
2894077 민주당 정권이 위선을 독점하는게 아님 ㅇㅇ(121.168) 20:16 14 0
2894076 코딩을 너무 쉽게 생각해서 문제다. [1] 프갤러(59.16) 20:08 38 0
2894075 술은 무조건 낮술임 [8] ♥덩냥이♥갤로그로 이동합니다. 20:03 34 0
2894074 연휴 모하지 하는 달붕이들은 위한 유흥 가성비 대충 정리 ㅇㅇ(118.235) 20:02 12 0
2894073 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 19:57 14 0
2894072 인생 선배님들 질문을 여쭙습니다 RPA 직렬 [1] 케인즈갤로그로 이동합니다. 19:54 23 0
2894070 2찍이 실력 타령하는게 제일 이해 안돼 [3] 프갤러(223.63) 19:50 31 0
2894068 취미로 플밍하는새끼들 특징 [1] 프갤러(211.235) 19:38 41 0
2894067 판교어는 중견까지만 잘 쓰는듯. [2] 프갤러(211.177) 19:35 49 1
2894066 갈비 먹습니다. 넥도리아(220.74) 19:21 24 0
2894061 내가 맥주를 안먹는 이유 프갤러(210.217) 19:17 25 1
2894060 점심 간식 저녁 발명도둑잡기(118.216) 19:14 15 0
2894057 인스타 개인정보가 국외이전으로 피싱당해서 [2] 넥도리아(220.74) 19:09 32 0
2894055 이게 내 포트폴리온데 어디까지 취업가능함? [3] 프갤러(210.217) 19:08 64 2
2894053 추석 유흥 50% 할인 리스트?ㅋㅋㅋㅋㅋㅋㅋ ㅇㅇ(118.235) 19:01 19 0
2894051 와 경기 안좋아서 못나갈꺼 아니까 연봉을 [1] ㅇㅇ(211.234) 18:56 25 0
뉴스 ‘CEO’ 송은이, 직원들 퇴사 징크스 고백…“‘이것’ 하면 꼭 나가더라” 디시트렌드 10.03
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2