그래픽 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);
}
} |
전체 소스
'AVR키트' 카테고리의 다른 글
WAT-AVR128(ATMEGA128A), EX_09_02, PC에서 받은 데이터 LCD에 출력 (0) | 2011.08.16 |
---|---|
WAT-AVR128, EX_01_01, 순차적으로 LED ON 예제 (0) | 2011.08.16 |
Graphics LCD 에 커서(Cursor) 있는 영문 출력하기 (0) | 2011.08.09 |
WAT-AVR128 예제 (소스 제공) (0) | 2011.07.20 |
WAT-AVR128_EXT 보드 (0) | 2011.07.20 |
댓글을 달아 주세요