📄 lcd.c
字号:
}
nCol++;
nBit++;
}
nRow++;
nCol = nX;
}
}
/**********************************************************************
* 函数名称: LCD_DrawText
* 功能描述:
* 在LCD上显示文本
* 参数说明:
* x 汉字要在LCD上像素的起始横座标
* y 汉字要在LCD上像素的起始纵座标
* pcText 显示文本内容
* nTxtLen 显示的文本长度
* frontColor 前景色
* backColor 背景色
* 返回值
* 无
******************************************************************/
void LCD_DrawText(int y, int x, char * pcText, int nTxtLen, RGB_COLOR backColor, RGB_COLOR frontColor)
{
int nIndex = 0;
if(pcText == 0 || x < 0 || x >= SCR_XSIZE || y < 0 || y >= SCR_YSIZE)
{
return;
}
while(nIndex < nTxtLen)
{
if(pcText[nIndex] > 0xA0 && pcText[nIndex + 1] > 0xA0)
{
LCD_DispCN(&pcText[nIndex], y, x, frontColor, backColor);
x += 16;
nIndex += 2;
}
else
{
LCD_DispEN(pcText[nIndex], y, x, frontColor, backColor);
x += 8;
nIndex++;
}
}
}
/**********************************************************************
* 函数名称: LCD_draw
* 功能描述:
* 显示图片
* 参数说明:
* y_pos x_pos 起始坐标
* h l 高度和宽度
* bmp 图片的颜色数组
* 返回值
* 无
******************************************************************/
void LCD_draw(unsigned int y_pos, unsigned int x_pos,
unsigned int h, unsigned int l, const unsigned char *bmp)
{
int y, x;
int pos = 0;
int mskstate = INTMSK;
INTMSK |= ((1 << 10) | (1 << 31));//关掉定时器0
for(y = 0; y < h; y++)
{
for(x = 0; x < l; x++)
{
if( ((y + y_pos) < SCR_YSIZE) && ((x + x_pos) < SCR_XSIZE) )
{
gsnLCD_BUFFER[y + y_pos][x + x_pos] = (bmp[pos] << 8) | bmp[pos + 1];
}
pos += 2;
}
}
INTMSK = mskstate;
}
//=============================================================
//语法格式: void LCD_ShowCircle(unsigned x,unsigned y,unsigned r,RGB_COLOR color,unsigned Mode)
//实现功能: 在屏幕中画圆
//参数:
// x - 圆心的x坐标
// y - 圆心的y坐标
// r - 圆的半径
// color - 圆的颜色
// Mode - 0(PAINT_HOLLOW) 空心圆
// 1(PAINT_SOLID) 实心圆
//返回值: 无
//=============================================================
void LCD_ShowCircle(unsigned x,unsigned y,unsigned r,RGB_COLOR color,unsigned Mode)
{
int dx,dy,ref;
int Temp;
if(r == 0)
return;
dx = r;
dy = 1;
ref = 707 * r / 1000; // 参考值为0.707r
if(Mode == PAINT_SOLID) // 实心圆
{
while(dy <= dx)
{
if(dx > ref)
LCD_Line(x + ref + 1, y + dy, x + dx, y + dy, color);
if(x >= ref + 1 && dx > ref)
{
if(x < dx)
Temp = 0;
else
Temp = x - dx;
LCD_Line(Temp, y + dy, x - ref - 1, y + dy, color);
}
if(y >= dy && dx > ref)
LCD_Line(x + ref + 1, y - dy, x + dx, y - dy, color);
if(x >= ref + 1 && y >= dy && dx > ref)
{
if(x < dx)
Temp = 0;
else
Temp = x - dx;
LCD_Line(Temp, y - dy, x - ref - 1, y - dy, color);
}
if(dy != dx || dx == ref)
{
if(y < dx)
Temp = 0;
else
Temp = y - dx;
LCD_Line(x + dy, Temp, x + dy, y + dx, color);
}
if(x >= dy && (dy != dx || dy == ref))
{
if(y < dx)
Temp = 0;
else
Temp = y - dx;
LCD_Line(x - dy, Temp, x - dy, y + dx, color);
}
dy++;
if((r*r-dy*dy)<=(dx-1)*dx)
dx--;
}
LCD_Line(x + ref + 1, y, x + r, y, color);
if(x >= ref + 1)
{
if(x < r)
Temp = 0;
else
Temp = x - r;
LCD_Line(Temp, y, x - ref - 1, y, color);
}
if(y < r)
Temp = 0;
else
Temp = y - r;
LCD_Line(x, Temp, x, y + r, color);
}
else // 空心圆
{
while(dy <= dx)
{
LCD_PutPixel(x + dx, y + dy, color);
LCD_PutPixel(x - dx, y + dy, color);
LCD_PutPixel(x + dx, y - dy, color);
LCD_PutPixel(x - dx, y - dy, color);
if(dx != dy)
{
LCD_PutPixel(x + dy, y + dx, color);
LCD_PutPixel(x + dy, y - dx, color);
LCD_PutPixel(x - dy, y + dx, color);
LCD_PutPixel(x - dy, y - dx, color);
}
dy++;
if((r*r-dy*dy)<=(dx-1)*dx)
dx--;
}
LCD_PutPixel(x + r, y, color);
LCD_PutPixel(x - r, y, color);
LCD_PutPixel(x, y + r, color);
LCD_PutPixel(x, y - r, color);
}
}
//=============================================================
//语法格式: void LCD_Line(short x1, short y1, short x2, short y2, RGB_COLOR color)
//实现功能: 在屏幕中画直线
//参数:
// x1 - 起始点的x坐标
// y1 - 起始点的y坐标
// x2 - 结束点的x坐标
// y2 - 结束点的y坐标
// color - 直线颜色
//返回值: 无
//=============================================================
void LCD_Line(short x1, short y1, short x2, short y2, RGB_COLOR color)
{
short dx, dy, e;
dx = x2 - x1;
dy = y2 - y1;
if(dx >= 0)
{
if(dy >= 0) // dy>=0
{
if(dx >= dy) // 1/8 octant
{
e = dy-dx/2;
while(x1 <= x2)
{
LCD_PutPixel(x1,y1,color);
if(e > 0)
{
y1 += 1;
e -= dx;
}
x1 += 1;
e += dy;
}
}
else // 2/8 octant
{
e = dx-dy/2;
while(y1 <= y2)
{
LCD_PutPixel(x1, y1, color);
if(e > 0)
{
x1 += 1;
e -= dy;
}
y1 += 1;
e += dx;
}
}
}
else // dy<0
{
dy = -dy; // dy=abs(dy)
if(dx >= dy) // 8/8 octant
{
e = dy-dx/2;
while(x1 <= x2)
{
LCD_PutPixel(x1,y1,color);
if(e > 0)
{
y1 -= 1;
e -= dx;
}
x1 += 1;
e += dy;
}
}
else // 7/8 octant
{
e = dx-dy/2;
while(y1 >= y2)
{
LCD_PutPixel(x1, y1, color);
if(e > 0)
{
x1 += 1;
e -= dy;
}
y1 -= 1;
e += dx;
}
}
}
}
else //dx<0
{
dx = -dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx >= dy) // 4/8 octant
{
e = dy-dx/2;
while(x1 >= x2)
{
LCD_PutPixel(x1, y1, color);
if(e > 0)
{
y1 += 1;
e -= dx;
}
x1 -= 1;
e += dy;
}
}
else // 3/8 octant
{
e = dx-dy/2;
while(y1 <= y2)
{
LCD_PutPixel(x1, y1, color);
if(e > 0)
{
x1 -= 1;
e -= dy;
}
y1 += 1;
e += dx;
}
}
}
else // dy<0
{
dy = -dy; // dy=abs(dy)
if(dx >= dy) // 5/8 octant
{
e = dy-dx/2;
while(x1 >= x2)
{
LCD_PutPixel(x1, y1, color);
if(e > 0)
{
y1 -= 1;
e -= dx;
}
x1 -= 1;
e += dy;
}
}
else // 6/8 octant
{
e = dx-dy/2;
while(y1 >= y2)
{
LCD_PutPixel(x1, y1 ,color);
if(e > 0)
{
x1 -= 1;
e -= dy;
}
y1 -= 1;
e += dx;
}
}
}
}
}
void LCD_DispCN_DIY(int Area,int Index, int nY, int nX, RGB_COLOR backColor, RGB_COLOR frontColor)
{
int nRow = nY;
int nCol = nX;
int cArea = Area;
int cIndex = Index ;
char *pcCharPos = (char *)(HZK16_BASE + ((cArea - 1) * 94 + (cIndex - 1)) * 32);
int nBit = 0;
char cCh1;
char cCh2;
while(nRow < nY + 16)
{
cCh1 = *pcCharPos;
cCh2 = *(pcCharPos + 1);
pcCharPos += 2;
while(nBit < 8)
{
if(cCh1 & (1 << (7 - nBit)))
{
if(nCol < SCR_XSIZE && nRow < SCR_YSIZE)
{
gsnLCD_BUFFER[nRow][nCol] = backColor;
}
}
else
{
if(nCol < SCR_XSIZE && nRow < SCR_YSIZE)
{
gsnLCD_BUFFER[nRow][nCol] = frontColor;
}
}
nCol++;
nBit++;
}
nBit = 0;
while(nBit < 8)
{
if(cCh2 & (1 << (7 - nBit)))
{
gsnLCD_BUFFER[nRow][nCol] = backColor;
}
else
{
gsnLCD_BUFFER[nRow][nCol] = frontColor;
}
nCol++;
nBit++;
}
nBit = 0;
nRow++;
nCol = nX;
}
}
/**************************************************************
在LCD屏幕上画一个矩形
**************************************************************/
void LCD_ShowRectangle(int x1,int y1,int x2,int y2,int color)
{
LCD_Line(x1,y1,x2,y1,color);
LCD_Line(x2,y1,x2,y2,color);
LCD_Line(x1,y2,x2,y2,color);
LCD_Line(x1,y1,x1,y2,color);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -