⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd6610.c

📁 Nokia6610 LCD C PROGRAMME
💻 C
📖 第 1 页 / 共 2 页
字号:

#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 + -