📄 lcd6610.c
字号:
#define SCREEN_WIDTH 132 // Nokia6100, wobei aber nur 1,1-130,130 sichtbar sind. Denoch ben鰐igen wir vollen
#define SCREEN_HEIGHT 132 // Zugriff auf den RAM wenn wir zB. das Scrolling nutzen wollen
#define SCREEN_LEFT 1
#define SCREEN_TOP 1
#define SCREEN_RIGHT (SCREEN_WIDTH -2)
#define SCREEN_BOTTOM (SCREEN_HEIGHT -2)
typedef struct {
unsigned char X1;
unsigned char Y1;
unsigned char X2;
unsigned char Y2;
} glcdRect_t;
glcdRect_t glcd_Clip;
#define glcdDoSwapCoord(x, y) {unsigned char t = x; x = y; y = t;}
#define glcdDoCheckCoord(x, y) {if (x > y) {glcdDoSwapCoord(x, y)}}
#define glcdSetRect(r,x1,y1,x2,y2) {r.X1 = x1; r.Y1 = y1; r.X2 = x2; r.Y2 = y2;}
unsigned char Color1=0,Color2=0;
unsigned char backgroundColor = RED,b2=0;
unsigned char memAccessCtrl=0,zx=0,zy=0;
int cbk,cfg,cfr,csh;
void sc_cbk(unsigned char r,unsigned char g,unsigned char b,unsigned int tm)
{cbk= RGB(r,g,b)|(tm<<15);
}
void sc_cfg(unsigned char r,unsigned char g,unsigned char b,unsigned int tm)
{
cfg= RGB(r,g,b)|(tm<<15);
}
void sc_cfr(unsigned char r,unsigned char g,unsigned char b,unsigned int tm)
{
cfr= RGB(r,g,b)|(tm<<15);
}
void sc_csh(unsigned char r,unsigned char g,unsigned char b,unsigned int tm)
{
csh= RGB(r,g,b)|(tm<<15);
}
void glcdSetPixel(unsigned char x, unsigned char y) {
if ((x >= glcd_Clip.X1) & (x <= glcd_Clip.X2) & (y >= glcd_Clip.Y1) & (y <= glcd_Clip.Y2)) {
point(x,y);
}
}
void glcdDoFillRect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) {
char x, y;
//RGB(r,g,b);
if ((x1 > glcd_Clip.X2) | (x2 < glcd_Clip.X1) | (y1 > glcd_Clip.Y2) | (y2 < glcd_Clip.Y1)) {return;}
if (x1 < glcd_Clip.X1) {x1 = glcd_Clip.X1;}
if (y1 < glcd_Clip.Y1) {y1 = glcd_Clip.Y1;}
if (x2 > glcd_Clip.X2) {x2 = glcd_Clip.X2;}
if (y2 > glcd_Clip.Y2) {y2 = glcd_Clip.Y2;}
if ((x1 <= x2) & (y1 <= y2))
{
glcdn_SetPageArea(x1,x2,y1,y2);
glcdn_WriteCommand(MEMWRITE);
for (y = y1; y <= y2; y++) {
for (x = x1; x <= x2; x++) {
glcdn_WriteData(Color1);
glcdn_WriteData(Color2);
}
}
}
}
void glcdFillRect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) {
glcdDoCheckCoord(x1, x2);
glcdDoCheckCoord(y1, y2);
//RGB(r,g,b);
glcdDoFillRect(x1, y1, x2, y2);
}
void glcdRectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) {
glcdDoCheckCoord(x1, x2);
glcdDoCheckCoord(y1, y2);
if (cfg&0x8000) {
RGBToChar(cfg);
glcdDoFillRect(x1, y1, x2, y1);
glcdDoFillRect(x2, y1, x2, y2);
glcdDoFillRect(x1, y2, x2, y2);
glcdDoFillRect(x1, y1, x1, y2);
}
if (cbk&0x8000) {
RGBToChar(cbk);
glcdDoFillRect(++x1, ++y1, --x2, --y2);
}
}
void glcdFrame(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) {
glcdDoCheckCoord(x1, x2);
glcdDoCheckCoord(y1, y2);
if (csh&0x8000) {
RGBToChar(csh);
glcdDoFillRect(x1 + 4, y2, x2 - 2, y2);
glcdDoFillRect(x2, y1 +4, x2, y2 -2);
x2--;
y2--;
glcdDoFillRect(x2 -2, y2 -2, x2, y2);
}
if (cfr&0x8000) {
RGBToChar(cfr);
glcdDoFillRect(x1 +2, y1, x2 -2, y1);
glcdDoFillRect(x1 +2, y2, x2 -2, y2);
glcdDoFillRect(x2, y1 +2, x2, y2 -2);
glcdDoFillRect(x1, y1 +2, x1, y2 -2);
x1++;
y1++;
x2--;
y2--;
glcdSetPixel(x1, y1);
glcdSetPixel(x2, y1);
glcdSetPixel(x1, y2);
glcdSetPixel(x2, y2);
}
if (cbk&0x8000) {
RGBToChar(cbk);
glcdDoFillRect(x1, y1 +1, x1, y2 -1);
glcdDoFillRect(x2, y1 +1, x2, y2 -1);
glcdDoFillRect(x1 +1, y1, x2 -1, y2);
}
}
void glcdLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) {
unsigned char swap,i;
unsigned char dx, dy, sx, sy;
int e;
unsigned char x3;
unsigned char y3;
if (cfg&0x8000) {
RGBToChar(cfg);
if ((x1 == x2) | (y1 == y2)) {
glcdFillRect(x1, y1, x2, y2);
} else {
if (x1 < x2) {dx = x2 - x1; sx = +1;}
else {dx = x1 - x2; sx = -1;}
if (y1 < y2) {dy = y2 - y1; sy = +1;}
else {dy = y1 - y2; sy = -1;}
if(dx > dy)swap=0;
else swap= 1;
if (swap) {
glcdDoSwapCoord(x1, y1);
glcdDoSwapCoord(dx, dy);
glcdDoSwapCoord(sx, sy);
}
e = dy - dx + dy;
x3 = x1;
y3 = y1;
x2 = x1;
y2 = y1;
/* Diese Loop ist suboptimal. Man k鰊nte mehr rausholen wenn man die Hardware besser ausnutzen w黵de, aber
dann w鋜e diese Routine eben nicht mehr Hardwareunabh鋘gig so wie jetzt. */
for (i = 0; i <= dx; i++) {
if ((x1 != x2) & (y1 != y2)) {
if (swap) {
glcdDoSwapCoord(x2, y2);
glcdDoSwapCoord(x3, y3);
}
glcdDoCheckCoord(x2, x3);
glcdDoCheckCoord(y2, y3);
glcdDoFillRect(x2, y2, x3, y3);
x2 = x1;
y2 = y1;
};
x3 = x1;
y3 = y1;
while (e >= 0) {
y1 += sy;
e -= dx;
e -= dx;
}
x1 += sx;
e += dy;
e += dy;
}
if (swap) {
glcdDoSwapCoord(x2, y2);
glcdDoSwapCoord(x3, y3);
}
glcdDoCheckCoord(x2, x3);
glcdDoCheckCoord(y2, y3);
glcdDoFillRect(x2, y2, x3, y3);
}
}
}
/* Hilfsfunktion f黵 Ellipsen */
void glcdDoPixelLine(unsigned int x1, unsigned int x2, unsigned int y, unsigned char fill) {
if ((y >= glcd_Clip.Y1 ) & (y <= glcd_Clip.Y2)) {
if (x1 < glcd_Clip.X1) {x1 = glcd_Clip.X1;} else {
if (x1 > glcd_Clip.X2) {return;} else {
if (cfg&0x8000) {
RGBToChar(cfg);
point(x1, y);
}
x1++;
}
}
if (x2 < glcd_Clip.X1) {return;} else {
if (x2 > glcd_Clip.X2) {x2 = glcd_Clip.X2;} else {
if (cfg&0x8000) {
RGBToChar(cfg);
point(x2, y);
}
x2--;
}
}
if ((fill) & (cbk&0x8000) & (x1 <= x2)) {
RGBToChar(cbk);
glcdDoFillRect(x1, y, x2, y);
}
}
}
void glcdCircle(unsigned char x, unsigned char y, unsigned char r) {
glcdEllipse(x, y, r, r);
}
void glcdEllipse(unsigned char x, unsigned char y, unsigned char a, unsigned char b) {
int aa;
int bb;
long er, cr, ir;
int ys,ye,xs,xe;
unsigned char fill = 1;
if ((a == 0) | (b == 0)) {return;}
if ((a > 180) | (b > 180)) {
if (cbk&0x8000) {
RGBToChar(cbk);
glcdFillRect(0, 0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1);
}
return;
}
aa = a * a;
bb = b * b;
cr = bb >> 1;
cr = cr * (a + a -1);
ir = aa >> 1;
ir = -ir;
er = 0;
xs = x;
xs = xs - a;
xe = x;
xe = xe + a;
ys = y;
ye = y;
while (cr >= ir) {
glcdDoPixelLine(xs, xe, ys, 1);
if (ys != ye) {
glcdDoPixelLine(xs, xe, ye, 1);
}
ys--;
ye++;
ir += aa;
er += ir;
if (2 * er > cr) {
er -= cr;
cr -= bb;
xs++;
xe--;
}
}
cr = aa >> 1;
cr = cr * (b + b -1);
ir = bb >> 1;
ir = -ir;
er = 0;
xs = x;
xe = x;
ys = y;
ys = ys - b;
ye = y;
ye = ye + b;
fill = 1;
while (ir <= cr) {
glcdDoPixelLine(xs, xe, ys, fill);
if (ys != ye) {
glcdDoPixelLine(xs, xe, ye, fill);
}
fill = 0;
ir += bb;
er += ir;
if (2 * er > cr) {
er -= cr;
cr -= aa;
ys++;
ye--;
fill = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -