📄 lcd.c
字号:
tcs1 = 0;
tcs2 = 1;
tcolumn = Px-64;
}
tpage = Py>>3;
WI2CToLCD(tcs1, tcs2, tpage, tcolumn, ValByte);
}
/*
**********************************************************************
函数名: B_DrawLine
参数: 起始点(Sx,Sy)与终点坐标(Ex,Ey),范围(X=0-MaxHdots,Y=0-MaxVdots)
颜色值Color(点亮=1;熄灭=0)
返回值: 无
作用: 用于在屏幕指定两点间画一条直线(采用DDA)算法
**********************************************************************
*/
extern void B_DrawLine(uchar Sx, uchar Sy, uchar Ex, uchar Ey, bit Color)
{
uchar Dx; //当前作图点的X坐标
uchar Dy; //当前作图点的Y坐标
uchar i;
uchar LoopLen;
//DDA
float DDA_X;
float DDA_Y;
float DelX;
float DelY;
float DDA_xInc;
float DDA_yInc;
bit Dstyle;
uchar Midch;
if( Sx==Ex )//X座标重叠则画坚直线
{
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sy,Ey);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dy<Ey )
Dy++;
else
Dy--;
}
}
else if(Sy==Ey)//Y座标重叠则画水平线
{
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sx,Ex);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dx<Ex )
Dx++;
else
Dx--;
}
}
else //DDA直线插值算法
{
//由于C51中浮点数(正负数)处理能力有限,将起点与终点进行规格化
//要保证Sx<Ex且Sy<Ey
Dstyle=0;//Dstyle=0不镜像
if(Sx>Ex && Sy>Ey)//交换
{
Midch=Sx; Sx=Ex; Ex=Midch;
Midch=Sy; Sy=Ey; Ey=Midch;
Dstyle=0;
}
else if(Sx<Ex && Sy>Ey)//Dstyle=1
{
Ey=Sy+B_DelVal(Ey,Sy);//镜像
Dstyle=1;
}
else if(Sx>Ex && Sy<Ey)//交换Dstyle=1
{
Midch=Sx; Sx=Ex; Ex=Midch;
Midch=Sy; Sy=Ey; Ey=Midch;
Ey=Sy+B_DelVal(Ey,Sy);//镜像
Dstyle=1;
}
DDA_X=Sx; DDA_Y=Sy;
DelX = B_DelVal(Ex,Sx);
DelY = B_DelVal(Ey,Sy);
if(DelX > DelY)
LoopLen = DelX;
else
LoopLen = DelY;
DDA_xInc = DelX / LoopLen;
DDA_yInc = DelY / LoopLen;
Dx=B_DDARound(DDA_X) % 256;
Dy=B_DDARound(DDA_Y) % 256;
if(Dstyle)
Dy=Sy-B_DelVal(Dy,Sy);
draw_pixel(Dx % MaxHdots, Dy % MaxVdots, Color);
for(i = 0;i<=LoopLen - 1;i++)
{
DDA_X+=DDA_xInc;
DDA_Y+=DDA_yInc;
Dx=B_DDARound(DDA_X) % 256;
Dy=B_DDARound(DDA_Y) % 256;
if(Dstyle)
Dy=Sy-B_DelVal(Dy,Sy);
draw_pixel(Dx % MaxHdots, Dy % MaxVdots, Color);
}
}
}
/*
**********************************************************************
函数名: B_DrawRect
参数: 左上角起始点(Sx,Sy)
右下角座标(Ex,Ey)
填充形式(=0线框形式 ;=1填充形式)
颜色值Color(点亮=1;熄灭=0)
返回值: 无
作用: 用于在屏幕指定矩形左上角顶点处画矩形
**********************************************************************
*/
extern void B_DrawRect(uchar Sx, uchar Sy, uchar Ex, uchar Ey, bit Style, bit Color)
{
uchar Dx; //当前作图点的X坐标
uchar Dy; //当前作图点的Y坐标
uchar i,j;
uchar LoopLen, LL2;
if( Sx==Ex )//X座标重叠则画坚直线
{
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sy,Ey);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dy<Ey )
Dy++;
else
Dy--;
}
}
else if(Sy==Ey)//Y座标重叠则画水平线
{
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sx,Ex);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dx<Ex )
Dx++;
else
Dx--;
}
}
else
{
if(!Style) //线框形式
{
//画竖直边
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sy,Ey);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dy<Ey )
Dy++;
else
Dy--;
}
Dx=Ex; Dy=Sy;
LoopLen=B_DelVal(Sy,Ey);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dy<Ey )
Dy++;
else
Dy--;
}
//画水平边
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sx,Ex);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dx<Ex )
Dx++;
else
Dx--;
}
Dx=Sx; Dy=Ey;
LoopLen=B_DelVal(Sx,Ex);
for(i=0;i<=LoopLen;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dx<Ex )
Dx++;
else
Dx--;
}
}
else//填充形式
{
Dx=Sx; Dy=Sy;
LoopLen=B_DelVal(Sx,Ex);
LL2=B_DelVal(Sy,Ey);
for(j=0;j<=LoopLen;j++)
{
Dy=Sy;
for(i=0;i<=LL2;i++)
{
draw_pixel(Dx,Dy,Color);//在当前位置画点
if( Dy<Ey )
Dy++;
else
Dy--;
}
if( Dx<Ex )
Dx++;
else
Dx--;
}
}
}
}
/*
**********************************************************************
函数名: B_DrawCirc
参数: 圆心点座标(Cx,Cy)
半径Radium
填充形式Style(=0线框形式 ;=1填充形式)
显示类型Color=1显示,=0取消显示
返回值: 成功返回true (1) ; 失败返回false (0)
作用: 用于在屏幕指中心点处以半径R画圆(Bresenham法)
**********************************************************************
*/
extern void B_DrawCirc(uchar Cx, uchar Cy, uchar Radium, bit Style, bit Color)
{
uchar Dx; //当前作图点的X坐标
uchar Dy; //当前作图点的Y坐标
uchar TCx, TCy;
uchar TemRadium;
signed int TemF;
signed int TemVal;
TemVal=+1;
TCx = Cx; TCy= Cy;
TemRadium = Radium;
if(TemRadium>1)
{
Dx = 0;
Dy = TemRadium;
//起点
if(!Style)//线框模式
{
draw_pixel(Cx%MaxHdots,(Cy-Dy)%MaxVdots,Color); //在当前位置画点(第1象限)
draw_pixel((Cx-Dy)%MaxHdots, Cy%MaxVdots,Color); //在当前位置画点(第2象限)
draw_pixel(Cx%MaxHdots,(Cy+Dy)%MaxVdots,Color); //在当前位置画点(第3象限)
draw_pixel((Cx+Dy)%MaxHdots, Cy%MaxVdots,Color); //在当前位置画点(第4象限)
}
else//填充模式
{
B_DrawLine((Cx+Dx)%MaxHdots, (Cy-Dy)%MaxVdots,
(Cx+Dx)%MaxHdots, (Cy+Dy)%MaxVdots, Color);//竖直线1
B_DrawLine((Cx-Dy)%MaxHdots, (Cy-Dx)%MaxVdots,
(Cx+Dy)%MaxHdots, (Cy+Dx)%MaxVdots, Color);//水平线1
}
TemF = 1.25- TemVal*TemRadium ;
do
{
if (TemF < 0)
{
Dx+=1;
TemF =TemF+ TemVal* 2 * Dx + 1 ;
}
else
{
Dx+=1;
Dy-=1;
TemF =TemF+ TemVal* 2 * (Dx - Dy) + 1;
}
//画4象限圆
if(!Style)//线框模式
{
draw_pixel((Cx+Dx)%MaxHdots,(Cy-Dy)%MaxVdots,Color); //在当前位置画点(第1象限)
draw_pixel((Cx+Dy)%MaxHdots,(Cy-Dx)%MaxVdots,Color); //在当前位置画点(第1象限)
draw_pixel((Cx-Dx)%MaxHdots,(Cy-Dy)%MaxVdots,Color); //在当前位置画点(第2象限)
draw_pixel((Cx-Dy)%MaxHdots,(Cy-Dx)%MaxVdots,Color); //在当前位置画点(第2象限)
draw_pixel((Cx-Dx)%MaxHdots,(Cy+Dy)%MaxVdots,Color); //在当前位置画点(第3象限)
draw_pixel((Cx-Dy)%MaxHdots,(Cy+Dx)%MaxVdots,Color); //在当前位置画点(第3象限)
draw_pixel((Cx+Dx)%MaxHdots,(Cy+Dy)%MaxVdots,Color); //在当前位置画点(第4象限)
draw_pixel((Cx+Dy)%MaxHdots,(Cy+Dx)%MaxVdots,Color); //在当前位置画点(第4象限)
}
else//填充模式
{
B_DrawLine((Cx+Dx)%MaxHdots, (Cy-Dy)%MaxVdots,
(Cx+Dx)%MaxHdots, (Cy+Dy)%MaxVdots, Color);//竖直线1
B_DrawLine((Cx-Dx)%MaxHdots, (Cy-Dy)%MaxVdots,
(Cx-Dx)%MaxHdots, (Cy+Dy)%MaxVdots ,Color);//竖直线2
B_DrawLine((Cx+Dy)%MaxHdots, (Cy-Dx)%MaxVdots,
(Cx-Dy)%MaxHdots, (Cy-Dx)%MaxVdots, Color);//水平线1
B_DrawLine((Cx+Dy)%MaxHdots, (Cy+Dx)%MaxVdots,
(Cx-Dy)%MaxHdots, (Cy+Dx)%MaxVdots, Color);//水平线2
}
}while (Dx < Dy);
}
}
/*//内部静态函数
**********************************************************************
函数名: B_DelVal
参数: 无符号数A,B 范围(0-255)
返回值: 两数差值
作用: 返回两个无符号数间的差值
**********************************************************************
*/
static uchar B_DelVal(uchar A, uchar B)
{
if( A>=B)
return (A-B);
else
return (B-A);
}
/*
**********************************************************************
函数名: B_DDARound
参数: 浮点数Temval
返回值: int值
作用: 经DDA算法圆整的整数(有符号数)
**********************************************************************
*/
static int B_DDARound(float TemVal)
{
return (TemVal+0.5);
}
/*字体SMALL, 5x8 470Byte */
static code uchar SmallZiMo[94][5]={
{0x00,0x00,0xf2,0x00,0x00},/*"!",1*/
{0x00,0xe0,0x00,0xe0,0x00},/*""",2*/
{0x28,0x7c,0x28,0x7c,0x28},/*"#",3*/
{0x74,0x54,0xfe,0x54,0x74},/*"$",4*/
{0xc4,0xc8,0x10,0x26,0x46},/*"%",5*/
{0x6c,0x92,0xaa,0x44,0x0a},/*"&",6*/
{0xa0,0xc0,0x00,0x00,0x00},/*"'",7*/
{0x38,0x44,0x82,0x00,0x00},/*"(",8*/
{0x82,0x44,0x38,0x00,0x00},/*")",9*/
{0x28,0x10,0x7c,0x10,0x28},/*"*",10*/
{0x10,0x10,0x7c,0x10,0x10},/*"+",11*/
{0x07,0x06,0x06,0x00,0x00},/*",",12*/
{0x10,0x10,0x10,0x10,0x00},/*"-",13*/
{0x06,0x06,0x00,0x00,0x00},/*".",14*/
{0x04,0x08,0x10,0x20,0x40},/*"/",15*/
{0x7c,0x8a,0x92,0xa2,0x7c},/*"0",16*/
{0x00,0x42,0xfe,0x02,0x00},/*"1",17*/
{0x42,0x86,0x8a,0x92,0x62},/*"2",18*/
{0x84,0x82,0xa2,0xd2,0x8c},/*"3",19*/
{0x18,0x28,0x48,0xfe,0x08},/*"4",20*/
{0xe4,0xa2,0xa2,0xa2,0x9c},/*"5",21*/
{0x3c,0x52,0x92,0x92,0x0e},/*"6",22*///4-21MODIFY
{0x80,0x8e,0x90,0xa0,0xc0},/*"7",23*/
{0x6c,0x92,0x92,0x92,0x6c},/*"8",24*/
{0x60,0x92,0x92,0x94,0x78},/*"9",25*/
{0x00,0x6c,0x6c,0x00,0x00},/*":",26*/
{0x00,0x6a,0x6c,0x00,0x00},/*";",27*/
{0x10,0x28,0x44,0x82,0x00},/*"<",28*/
{0x28,0x28,0x28,0x28,0x28},/*"=",29*/
{0x82,0x44,0x28,0x10,0x00},/*">",30*/
{0x40,0x80,0x8a,0x90,0x60},/*"?",31*/
{0x4c,0x92,0x9e,0x82,0x7c},/*"@",32*/
{0x7e,0x88,0x88,0x88,0x7e},/*"A",33*/
{0xfe,0x92,0x92,0x92,0x6c},/*"B",34*/
{0x7e,0x82,0x82,0x82,0x44},/*"C",35*/
{0xfe,0x82,0x82,0x44,0x38},/*"D",36*/
{0xfe,0x92,0x92,0x92,0x82},/*"E",37*/
{0xfe,0x90,0x90,0x90,0x80},/*"F",38*/
{0x7c,0x82,0x92,0x92,0x5c},/*"G",39*/
{0xfe,0x10,0x10,0x10,0xfe},/*"H",40*/
{0x00,0x82,0xfe,0x82,0x00},/*"I",41*/
{0x04,0x02,0x82,0xfc,0x80},/*"J",42*/
{0xfe,0x10,0x28,0x44,0x82},/*"K",43*/
{0xfe,0x02,0x02,0x02,0x02},/*"L",44*/
{0xfe,0x40,0x30,0x40,0xfe},/*"M",45*/
{0xfe,0x20,0x10,0x08,0xfe},/*"N",46*/
{0x7c,0x82,0x82,0x82,0x7c},/*"O",47*/
{0xfe,0x90,0x90,0x90,0x60},/*"P",48*/
{0x7c,0x82,0x8a,0x84,0x7a},/*"Q",49*/
{0xfe,0x90,0x98,0x94,0x62},/*"R",50*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -