📄 lcd6610.h
字号:
//--------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 + -