회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
15 Software & IDEs HOT어셈블리 프로그래밍에서 질문이 있습니다.1 strongman 1142 2009.08.07
14 Software & IDEs HOT데이터 전송 모듈... 류짜장 1034 2008.12.16
13 Software & IDEs HOT8051 신호등 만들때 헤더파일 문제.1 마모루 1484 2008.11.16
12 Software & IDEs HOT길찾기 알고리즘3 인조사람 1192 2008.10.20
11 Software & IDEs HOTMFC로 길찾기 구현 남뉴 1670 2008.10.05
10 Software & IDEs HOT완전초보입니다. 잘부탁드립니다.4 초보민 987 2008.09.19
9 Software & IDEs HOTMatlab 시리얼통신을 통한 그래프만들기..;;1 GreatSSang 3698 2008.09.16
8 Software & IDEs HOT검색엔진의 문자열 논리연산 구현! 도와주세요 ㅡㅜ1 델리트 1085 2008.08.13
7 Software & IDEs HOT윈도우 상에서 비주얼 2005를 이용한 시리얼 포트 프로그래밍2 .ㅇㅈㅇㅈ 1073 2008.07.04
6 Software & IDEs HOTLCMS, DirectX SDK, Visual Studio 6, Platform SDK 호환성 문제 아크마 2233 2008.04.19
5 Software & IDEs HOT칼씨 사용법은 없나요??2 돌격대장 1078 2008.04.13
4 Software & IDEs HOT비쥬얼비튜디오 20057 あさひ 993 2008.02.02
3 Software & IDEs HOTapi 관련해서 물어봅니당..ㅠ2 화언 723 2008.02.01
2 Software & IDEs HOT8051도트입니다1 판도라 1087 2008.01.30
1 Software & IDEs HOT나누미질문이요...4 악당 1033 2007.10.12
  • 산에는 우정이 있다.
    - 텐진
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.