회원가입 ID/PW 찾기
AA

아..미쳐가는중-_-;;

몇주째 조금씩 건드리다
근 2,3일간 본격적으로 그래픽 LCD 제어를 공부하는 중인데
엘시디에 점 하나 찍는게 왜이리 어렵죠 ㅜㅠ

차영배님이 쓰신 "C-언어로 배우는 8051 기초&응용" 이란 책으로 공부중인데
이 책에 나온 그래픽 엘시디 회로랑 거의 동일하게 회로를 구성했거든요.
단지 포트 번호만 약간 다를 뿐이라 소스코드상에서 제 회로에 맞게 제대로 변경했는데
왜 제어가 안되는건지 당췌 알수가 없네요;

이 책은 희한하게,
timing도에 대한 언급이 전혀 없네요.
분명 제가 듣기로는 타이밍이 상당히 중요하다고 들었는데;;;;;;
enable 신호를 넣고 딜레이를 준다던가 하는것도 전혀 없구요. 음;
회로도를 봐도 8051 포트랑 lcd랑 다이렉트로 연결해놨구요.

으음. 혹시 이 책의 소스가 틀린걸까요.ㅇ_ㅇ;;
혹시나 해서 아래에 소스 첨부해봅니다.
시간 남으시는 분들 한번 봐주세요..소스가 틀려서 안되는것인지-_-;

아. LCD는 디바이스마트에서 구입했는데, KS0107 계열입니다. 이 책에서도 이 계열의 LCD로 설명했길래 일부러 같은 계열로 구한건데..왜 안되는지..
미쳐가는 중입니다 ㅜㅠ

참고로 아래의 소스는 LCD에 "마이다스" 라는 글자를 출력하는겁니다.


#include <AT89X51.h>
// P0.0-P0.7 : 데이터 버스
// P2.0=RS, P2.1=RW, P2.2=E, P2.4=CS1, P2.5=CS2
#define  DI         P2_0   // LCD 핀 정의
#define  RW         P2_1
#define  E          P2_2
#define  CS1        P2_3
#define  CS2        P2_4
#define  BUSY       P0_7
        /* "M" 상위 64 x 8 폰트 */
code unsigned char M[]={  /* "마"의 윗 부분 */
                        0xfc,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
                        0xfc,0x00,0x00,0xff,0x80,0x80,0x00,0x00,
                          /* "이"의 윗 부분 */
                        0xf0,0x08,0x04,0x02,0x02,0x02,0x02,0x02,
                        0x04,0x08,0xf0,0x00,0x00,0xff,0x00,0x00,
                          /* "다"의 윗 부분 */
                        0xfc,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
                        0x04,0x00,0x00,0xff,0x80,0x80,0x00,0x00,
                          /* "스"의 윗 부분 */
                        0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0c,
                        0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00};
        /* "M" 하위 64 x 8 폰트 */
code unsigned char M1[]={ /* "마"의 아래 부분 */
                        0x3f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                        0x3f,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
                          /* 이의 아래 부분 */
                        0x0f,0x10,0x20,0x40,0x40,0x40,0x40,0x40,
                        0x20,0x10,0x0f,0x00,0x00,0xff,0x00,0x00,
                          /* "다"의 아래 부분 */
                        0x3f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                        0x20,0x00,0x00,0xff,0x00,0x00,0x00,0x00,
                          // "스"의 아래 부분
                        0x24,0x22,0x21,0x20,0x20,0x20,0x20,0x20,
                        0x20,0x20,0x20,0x20,0x21,0x22,0x24,0x00};
/* LCD0 비지 플래그를 체크 */
void    busy0(void)
{
    BUSY = 1;       // P0.7  초기 설정
    CS1 = 1;
    RW = 1;
    DI = 0;
    // 비지 플래그 검사
    do {
        E = 1;
        E = 0;
     } while(BUSY);      // LCD0 동작 중?
    CS1 = 0;             // LCD0 동작 불가능
}
/* LCD0 write */
void    lcd0_wr(unsigned char send)
{
        busy0();
     P0 = send;      // LCD0으로 코맨드 출력
        CS1 = 1;
        RW = 0;
        DI = 0;
        E = 1;
        E = 0;
        CS1 = 0;
}
/* LCD0 페이지 지정 */
void    lcd0_page(unsigned char page)
{
        page &= 0x07;    // 0-7로 마스크
        page |= 0xb8;    // 페이지 명령 포맷을 만든다.
        lcd0_wr(page);   // 페이지 라이트
}
/* LCD0 어드레스 지정 */
void    lcd0_address(unsigned char address)
{
        address &= 0x3f;   // 0-63 어드레스 마스크
        address |= 0x40;   // 어드레스 명령 포맷
        lcd0_wr(address);  // 어드레스 라이트
}
/* LCD1 비지 플래그를 체크 */
void    busy1(void)
{
    BUSY = 1;       // P1.7  초기 설정
    CS2 = 1;
    RW = 1;
    DI = 0;
    // 비지 플래그 검사
    do {
        E = 1;
        E = 0;
     } while(BUSY);      // LCD0 동작 중?
    CS2 = 0;             // LCD0 동작 불가능
}
/* LCD1 write */
void    lcd1_wr(unsigned char send)
{
        busy1();
      P0 = send;    // LCD1로 코맨드 출력
        CS2 = 1;
        RW = 0;
        DI = 0;
        E = 1;
        E = 0;
        CS2 = 0;
}
/* LCD1 페이지 지정 */
void    lcd1_page(unsigned char page)
{
        page &= 0x07;      // 0-7로 마스크
        page |= 0xb8;      // 페이지 명령 포맷을 만든다.
        lcd1_wr(page);     // 페이지 라이트
}
/* LCD1 어드레스 지정 */
void    lcd1_address(unsigned char address)
{
        address &= 0x3f;   // 0-63 어드레스 마스크
        address |= 0x40;   // 어드레스 명령 포맷
        lcd1_wr(address);  // 어드레스 라이트
}
/* LCD0으로 폰트 출력 */
void    font0(unsigned char font)
{
        busy0();            // 비지 플래그 체크
        P0 = font;       // 폰트 출력
        CS1 = 1;
        RW = 0;
        DI = 1;
        E = 1;
        E = 0;
        CS1 = 0;
}
/* LCD1로 폰트 출력 */
void    font1(unsigned char font)
{
        busy1();            // 비지 플래그 체크
        P0 = font;       // 폰트 출력
        CS2 = 1;
        RW = 0;
        DI = 1;
        E = 1;
        E = 0;
        CS2 = 0;
}
/* LCD0을 모드 클리어 */
void    lcd0_clear(void)
{
        unsigned char   i,j;
        for(j=0; j<8; j++){
           // 0-7 페이지
           lcd0_page(j);
           lcd0_address(0x00);   // 어드레스 0으로 셋
           // 어드레스 0-63까지 폰트 0x00을 출력
           for(i=0; i<64; i++) font0(0x00); // 폰트 0을 출력
           }
}
/* LCD1을 모드 클리어 */
void    lcd1_clear(void)
{
        unsigned char    i,j;
        for(j=0; j<8; j++){
             /* 0-7 페이지 */
            lcd1_page(j);
            lcd1_address(0x00);     /* 어드레스 0으로 셋 */
           /* 어드레스 0-63까지 폰트 0x00을 출력 */
           for(i=0; i<64; i++) font1(0x00);         /* 폰트 0을 출력 */
         }
}
/* LCD0,1을 모두 클리어시킨다 */
void    clear(void)
{
        lcd0_clear();      /* LCD0 클리어 */
        lcd1_clear();      /* LCD1 클리어 */
}
/* 페이지, 어드레스, 폰트 포인터를 받아서 LCD로 디스플레이 */
void    display(unsigned char page, unsigned char address, unsigned char flag)
{
    unsigned char i,font;
    /*LCD0,LCD1 페이지 설정 */
    lcd0_page(page);
    lcd1_page(page);
    /*LCD0 어드레스 설정 */
    lcd0_address(address);
    /* 64개의 폰트를 디스플레이 */
    for(i=0; i < 64; i++){
       if (flag == 0) font =  M[i];    /* M[] 폰트를 리드 */
       else font =  M1[i];             /* M1[] 폰트를 리드 */
        /* 어드레스가 64가 넘으면 LCD1로 디스플레이*/
        if (address >= 64){      
           lcd1_address(address-64);  /* LCD1 어드레스 설정 */
           font1(font);               /* LCD1로 폰트 출력 */
         }
        /* 어드레스가 64가 넘지 않으면 LCD0으로 디스플레이*/
        else font0(font);            /* LCD0로 폰트 출력 */
        address++;                   /* 어드레스 +1 증가 */
     }
}
/* 메인 프로그램 */
void    main( void )
{
    CS1 = CS2 = E = 0;    // CS1, CS2, E 초기 설정
    lcd0_wr(0x3f);  // LCD0 ON
    lcd1_wr(0x3f);  // LCD1 ON
    lcd0_wr(0xc0);  // LCD0 start line
    lcd1_wr(0xc0);  // LCD1 start line
    /* LCD 전 화면을 클리어시킨다 */
    clear();
    /* 페이지 3, 어드레스 32, 상위 64x8 문자 폰트 배열을 디스플레이 */
    display(3, 32, 0);
    /* 페이지 4, 어드레스 32, 하위 64x8 문자 폰트 배열을 디스플레이 */
    display(4, 32, 1);
    while(1);              /* 무한 루프 */
}

 

댓글 5
  • No Profile
    님이 참고하신 책이나 자료에서 사용한 크리스탈과 님이 사용한 크리스탈 주파수가 같은가요??

  • No Profile

    busy 함수는 잘 작동안되는 경우가 많지요..속도의 차이때문에요....

    시간에 마진을 좀 주는게 좋고요.. 약간 후진 lcd같은 경우는 초기화가 잘 안되서

    초기화 작업을 두세번 해주는게 도움이 되요


    올리신 자료만으로는 더 깊은 설명은 힘드네요

  • No Profile


    KS0107 계열은 모르겠으나
    HD44780은문자를 쓸때 RW 1   RS0 으로 한다음  데이터값을 준다음
    인에이블 신호를 만들고 정확히는 얼만지는 모르겠으나 얼마 이상의 딜레이를 주어야 합니다
    넘어가는 타이밍도 한번 보시길바랍니다
    저도 허접이라서 ...

  • No Profile
    어렵다
  • No Profile

    제생각도 타이밍 ㅋ_ㅋ 비지비트 체크도 괜찮은 방법이지만 안되신다면 딜레이함수로 구현하는것두 괜찮을꺼 같네요 ㅋ

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
172 마이크로프로세서 HOTADD Component 문의2 shin 930 2007.11.07
171 마이크로프로세서 HOT얼마전에 9핀용 부트로더를 구입하여 로더기를 제작하려하는데요...1 악당 868 2007.11.05
170 마이크로프로세서 HOT스테핑모터에 관하여8 あさひ 1730 2007.11.05
169 마이크로프로세서 HOT갑자기 물음표가 떠오릅니다8 고문관 629 2007.11.04
168 마이크로프로세서 HOTat89c2051에 대해서 질문이요^^3 머스트비 841 2007.10.30
167 마이크로프로세서 HOTAT89c51에 PWM...5 shin 1019 2007.10.29
166 마이크로프로세서 HOT아트멜 AT89C51 핀 기능....5 shin 987 2007.10.29
마이크로프로세서 HOT그래픽 LCD 제어가 전혀 안되네요..ㅜㅠ5 임낙 1483 2007.10.27
164 마이크로프로세서 HOT8051 질문7 shin 616 2007.10.27
163 마이크로프로세서 HOT용어 설명좀 해주세요 ㅜㅜ 무슨뜻인지 모르겠네요2 sinpk 1140 2007.10.23
162 마이크로프로세서 HOT아~~ 이놈의 서보모터6 고문관 796 2007.10.23
161 마이크로프로세서 HOT소스 수정중인데 잘 모르겠어요...2 남뎅이 818 2007.10.21
160 마이크로프로세서 HOT궁금한것이 있어서 질문올립니다.4 마그마 753 2007.10.16
159 마이크로프로세서 HOTkeil c 컴파일 에러1 초보 컨트롤 1506 2007.10.15
158 마이크로프로세서 HOT8051 질문입니다...1 무한질주 600 2007.10.14
157 마이크로프로세서 HOTRS232 / RS482 / RS485에 대해서64 아크마여친 12151 2007.10.13
156 마이크로프로세서 HOTled제어 .....5 고문관 737 2007.10.12
155 마이크로프로세서 HOT전원부에 관해서.4 챠리스만 602 2007.10.12
154 Software & IDEs HOT나누미질문이요...4 악당 1035 2007.10.12
153 마이크로프로세서 HOTat89s51 시리얼 isp기능질문1 악당 907 2007.10.12
Prev 1 ... 45 46 47 48 49 50 51 52 53 54 ... 58 Next
  • 인생에서 중요한 법칙은 만사에 중용을 지키는 일이다.
    - 테렌티우스
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.