📄 lcmdriver.c
字号:
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(startx<=endx)
{
GUI_Point(startx,starty,color);
if(e>0){starty-=1;e-=dx;}
startx+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(starty>=endy)
{
GUI_Point(startx,starty,color);
if(e>0){startx+=1;e-=dy;}
starty-=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(startx>=endx)
{
GUI_Point(startx,starty,color);
if(e>0){starty+=1;e-=dx;}
startx-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(starty<=endy)
{
GUI_Point(startx,starty,color);
if(e>0){startx-=1;e-=dy;}
starty+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(startx>=endx)
{
GUI_Point(startx,starty,color);
if(e>0){starty-=1;e-=dx;}
startx-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(starty>=endy)
{
GUI_Point(startx,starty,color);
if(e>0){startx-=1;e-=dy;}
starty-=1;
e+=dx;
}
}
}
}
}
/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数: x0 水平线起点所在列的位置
* y0 水平线起点所在行的位置
* x1 水平线终点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint8 color)
{
LCD_Line(x0,y0,x1,y0,color);
}
/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint8 color)
{
LCD_Line(x0,y0,x0,y1,color);
}
void GUI_CopyColor(TCOLOR *color1,TCOLOR color2)
{
*color1=color2;
return;
}
int GUI_CmpColor(TCOLOR color1, TCOLOR color2)
{
if(color1==color2) return 1;
else return 0;
}
/**************************************************************************
** 函数名称: SetCursor
** 功能描述: 指定光标位置
**
** 输 入: x , y 光标位置 (x范围40 y的范围240)
**
** 输 出: 无
**
** 全局变量: LcmCursor_x , LcmCursor_y 光标位置
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void SetCursor(uint16 x, uint16 y)
{
LcmCursor_x = x;
LcmCursor_y = y;
}
/**********************************************************
*
* 函数名: void PutChar(char *pchar)
* 功 能: 输出单个字符
* 说 明:
* 设计人:欧阳鹏
* 设计时间:2007-5-9
* 入口参数:无
* 出口参数:无
***********************************************************/
void PutChar(char *pchar)
{
uint16 addr;
uint16 temp;
uint32 Word_qm;
uint8 *pDisp;
uint8 *p;
uint8 chardata;
uint8 i,k=0;
uint8 Out_cnt=0; //按选择的字库不同进行输出标志,区分汉字库和字符库
char c;
temp=*pchar;
c=*pchar;
if(bLcd_data == 0) //汉字判断
{
if(temp >= 0xa1) //是汉字
{
bLcd_data=temp;
Out_cnt=0;
}
else //不是汉字
{
if(temp == 0x0a) //是否换行符
{
LcmCursor_x=0;
LcmCursor_y++; //光标切换到下一行
Out_cnt=0; //不输出标志
}
else //不是换行符
{
if (LcmCursor_x>39) //如果到了行尾,换行
{
LcmCursor_x=0;
LcmCursor_y++;
}
Out_cnt=1; /*输出一次标志*/
if(bHeight==16) //字母或数字所在位置,处于0x8000~0xBFFF
p = (ZKaddr + 0x8000 +(temp << 4)); /*8*16字库指针*/
else
p = (ZKaddr + 0x9000 +(temp << 3)); /*8*8字库指针*/
}
}
}
else //显示汉字
{
/*计算汉字所在位置*/
Word_qm = bLcd_data-0xa1; //取得区码
chardata = temp-0xa1; //取得位码
Word_qm = (Word_qm*94+chardata);//得到汉字在汉字库的序列
p=(Word_qm<<5) + ZKaddr; //得到指针
Out_cnt=2; //输出两次标志
}
for(k=0;k<Out_cnt;k++) //汉字库分左右两半进行输出
{
addr=(uint16)LcmCursor_y*SCR_LINE*bHeight+LcmCursor_x;
if(gv_f2ndScreen==0)
{
pDisp=(uint8 *)LCD_ACTIVE_BUF1+addr;
}
else
{
pDisp=(uint8 *)LCD_ACTIVE_BUF2+addr;
}
for(i=0;i<bHeight;i++)
{
chardata=*p;
if (fReverse) chardata=~chardata;
p+=Out_cnt; //显示方式为从左到右
if((i>13) && fUnderline)
{
chardata=0xff;
}
*pDisp=chardata;
pDisp+=SCR_LINE; //指向下一行
}
LcmCursor_x++;
p-=31; //用于16x16汉字库中选中奇数倍的字节,即显示字符的右半面
}
if (Out_cnt==2) bLcd_data=0; //清零,显示下一个字符
if(LcmCursor_x>=40)
{
LcmCursor_x=0;
LcmCursor_y++;
}
}
/**********************************************************
*
* 函数名: void Putstr(char *pstr)
* 功 能:
* 说 明:
* 设计人:欧阳鹏
* 设计时间:2007-5-8
* 入口参数:无
* 出口参数:无
***********************************************************/
void Puts(char *pstr)
{
while(*pstr)
{
//if((fFormat==1) && ((*pstr<0x20)||(*pstr>0xfe)))
//*pstr=0x2e; //解决浮点数不能格式化输出的问题
PutChar(pstr);
pstr++;
}
//fFormat=0;
}
/**********************************************************
*
* 函数名: void Printf(char *fmt,...)
* 功 能: 格式化输出字符串
* 说 明:
* 设计人:欧阳鹏
* 设计时间:2007-5-9
* 入口参数:无
* 出口参数:无
***********************************************************/
void Printf(char *fmt,...)
{
va_list ap;
char string[256]; // 輸出字串的緩衝區,小心不要超過
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Puts(string);
va_end(ap);
}
/**************************************************************************
** 函数名称: GUI_Point
** 功能描述: 描点 坐标原点为屏幕左上角
**
** 输 入: i i=0;字体正向显示 =1 字体反向显示
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void CharReverse (uint8 i)
{
fReverse = i;
if(i>1) fReverse = 1;
}
void CharUnderline(uint8 i)
{
fUnderline = i;
if(i>1) fUnderline = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -