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

📄 lcd6610.h

📁 NOKIA 6610液晶初始化程序
💻 H
📖 第 1 页 / 共 2 页
字号:
//--------Nokia 6610 LCD-----ICCAVR----------
#include "ascii.h"
//-----6610 Command -------------------------
#define GLCD_PIXELX			130
#define GLCD_PIXELY			130
#define GLCD_X_START		0
#define GLCD_Y_START		0
#define GLCD_X_END			GLCD_PIXELY-1
#define GLCD_Y_END			GLCD_PIXELY-1
#define ADDRX				0x75
#define ADDRY				0x15
#define MEMWRITE			0x5C
//-------------------------------------------

#define csl asm("cbi 0x12,1") //PB0
#define csh asm("sbi 0x12,1")

#define restl asm("cbi 0x12,0") //PB4
#define resth asm("sbi 0x12,0")

#define sclkl asm("cbi 0x18,5") //PB5
#define sclkh asm("sbi 0x18,5")

#define sdatal asm("cbi 0x18,3") //PB3
#define sdatah asm("sbi 0x18,3")
#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;}

typedef struct {
    unsigned char X1;
    unsigned char Y1;
    unsigned char X2;
    unsigned char Y2;
} glcdRect_t;

glcdRect_t      glcd_Clip;

unsigned char Color1=0,Color2=0;
unsigned char backgroundColor = 0,b2=0;
unsigned char memAccessCtrl=0,zx=0,zy=0;
char st[20];
unsigned int cobk,cofg,cofr,cosh,cotext;

void sc_cbk(unsigned char r,unsigned char g,unsigned char b,unsigned int tm) 
{cobk= RGB(r,g,b)|(tm<<15);

}

void sc_ctext(unsigned char r,unsigned char g,unsigned char b,unsigned int tm) 
{cotext= RGB(r,g,b)|(tm<<15);

}

void sc_cfg(unsigned char r,unsigned char g,unsigned char b,unsigned int tm) 
{
cofg= RGB(r,g,b)|(tm<<15);

}

void sc_cfr(unsigned char r,unsigned char g,unsigned char b,unsigned int tm) 
{
cofr= RGB(r,g,b)|(tm<<15);
}

void sc_csh(unsigned char r,unsigned char g,unsigned char b,unsigned int tm) 
{
cosh= 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 glcdn_Delay(long ld)
{
	long d;
	for(d=0;d<ld;d++)
	{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();

	}
}



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 (cofg&0x8000) {
    	RGBToChar(cofg);
      glcdDoFillRect(x1, y1, x2, y1);
      glcdDoFillRect(x2, y1, x2, y2);
      glcdDoFillRect(x1, y2, x2, y2);
      glcdDoFillRect(x1, y1, x1, y2);
    }
    if (cobk&0x8000) {
    	RGBToChar(cobk);
      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 (cosh&0x8000) {
    	RGBToChar(cosh);
      glcdDoFillRect(x1 + 4, y2, x2 - 2, y2);
      glcdDoFillRect(x2, y1 +4, x2, y2 -2);
      x2--;
      y2--;
      glcdDoFillRect(x2 -2, y2 -2, x2, y2);
    }
    if (cofr&0x8000) {
    	RGBToChar(cofr);
      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 (cobk&0x8000) {
    	RGBToChar(cobk);
      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 (cofg&0x8000) {
    	RGBToChar(cofg);
      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 (cofg&0x8000) {
          	RGBToChar(cofg);
            point(x1, y);
          }
          x1++;
        }
      }
      if (x2 < glcd_Clip.X1) {return;} else {
        if (x2 > glcd_Clip.X2) {x2 = glcd_Clip.X2;} else {
          if (cofg&0x8000) {
          	RGBToChar(cofg);
            point(x2, y);
          }
          x2--;
        }
      }
      if ((fill) & (cobk&0x8000) & (x1 <= x2)) {
      	RGBToChar(cobk);
        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 (cobk&0x8000) {
     	RGBToChar(cobk);
       glcdFillRect(0, 0, GLCD_PIXELX, GLCD_PIXELY);
     }
     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;
     }
     xs--;
     xe++;
   }
}

void RoundRect(unsigned char x,unsigned char y,unsigned char w,unsigned char h,unsigned char r)
{
char Ox,Oy,rr,xt,yt,rs,zx1,zy1;
int xx;
//if(x<0||y<0)return;

	
if (cobk&0x8000) //填充
{RGBToChar(cobk);
	
	Ox=x+r;Oy=y+r;
	yt=r;
	rr=r*r+1;			//补偿 1 修正方形
	rs=(yt+(yt>>1))>>1;		//(*0.75)分开1/8圆弧来画

	for (xt=0;xt<=rs;xt++)
	{
		xx=xt*xt;
		while ((yt*yt)>(rr-xx))yt--;
		
		zx=Ox+xt+w-(r*2);		//第一象限
		zx1=zx;
		zy=Oy-yt;
		//point2();
		
//		zy=Oy-yt;
		zx=Ox-xt;		//第二象限

		//point2();if (zy!=y)
			 {
		glcdFillRect(zx1-1,zy,zx+1,zy);
	}
	
		zx1=zx;
			
		zy=Oy+yt+h-(r*2);		//第三象限
		//point2();
		
		zx=Ox+xt+w-(r*2);		//第四象限if (zy!=y+h) 
			{
		glcdFillRect(zx1+1,zy,zx-1,zy);	
	}
//-----------------------------------------
		zx=Ox+yt+w-(r*2);		//第一象限
		zy=Oy-xt;
		//point2();
		
		zx1=zx;
		//zy=Oy-xt;//+w-(r*2);
		zx=Ox-yt;//+h-(r*2);		//第二象限
		//point2();
		

		glcdFillRect(zx1-1,zy,zx+1,zy);

		
		zx1=zx;
		zy=Oy+xt+h-(r*2);		//第三象限
		//point2();
		
		zx=Ox+yt+w-(r*2);		//第四象限
		//point2();
		
		glcdFillRect(zx1+1,zy,zx-1,zy);

	}
	

     	
	glcdFillRect(x+1, y+r+1,x+w-1,y+h-r-1);

	
}
//------------------------------------------

if(cofg&0x8000) //画边筐
{
RGBToChar(cofg);
glcdLine(x+r,y,x+w-r,y);
glcdLine(x,y+r,x,y+h-r);
glcdLine(x+w,y+r,x+w,y+h-r);
glcdLine(x+r,y+h,x+w-r,y+h);

	
	Ox=x+r;Oy=y+r;
	yt=r;
	rr=r*r+1;			//补偿 1 修正方形
	rs=(yt+(yt>>1))>>1;		//(*0.75)分开1/8圆弧来画
	
	for (xt=0;xt<=rs;xt++)
	{
		xx=xt*xt;
		while ((yt*yt)>(rr-xx))yt--;
		
		zx=Ox+xt+w-(r*2);		//第一象限
		zy=Oy-yt;
		point2();
		
//		zy=Oy-yt;
		zx=Ox-xt;		//第二象限

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -