'원'에 해당되는 글 1건

  1. 2011.08.10 그래픽 LCD 도형(원, 사각형, 라인) 그리기

 

그래픽 LCD 에 영문, 원, 사각형 선(라인)을 출력 하는 예제입니다.

 

 

 

 

 

 

원문은 http://avr128.com 에 있습니다.

 

 

 

 

주요 코드

 

main.c 일부

/*

    

필요한보드

    1. WAT-AVR128 (모듈)

    2. WAT-AVR128 EXT (확장보드)

    3. WAT-GLCD (모노그래픽LCD)

 

기능

    그래픽LCD 에사각형, 원, 라인을그린다.

 

 

    http://avr128.com

 

    

    2011-08-10 : 사각형, 원, 라인그리기기능추가

 

*/

 

 

#include <avr/io.h>

#include "WAT128.h"

 

 

#ifdef _USE_GLCD_

#include "gfont.h"

#endif

 

 

int main(){

 

    int i=0;

 

 

//    OpenSCI0(57600); // 디버깅포트

 

    GLCD_Init();

    GLCD_String(0,0," AVR128.com");

 

 

    // 외각선(사각형) 그리기

    GLCD_DrawRect(0,0,127,63);

 

    // 대각선그리기

    GLCD_DOT_Line(0,0,127,63);

    GLCD_DOT_Line(0,63,127,0);

 

    // 원그리기

    GLCD_DOT_DrawCircle(64,32,10);

    GLCD_DOT_DrawCircle(32,32,14);

    GLCD_DOT_DrawCircle(96,32,14);

 

    while(1)

    {

 

    }

}

 

 

 

 

 

 

wat128.h 일부

// 점찍기

void GLCD_SetPixel(int x1,int y1,BOOL _b);

 

// 라인그리기

void GLCD_DOT_Line(int x1,int y1,int x2,int y2);

 

// 원그리기

void GLCD_DOT_DrawCircle(int x1,int y2,int _size);//

 

// 사각형그리기

void GLCD_DrawRect(int x1,int y1,int x2,int y2);

 

 

 

 

 

wat128.c 일부

 

void GLCD_SetPixel(int x1,int y1,BOOL _b)

{

    BYTE byteCS = 0;

    BYTE byteData;

 

    if(x1>=128 || y1>=64)

        return;

 

    if(x1<64 )

    {

        byteCS = 0x01;    

    }

    else

    {

        x1 = x1%64;

        byteCS = 0x02;

    }

 

 

    GLCD_Command(byteCS,0x40 + x1);    // x 좌표지정

    GLCD_Command(0x00,0xB8 + y1/8);    // y 좌표지정

 

 

    GLCD_ReadData(byteCS); //read 하면처음에이상한값이나온다;; 그냥버림

    

 

    byteData = GLCD_ReadData(byteCS);

 

    if(_b==1)

        byteData |= 1<<(y1%8);

    else

        byteData &= ~(1<<(y1%8));

 

    GLCD_Command(byteCS,0x40 + x1);    // x 좌표지정

    GLCD_Command(0x00,0xB8 + y1/8);    // y 좌표지정

 

    GLCD_WriteData(byteCS, byteData,0);

 

}

 

 

void GLCD_DOT_Line(int x1,int y1,int x2,int y2)

{

    int i;

    int y=y1;

    for(i=x1;i<=x2;i++)

    {

        if(y1 <y2)

            y = y1+(i-x1)*(y2-y1)/(x2-x1);

        else

            y = y1-(i-x1)*(y1-y2)/(x2-x1);

        GLCD_SetPixel(i,y,1);

    }

 

}

 

void GLCD_DOT_DrawCircle(int x1,int y1,int _size)

{

    int i;

    int j;

    int y=0;

    int Lasty=0;// dot 간의간격이클경우임의의선을그려준다.

 

    for(i=x1-_size;i<=x1+_size;i++)

    {

        y= round(sqrt((_size*_size )-(i-x1)*(i-x1)));

 

        GLCD_SetPixel(i,y1+y,1);

        GLCD_SetPixel(i,y1-y,1);

 

        if(Lasty !=0)

        {

            // 좌측처리

            if(Lasty +1< y1+y)

            {

                // dot 사이의간격이너무벌어진것이다.

                for(j=1;j<(y1+y)-Lasty;j++)

                {

 

                    GLCD_SetPixel(i-1,y1-y+j,1);    // 좌측상단

                    GLCD_SetPixel(i-1,y1+y-j,1);// 좌측하단에끊어진부분

 

                    //sprintf(g_temp,"\r\nLasty:%dm j:%d",Lasty,j);

                    //PutString0(g_temp);

 

                }

 

            }

            // 우측처리

             else if(Lasty -1 > y1+y)

            {

                // dot 사이의간격이너무벌어진것이다.

                for(j=1;j<Lasty - (y1+y);j++)

                {

                    sprintf(g_temp,"\r\nLasty:%dm i:%d, j:%d, y1+y-j:%d",Lasty,i,j,y1+y-j);

                    PutString0(g_temp);

 

                     GLCD_SetPixel(i,y1-y-j,1);// 우측상단

                     GLCD_SetPixel(i,y1+y+j,1);// 우측하단에끊어진부분

 

 

                }

 

            }

 

        }

 

        Lasty = y1+y;

    }

}

 

void GLCD_DrawRect(int x1,int y1,int x2,int y2)

{

 

    int i=0;

    for(i=x1;i<=x2;i++)

    {

        GLCD_SetPixel(i,y1,1);

        GLCD_SetPixel(i,y2,1);

 

    }

    for(i=y1+1;i<=y2-1;i++)

    {

        GLCD_SetPixel(x1,i,1);

        GLCD_SetPixel(x2,i,1);

 

    }

 

 

 

}

 

 

 

 

 

전체 소스

 



Posted by WhiteAT
,