8051/PIC > GLCD 막대로 ADC 표시하기

TODAY1,051 TOTAL679,974
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 8051/PIC | DT-516 강좌 | GLCD 막대로 ADC 표시하기

페이지 정보

작성자 키트 작성일2017-09-12 10:00 조회434회 댓글0건

본문

 


        sum0=sum1=0;
        for(i=0;i<64;i++)sum0+=read_ADC(0); ADC_p0=sum0/64;
        for(i=0;i<64;i++)sum1+=read_ADC(1); ADC_p1=sum1/64;
//sum을 취해서 안정적인 ADC 값을 만들었는데 사용하고 있지 않네요?

        //
      //ADC_p0=(unsigned int)((float)read_ADC(0) * 256.0 / 1023.0); // read_ADC(0) 함수를 부르지말고
        ADC_p0=(unsigned int)((float)ADC_p0 * 256.0 / 1023.0);     // 위에서 구한 평균값을 사용해야 합니다.
      //ADC_p1=(unsigned int)((float)read_ADC(1) * 256.0 / 1023.0);

        ADC_p1=(unsigned int)((float)ADC_p1 * 256.0 / 1023.0);

//----------

 

 

adc는 10비트라서 1024개의 데이터가 들어오고

LCD의 가로폭은 128개입니다.

        //
        ADC_p0=(unsigned int)((float)ADC_p0 * 256.0 / 1023.0);

        ADC_p1=(unsigned int)((float)ADC_p1 * 256.0 / 1023.0);

 

산술적인 연산을 해줘도 되지만

        ADC_p0>>=3;
        ADC_p1>>=3;
논리적인 연산자인 시프트를 사용해도 됩니다.

ADC값이나 LCD의 폭(128)이 2의 배수이기 때문에 가능합니다.

DT-516키트의 경우 직렬로 저항이 가변저항에 연결 되어 있으므로 ADC분해능의 반 밖에 사용하지 않습니다.

        ADC_p0>>=2;
        ADC_p1>>=2;
따라서 2번만 시프트 시키면 되지만

직렬 저항값의 오류로 인해서 엉뚱한 결과가 나올 수 있으므로 범위를 벗어나지 않도록 처리를 해줍니다.

        if(ADC_p0>511)ADC_p0=511;

        if(ADC_p1>511)ADC_p1=511;

        ADC_p0>>=3;

        ADC_p1>>=3; 

//----------

box와 데이터를 동시에 그리면 더 편할 수 있습니다.

0xFF,0xFF = 0b11111111 0b11111111 // 처음과 마지막 (box)

0x80,0x01 = 0b10000000 0b00000001 // 데이터 0

0xBF,0xFD = 0b10111111 0b11111101 // 데이터 1

 

위 데이터를 버퍼없이 LCD에 직접 뿌리는 함수를 만들면 간단해집니다.

 

 

9-5. GLCD 사각형 그리기 | ◈ K128LCD-A 강좌

위 예제에서 GLCD에 비트맵 버퍼를 전송하는 함수를 보면 

//==============================================================================================
void glcdL_send_buf(char type,char ch){ char i,j;
    for(j=0;j<8;j++){
        glcd_cmnd(type,ch,0,0xB8+j);
        glcd_cmnd(type,ch,0,0x40);
        for(i=0;i<64;i++)glcd_data(type,ch,0,disp_buf[j][0][i]);

        glcd_cmnd(type,ch,1,0xB8+j);
        glcd_cmnd(type,ch,1,0x40);
        for(i=0;i<64;i++)glcd_data(type,ch,1,disp_buf[j][8][i]);
    };
}
//==============================================================================================
커서의 x,y 좌표를 설정 한 뒤에 64개씩 2번 전송 하고 있습니다.

페이지 0~7 중에서 막대 그래프는

adc 채널0이 페이지2,3에

adc 채널1이 페이지6,7에 표시되므로

 

함수를 일부 수정하면 <페이지 2 표시>는 j가  2가 되겠죠

        // LCD 왼쪽

        glcd_cmnd(type,ch,0,0xB8+j);
        glcd_cmnd(type,ch,0,0x40);
        glcd_data(type,ch,0,0xFF); // 처음 box

        for(i=1;i<64;i++){

            if(i<=ADC_p0){ // 데이터 채움

                if((j%2)==0)glcd_data(type,ch,0,0xFD); //짝수, 페이지 2,6

                if((j%2)==0)glcd_data(type,ch,0,0xBF); //홀수, 페이지 3,7

            }

            else{ // 데이터  비움

                if((j%2)==0)glcd_data(type,ch,0,0x01); //짝수, 페이지 2,6

                if((j%2)==0)glcd_data(type,ch,0,0x80); //홀수, 페이지 3,7

            }

        } 

        // LCD 오른쪽

        glcd_cmnd(type,ch,1,0xB8+j);


        glcd_cmnd(type,ch,1,0x40);
        for(i=0;i<63;i++){

            if((i+64)<=ADC_p0){ // 데이터 채움

                if((j%2)==0)glcd_data(type,ch,1,0xFD); //짝수, 페이지 2,6

                if((j%2)==0)glcd_data(type,ch,1,0xBF); //홀수, 페이지 3,7

            }

            else{ // 데이터  비움

                if((j%2)==0)glcd_data(type,ch,1,0x01); //짝수, 페이지 2,6

                if((j%2)==0)glcd_data(type,ch,1,0x80); //홀수, 페이지 3,7

            }

        }

        glcd_data(type,ch,1,0xFF); // 마지막 box

 

함수를 복사해서 새로운 이름으로 만든 후에 8051에 맞도록 잘 수정해서 만들어보세요

if(i<=ADC_p0){ 색칠한 ADC 변수 비교 부분은 플래그나 인수로 직접 넘기든지 하면 함수 1개로도 사용이 가능 할겁니다.^^

 

4개의 페이지에 표시 하므로

함수는 모두 4번 호출하면 됩니다.

댓글 0

조회수 434

등록된 댓글이 없습니다.

8051/PICHOME > 8051/PIC > 전체 목록

게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기